aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.DS_Storebin0 -> 6148 bytes
-rw-r--r--README.md139
-rw-r--r--common/pom.xml17
-rw-r--r--common/src/main/java/com/cablelabs/vcpe/common/Dbg.java24
-rw-r--r--common/target/classes/com/cablelabs/vcpe/common/Dbg.classbin0 -> 1200 bytes
-rw-r--r--common/target/common.jarbin0 -> 2690 bytes
-rw-r--r--common/target/maven-archiver/pom.properties5
-rw-r--r--common/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst1
-rw-r--r--common/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst1
-rw-r--r--cos/cosbase/pom.xml23
-rw-r--r--cos/cosbase/src/main/java/com/cablelabs/vcpe/cos/cosbase/client/CoSClient.java151
-rw-r--r--cos/cosbase/src/main/java/com/cablelabs/vcpe/cos/cosbase/model/BandwidthProfile.java27
-rw-r--r--cos/cosbase/src/main/java/com/cablelabs/vcpe/cos/cosbase/model/CoS.java86
-rw-r--r--cos/cosbase/src/main/java/com/cablelabs/vcpe/cos/cosbase/repository/CoSRespository.java22
-rw-r--r--cos/cosbase/src/main/java/com/cablelabs/vcpe/cos/cosbase/repository/CoSRespositoryInMem.java74
-rw-r--r--cos/cosbase/src/test/java/com/cablelabs/vcpe/cos/cosbase/client/CoSClientTest.java105
-rw-r--r--cos/cosbase/src/test/java/com/cablelabs/vcpe/cos/cosbase/repository/CoSRepositoryTest.java63
-rw-r--r--cos/cosbase/target/classes/com/cablelabs/vcpe/cos/cosbase/client/CoSClient$1.classbin0 -> 748 bytes
-rw-r--r--cos/cosbase/target/classes/com/cablelabs/vcpe/cos/cosbase/client/CoSClient.classbin0 -> 4135 bytes
-rw-r--r--cos/cosbase/target/classes/com/cablelabs/vcpe/cos/cosbase/model/BandwidthProfile.classbin0 -> 1338 bytes
-rw-r--r--cos/cosbase/target/classes/com/cablelabs/vcpe/cos/cosbase/model/CoS.classbin0 -> 3647 bytes
-rw-r--r--cos/cosbase/target/classes/com/cablelabs/vcpe/cos/cosbase/repository/CoSRespository.classbin0 -> 534 bytes
-rw-r--r--cos/cosbase/target/classes/com/cablelabs/vcpe/cos/cosbase/repository/CoSRespositoryInMem.classbin0 -> 3649 bytes
-rw-r--r--cos/cosbase/target/cosbase.jarbin0 -> 9554 bytes
-rw-r--r--cos/cosbase/target/maven-archiver/pom.properties5
-rw-r--r--cos/cosbase/target/test-classes/com/cablelabs/vcpe/cos/cosbase/client/CoSClientTest.classbin0 -> 2944 bytes
-rw-r--r--cos/cosbase/target/test-classes/com/cablelabs/vcpe/cos/cosbase/repository/CoSRepositoryTest.classbin0 -> 2308 bytes
-rw-r--r--cos/cosmgr/pom.xml29
-rw-r--r--cos/cosmgr/src/main/java/com/cablelabs/vcpe/cos/cosmgr/CORSResponseFilter.java25
-rw-r--r--cos/cosmgr/src/main/java/com/cablelabs/vcpe/cos/cosmgr/CoSJaxRsApplication.java18
-rw-r--r--cos/cosmgr/src/main/java/com/cablelabs/vcpe/cos/cosmgr/CoSService.java130
-rw-r--r--cos/cosmgr/src/main/webapp/WEB-INF/web.xml24
-rw-r--r--cos/cosmgr/src/main/webapp/index.jsp8
-rw-r--r--cos/cosmgr/target/classes/com/cablelabs/vcpe/cos/cosmgr/CORSResponseFilter.classbin0 -> 1384 bytes
-rw-r--r--cos/cosmgr/target/classes/com/cablelabs/vcpe/cos/cosmgr/CoSJaxRsApplication.classbin0 -> 689 bytes
-rw-r--r--cos/cosmgr/target/classes/com/cablelabs/vcpe/cos/cosmgr/CoSService$1.classbin0 -> 905 bytes
-rw-r--r--cos/cosmgr/target/classes/com/cablelabs/vcpe/cos/cosmgr/CoSService.classbin0 -> 3955 bytes
-rw-r--r--cos/cosmgr/target/cosmgr.warbin0 -> 9806641 bytes
-rw-r--r--cos/cosmgr/target/cosmgr/WEB-INF/classes/com/cablelabs/vcpe/cos/cosmgr/CORSResponseFilter.classbin0 -> 1384 bytes
-rw-r--r--cos/cosmgr/target/cosmgr/WEB-INF/classes/com/cablelabs/vcpe/cos/cosmgr/CoSJaxRsApplication.classbin0 -> 689 bytes
-rw-r--r--cos/cosmgr/target/cosmgr/WEB-INF/classes/com/cablelabs/vcpe/cos/cosmgr/CoSService$1.classbin0 -> 905 bytes
-rw-r--r--cos/cosmgr/target/cosmgr/WEB-INF/classes/com/cablelabs/vcpe/cos/cosmgr/CoSService.classbin0 -> 3955 bytes
-rw-r--r--cos/cosmgr/target/cosmgr/WEB-INF/lib/asm-all-repackaged-2.2.0-b14.jarbin0 -> 320127 bytes
-rw-r--r--cos/cosmgr/target/cosmgr/WEB-INF/lib/cglib-2.2.0-b14.jarbin0 -> 282815 bytes
-rw-r--r--cos/cosmgr/target/cosmgr/WEB-INF/lib/common-1.0-SNAPSHOT.jarbin0 -> 2690 bytes
-rw-r--r--cos/cosmgr/target/cosmgr/WEB-INF/lib/cosbase-1.0-SNAPSHOT.jarbin0 -> 9554 bytes
-rw-r--r--cos/cosmgr/target/cosmgr/WEB-INF/lib/guava-14.0.1.jarbin0 -> 2189117 bytes
-rw-r--r--cos/cosmgr/target/cosmgr/WEB-INF/lib/hk2-api-2.2.0-b14.jarbin0 -> 126233 bytes
-rw-r--r--cos/cosmgr/target/cosmgr/WEB-INF/lib/hk2-locator-2.2.0-b14.jarbin0 -> 133345 bytes
-rw-r--r--cos/cosmgr/target/cosmgr/WEB-INF/lib/hk2-utils-2.2.0-b14.jarbin0 -> 53381 bytes
-rw-r--r--cos/cosmgr/target/cosmgr/WEB-INF/lib/javax.annotation-api-1.2.jarbin0 -> 26366 bytes
-rw-r--r--cos/cosmgr/target/cosmgr/WEB-INF/lib/javax.inject-2.2.0-b14.jarbin0 -> 5987 bytes
-rw-r--r--cos/cosmgr/target/cosmgr/WEB-INF/lib/javax.ws.rs-api-2.0.jarbin0 -> 112758 bytes
-rw-r--r--cos/cosmgr/target/cosmgr/WEB-INF/lib/jersey-client-2.2.jarbin0 -> 117090 bytes
-rw-r--r--cos/cosmgr/target/cosmgr/WEB-INF/lib/jersey-common-2.2.jarbin0 -> 600514 bytes
-rw-r--r--cos/cosmgr/target/cosmgr/WEB-INF/lib/jersey-container-servlet-core-2.2.jarbin0 -> 52819 bytes
-rw-r--r--cos/cosmgr/target/cosmgr/WEB-INF/lib/jersey-media-moxy-2.2.jarbin0 -> 15591 bytes
-rw-r--r--cos/cosmgr/target/cosmgr/WEB-INF/lib/jersey-server-2.2.jarbin0 -> 801094 bytes
-rw-r--r--cos/cosmgr/target/cosmgr/WEB-INF/lib/org.eclipse.persistence.antlr-2.5.0.jarbin0 -> 189645 bytes
-rw-r--r--cos/cosmgr/target/cosmgr/WEB-INF/lib/org.eclipse.persistence.asm-2.5.0.jarbin0 -> 271208 bytes
-rw-r--r--cos/cosmgr/target/cosmgr/WEB-INF/lib/org.eclipse.persistence.core-2.5.0.jarbin0 -> 4977121 bytes
-rw-r--r--cos/cosmgr/target/cosmgr/WEB-INF/lib/org.eclipse.persistence.moxy-2.5.0.jarbin0 -> 488045 bytes
-rw-r--r--cos/cosmgr/target/cosmgr/WEB-INF/lib/osgi-resource-locator-1.0.1.jarbin0 -> 20235 bytes
-rw-r--r--cos/cosmgr/target/cosmgr/WEB-INF/lib/validation-api-1.1.0.Final.jarbin0 -> 63777 bytes
-rw-r--r--cos/cosmgr/target/cosmgr/WEB-INF/web.xml24
-rw-r--r--cos/cosmgr/target/cosmgr/index.jsp8
-rw-r--r--cos/cosmgr/target/maven-archiver/pom.properties5
-rw-r--r--cos/pom.xml24
-rw-r--r--demo-ui/README.md149
-rw-r--r--demo-ui/app/config.json32
-rw-r--r--demo-ui/app/controllers/CosController.js381
-rw-r--r--demo-ui/app/controllers/EplController.js528
-rw-r--r--demo-ui/app/controllers/MainController.js31
-rw-r--r--demo-ui/app/controllers/MefController.js117
-rw-r--r--demo-ui/app/services/cosServices.js64
-rw-r--r--demo-ui/app/services/dbg.js54
-rw-r--r--demo-ui/app/services/eplServices.js64
-rw-r--r--demo-ui/app/services/mefServices.js71
-rw-r--r--demo-ui/app/services/model.js61
-rw-r--r--demo-ui/app/views/cos-panel.html171
-rw-r--r--demo-ui/app/views/css/vcpe.css340
-rw-r--r--demo-ui/app/views/epl-panel.html187
-rw-r--r--demo-ui/app/views/less/vcpe.less365
-rw-r--r--demo-ui/app/views/mef-panel.html370
-rw-r--r--demo-ui/app/views/vcpe-portal.html71
-rw-r--r--demo-ui/bower.json11
-rw-r--r--demo-ui/gruntfile.js25
-rw-r--r--demo-ui/package.json18
-rw-r--r--demo-ui/vcpeUiServer.js19
-rwxr-xr-xdeploy.sh25
-rw-r--r--doc/dev-notes.md9
-rw-r--r--doc/sample-json.txt46
-rw-r--r--doc/state-of-code.md22
-rw-r--r--evc/evcbase/pom.xml29
-rw-r--r--evc/evcbase/src/main/java/com/cablelabs/vcpe/evc/evcbase/client/EvcClient.java149
-rw-r--r--evc/evcbase/src/main/java/com/cablelabs/vcpe/evc/evcbase/model/Evc.java235
-rw-r--r--evc/evcbase/src/main/java/com/cablelabs/vcpe/evc/evcbase/model/EvcPerformance.java102
-rw-r--r--evc/evcbase/src/main/java/com/cablelabs/vcpe/evc/evcbase/repository/EvcRespository.java21
-rw-r--r--evc/evcbase/src/main/java/com/cablelabs/vcpe/evc/evcbase/repository/EvcRespositoryInMem.java91
-rw-r--r--evc/evcbase/src/test/java/com/cablelabs/vcpe/evc/evcbase/client/EvcClientTest.java163
-rw-r--r--evc/evcbase/src/test/java/com/cablelabs/vcpe/evc/evcbase/repository/EvcRepositoryTest.java120
-rw-r--r--evc/evcbase/target/classes/com/cablelabs/vcpe/evc/evcbase/client/EvcClient$1.classbin0 -> 748 bytes
-rw-r--r--evc/evcbase/target/classes/com/cablelabs/vcpe/evc/evcbase/client/EvcClient.classbin0 -> 4135 bytes
-rw-r--r--evc/evcbase/target/classes/com/cablelabs/vcpe/evc/evcbase/model/Evc$EvcType.classbin0 -> 1548 bytes
-rw-r--r--evc/evcbase/target/classes/com/cablelabs/vcpe/evc/evcbase/model/Evc$FrameDelivery.classbin0 -> 1566 bytes
-rw-r--r--evc/evcbase/target/classes/com/cablelabs/vcpe/evc/evcbase/model/Evc.classbin0 -> 8811 bytes
-rw-r--r--evc/evcbase/target/classes/com/cablelabs/vcpe/evc/evcbase/model/EvcPerformance.classbin0 -> 3899 bytes
-rw-r--r--evc/evcbase/target/classes/com/cablelabs/vcpe/evc/evcbase/repository/EvcRespository.classbin0 -> 534 bytes
-rw-r--r--evc/evcbase/target/classes/com/cablelabs/vcpe/evc/evcbase/repository/EvcRespositoryInMem.classbin0 -> 3649 bytes
-rw-r--r--evc/evcbase/target/evcbase.jarbin0 -> 13723 bytes
-rw-r--r--evc/evcbase/target/maven-archiver/pom.properties5
-rw-r--r--evc/evcbase/target/test-classes/com/cablelabs/vcpe/evc/evcbase/client/EvcClientTest.classbin0 -> 5561 bytes
-rw-r--r--evc/evcbase/target/test-classes/com/cablelabs/vcpe/evc/evcbase/repository/EvcRepositoryTest.classbin0 -> 3935 bytes
-rw-r--r--evc/evcmgr/pom.xml39
-rw-r--r--evc/evcmgr/src/main/java/com/cablelabs/vcpe/evc/evcmgr/CORSResponseFilter.java24
-rw-r--r--evc/evcmgr/src/main/java/com/cablelabs/vcpe/evc/evcmgr/EvcJaxRsApplication.java18
-rw-r--r--evc/evcmgr/src/main/java/com/cablelabs/vcpe/evc/evcmgr/EvcService.java286
-rw-r--r--evc/evcmgr/src/main/webapp/WEB-INF/web.xml22
-rw-r--r--evc/evcmgr/src/main/webapp/index.jsp8
-rw-r--r--evc/evcmgr/target/classes/com/cablelabs/vcpe/evc/evcmgr/CORSResponseFilter.classbin0 -> 1384 bytes
-rw-r--r--evc/evcmgr/target/classes/com/cablelabs/vcpe/evc/evcmgr/EvcJaxRsApplication.classbin0 -> 689 bytes
-rw-r--r--evc/evcmgr/target/classes/com/cablelabs/vcpe/evc/evcmgr/EvcService$1.classbin0 -> 905 bytes
-rw-r--r--evc/evcmgr/target/classes/com/cablelabs/vcpe/evc/evcmgr/EvcService.classbin0 -> 9613 bytes
-rw-r--r--evc/evcmgr/target/evcmgr.warbin0 -> 9835473 bytes
-rw-r--r--evc/evcmgr/target/evcmgr/WEB-INF/classes/com/cablelabs/vcpe/evc/evcmgr/CORSResponseFilter.classbin0 -> 1384 bytes
-rw-r--r--evc/evcmgr/target/evcmgr/WEB-INF/classes/com/cablelabs/vcpe/evc/evcmgr/EvcJaxRsApplication.classbin0 -> 689 bytes
-rw-r--r--evc/evcmgr/target/evcmgr/WEB-INF/classes/com/cablelabs/vcpe/evc/evcmgr/EvcService$1.classbin0 -> 905 bytes
-rw-r--r--evc/evcmgr/target/evcmgr/WEB-INF/classes/com/cablelabs/vcpe/evc/evcmgr/EvcService.classbin0 -> 9613 bytes
-rw-r--r--evc/evcmgr/target/evcmgr/WEB-INF/lib/asm-all-repackaged-2.2.0-b14.jarbin0 -> 320127 bytes
-rw-r--r--evc/evcmgr/target/evcmgr/WEB-INF/lib/cglib-2.2.0-b14.jarbin0 -> 282815 bytes
-rw-r--r--evc/evcmgr/target/evcmgr/WEB-INF/lib/common-1.0-SNAPSHOT.jarbin0 -> 2690 bytes
-rw-r--r--evc/evcmgr/target/evcmgr/WEB-INF/lib/cosbase-1.0-SNAPSHOT.jarbin0 -> 9554 bytes
-rw-r--r--evc/evcmgr/target/evcmgr/WEB-INF/lib/evcbase-1.0-SNAPSHOT.jarbin0 -> 13723 bytes
-rw-r--r--evc/evcmgr/target/evcmgr/WEB-INF/lib/guava-14.0.1.jarbin0 -> 2189117 bytes
-rw-r--r--evc/evcmgr/target/evcmgr/WEB-INF/lib/hk2-api-2.2.0-b14.jarbin0 -> 126233 bytes
-rw-r--r--evc/evcmgr/target/evcmgr/WEB-INF/lib/hk2-locator-2.2.0-b14.jarbin0 -> 133345 bytes
-rw-r--r--evc/evcmgr/target/evcmgr/WEB-INF/lib/hk2-utils-2.2.0-b14.jarbin0 -> 53381 bytes
-rw-r--r--evc/evcmgr/target/evcmgr/WEB-INF/lib/javax.annotation-api-1.2.jarbin0 -> 26366 bytes
-rw-r--r--evc/evcmgr/target/evcmgr/WEB-INF/lib/javax.inject-2.2.0-b14.jarbin0 -> 5987 bytes
-rw-r--r--evc/evcmgr/target/evcmgr/WEB-INF/lib/javax.ws.rs-api-2.0.jarbin0 -> 112758 bytes
-rw-r--r--evc/evcmgr/target/evcmgr/WEB-INF/lib/jersey-client-2.2.jarbin0 -> 117090 bytes
-rw-r--r--evc/evcmgr/target/evcmgr/WEB-INF/lib/jersey-common-2.2.jarbin0 -> 600514 bytes
-rw-r--r--evc/evcmgr/target/evcmgr/WEB-INF/lib/jersey-container-servlet-core-2.2.jarbin0 -> 52819 bytes
-rw-r--r--evc/evcmgr/target/evcmgr/WEB-INF/lib/jersey-media-moxy-2.2.jarbin0 -> 15591 bytes
-rw-r--r--evc/evcmgr/target/evcmgr/WEB-INF/lib/jersey-server-2.2.jarbin0 -> 801094 bytes
-rw-r--r--evc/evcmgr/target/evcmgr/WEB-INF/lib/org.eclipse.persistence.antlr-2.5.0.jarbin0 -> 189645 bytes
-rw-r--r--evc/evcmgr/target/evcmgr/WEB-INF/lib/org.eclipse.persistence.asm-2.5.0.jarbin0 -> 271208 bytes
-rw-r--r--evc/evcmgr/target/evcmgr/WEB-INF/lib/org.eclipse.persistence.core-2.5.0.jarbin0 -> 4977121 bytes
-rw-r--r--evc/evcmgr/target/evcmgr/WEB-INF/lib/org.eclipse.persistence.moxy-2.5.0.jarbin0 -> 488045 bytes
-rw-r--r--evc/evcmgr/target/evcmgr/WEB-INF/lib/osgi-resource-locator-1.0.1.jarbin0 -> 20235 bytes
-rw-r--r--evc/evcmgr/target/evcmgr/WEB-INF/lib/unibase-1.0-SNAPSHOT.jarbin0 -> 18351 bytes
-rw-r--r--evc/evcmgr/target/evcmgr/WEB-INF/lib/validation-api-1.1.0.Final.jarbin0 -> 63777 bytes
-rw-r--r--evc/evcmgr/target/evcmgr/WEB-INF/web.xml22
-rw-r--r--evc/evcmgr/target/evcmgr/index.jsp8
-rw-r--r--evc/evcmgr/target/maven-archiver/pom.properties5
-rw-r--r--evc/pom.xml24
-rw-r--r--model/MEF-Classes.pngbin0 -> 268103 bytes
-rw-r--r--model/MEF-Ref-Diagrams.pngbin0 -> 1433667 bytes
-rw-r--r--model/README.md14
-rw-r--r--model/cl-mef-uml/.project11
-rw-r--r--model/cl-mef-uml/model.di2
-rw-r--r--model/cl-mef-uml/model.notation1501
-rw-r--r--model/cl-mef-uml/model.uml557
-rw-r--r--pom.xml94
-rw-r--r--svc/pom.xml30
-rw-r--r--svc/svcbase/pom.xml29
-rw-r--r--svc/svcbase/src/main/java/com/cablelabs/vcpe/svc/svcbase/client/EplClient.java149
-rw-r--r--svc/svcbase/src/main/java/com/cablelabs/vcpe/svc/svcbase/model/Epl.java104
-rw-r--r--svc/svcbase/src/main/java/com/cablelabs/vcpe/svc/svcbase/repository/EplRespository.java21
-rw-r--r--svc/svcbase/src/main/java/com/cablelabs/vcpe/svc/svcbase/repository/EplRespositoryInMem.java91
-rw-r--r--svc/svcbase/src/test/java/com/cablelabs/vcpe/svc/svcbase/client/EplClientTest.java150
-rw-r--r--svc/svcbase/src/test/java/com/cablelabs/vcpe/svc/svcbase/repository/EplRepositoryTest.java126
-rw-r--r--svc/svcbase/target/classes/com/cablelabs/vcpe/svc/svcbase/client/EplClient$1.classbin0 -> 748 bytes
-rw-r--r--svc/svcbase/target/classes/com/cablelabs/vcpe/svc/svcbase/client/EplClient.classbin0 -> 4184 bytes
-rw-r--r--svc/svcbase/target/classes/com/cablelabs/vcpe/svc/svcbase/model/Epl.classbin0 -> 4747 bytes
-rw-r--r--svc/svcbase/target/classes/com/cablelabs/vcpe/svc/svcbase/repository/EplRespository.classbin0 -> 534 bytes
-rw-r--r--svc/svcbase/target/classes/com/cablelabs/vcpe/svc/svcbase/repository/EplRespositoryInMem.classbin0 -> 3649 bytes
-rw-r--r--svc/svcbase/target/maven-archiver/pom.properties5
-rw-r--r--svc/svcbase/target/svcbase.jarbin0 -> 9200 bytes
-rw-r--r--svc/svcbase/target/test-classes/com/cablelabs/vcpe/svc/svcbase/client/EplClientTest.classbin0 -> 5005 bytes
-rw-r--r--svc/svcbase/target/test-classes/com/cablelabs/vcpe/svc/svcbase/repository/EplRepositoryTest.classbin0 -> 4317 bytes
-rw-r--r--svc/svcmgr/pom.xml33
-rw-r--r--svc/svcmgr/src/main/java/com/cablelabs/vcpe/svc/svcmgr/CORSResponseFilter.java24
-rw-r--r--svc/svcmgr/src/main/java/com/cablelabs/vcpe/svc/svcmgr/EplService.java213
-rw-r--r--svc/svcmgr/src/main/java/com/cablelabs/vcpe/svc/svcmgr/SvcJaxRsApplication.java18
-rw-r--r--svc/svcmgr/src/main/webapp/WEB-INF/web.xml22
-rw-r--r--svc/svcmgr/src/main/webapp/index.jsp8
-rw-r--r--svc/svcmgr/target/classes/com/cablelabs/vcpe/svc/svcmgr/CORSResponseFilter.classbin0 -> 1384 bytes
-rw-r--r--svc/svcmgr/target/classes/com/cablelabs/vcpe/svc/svcmgr/EplService$1.classbin0 -> 905 bytes
-rw-r--r--svc/svcmgr/target/classes/com/cablelabs/vcpe/svc/svcmgr/EplService.classbin0 -> 6265 bytes
-rw-r--r--svc/svcmgr/target/classes/com/cablelabs/vcpe/svc/svcmgr/SvcJaxRsApplication.classbin0 -> 689 bytes
-rw-r--r--svc/svcmgr/target/maven-archiver/pom.properties5
-rw-r--r--svc/svcmgr/target/svcmgr.warbin0 -> 9825987 bytes
-rw-r--r--svc/svcmgr/target/svcmgr/WEB-INF/classes/com/cablelabs/vcpe/svc/svcmgr/CORSResponseFilter.classbin0 -> 1384 bytes
-rw-r--r--svc/svcmgr/target/svcmgr/WEB-INF/classes/com/cablelabs/vcpe/svc/svcmgr/EplService$1.classbin0 -> 905 bytes
-rw-r--r--svc/svcmgr/target/svcmgr/WEB-INF/classes/com/cablelabs/vcpe/svc/svcmgr/EplService.classbin0 -> 6265 bytes
-rw-r--r--svc/svcmgr/target/svcmgr/WEB-INF/classes/com/cablelabs/vcpe/svc/svcmgr/SvcJaxRsApplication.classbin0 -> 689 bytes
-rw-r--r--svc/svcmgr/target/svcmgr/WEB-INF/lib/asm-all-repackaged-2.2.0-b14.jarbin0 -> 320127 bytes
-rw-r--r--svc/svcmgr/target/svcmgr/WEB-INF/lib/cglib-2.2.0-b14.jarbin0 -> 282815 bytes
-rw-r--r--svc/svcmgr/target/svcmgr/WEB-INF/lib/common-1.0-SNAPSHOT.jarbin0 -> 2690 bytes
-rw-r--r--svc/svcmgr/target/svcmgr/WEB-INF/lib/cosbase-1.0-SNAPSHOT.jarbin0 -> 9554 bytes
-rw-r--r--svc/svcmgr/target/svcmgr/WEB-INF/lib/evcbase-1.0-SNAPSHOT.jarbin0 -> 13723 bytes
-rw-r--r--svc/svcmgr/target/svcmgr/WEB-INF/lib/guava-14.0.1.jarbin0 -> 2189117 bytes
-rw-r--r--svc/svcmgr/target/svcmgr/WEB-INF/lib/hk2-api-2.2.0-b14.jarbin0 -> 126233 bytes
-rw-r--r--svc/svcmgr/target/svcmgr/WEB-INF/lib/hk2-locator-2.2.0-b14.jarbin0 -> 133345 bytes
-rw-r--r--svc/svcmgr/target/svcmgr/WEB-INF/lib/hk2-utils-2.2.0-b14.jarbin0 -> 53381 bytes
-rw-r--r--svc/svcmgr/target/svcmgr/WEB-INF/lib/javax.annotation-api-1.2.jarbin0 -> 26366 bytes
-rw-r--r--svc/svcmgr/target/svcmgr/WEB-INF/lib/javax.inject-2.2.0-b14.jarbin0 -> 5987 bytes
-rw-r--r--svc/svcmgr/target/svcmgr/WEB-INF/lib/javax.ws.rs-api-2.0.jarbin0 -> 112758 bytes
-rw-r--r--svc/svcmgr/target/svcmgr/WEB-INF/lib/jersey-client-2.2.jarbin0 -> 117090 bytes
-rw-r--r--svc/svcmgr/target/svcmgr/WEB-INF/lib/jersey-common-2.2.jarbin0 -> 600514 bytes
-rw-r--r--svc/svcmgr/target/svcmgr/WEB-INF/lib/jersey-container-servlet-core-2.2.jarbin0 -> 52819 bytes
-rw-r--r--svc/svcmgr/target/svcmgr/WEB-INF/lib/jersey-media-moxy-2.2.jarbin0 -> 15591 bytes
-rw-r--r--svc/svcmgr/target/svcmgr/WEB-INF/lib/jersey-server-2.2.jarbin0 -> 801094 bytes
-rw-r--r--svc/svcmgr/target/svcmgr/WEB-INF/lib/org.eclipse.persistence.antlr-2.5.0.jarbin0 -> 189645 bytes
-rw-r--r--svc/svcmgr/target/svcmgr/WEB-INF/lib/org.eclipse.persistence.asm-2.5.0.jarbin0 -> 271208 bytes
-rw-r--r--svc/svcmgr/target/svcmgr/WEB-INF/lib/org.eclipse.persistence.core-2.5.0.jarbin0 -> 4977121 bytes
-rw-r--r--svc/svcmgr/target/svcmgr/WEB-INF/lib/org.eclipse.persistence.moxy-2.5.0.jarbin0 -> 488045 bytes
-rw-r--r--svc/svcmgr/target/svcmgr/WEB-INF/lib/osgi-resource-locator-1.0.1.jarbin0 -> 20235 bytes
-rw-r--r--svc/svcmgr/target/svcmgr/WEB-INF/lib/svcbase-1.0-SNAPSHOT.jarbin0 -> 9200 bytes
-rw-r--r--svc/svcmgr/target/svcmgr/WEB-INF/lib/validation-api-1.1.0.Final.jarbin0 -> 63777 bytes
-rw-r--r--svc/svcmgr/target/svcmgr/WEB-INF/web.xml22
-rw-r--r--svc/svcmgr/target/svcmgr/index.jsp8
-rw-r--r--uni/pom.xml23
-rw-r--r--uni/unibase/pom.xml23
-rw-r--r--uni/unibase/src/main/java/com/cablelabs/vcpe/uni/unibase/client/EvcPathClient.java180
-rw-r--r--uni/unibase/src/main/java/com/cablelabs/vcpe/uni/unibase/client/UniClient.java188
-rw-r--r--uni/unibase/src/main/java/com/cablelabs/vcpe/uni/unibase/model/EvcPath.java112
-rw-r--r--uni/unibase/src/main/java/com/cablelabs/vcpe/uni/unibase/model/Uni.java230
-rw-r--r--uni/unibase/src/test/java/com/cablelabs/vcpe/uni/unibase/client/UniClientTest.java50
-rw-r--r--uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/client/EvcPathClient$1.classbin0 -> 776 bytes
-rw-r--r--uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/client/EvcPathClient.classbin0 -> 5305 bytes
-rw-r--r--uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/client/UniClient$1.classbin0 -> 748 bytes
-rw-r--r--uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/client/UniClient.classbin0 -> 5328 bytes
-rw-r--r--uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/model/EvcPath.classbin0 -> 3301 bytes
-rw-r--r--uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/model/Uni$1.classbin0 -> 1000 bytes
-rw-r--r--uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/model/Uni$MacLayer.classbin0 -> 1433 bytes
-rw-r--r--uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/model/Uni$PhysMedium.classbin0 -> 1680 bytes
-rw-r--r--uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/model/Uni$SvcSpeed.classbin0 -> 1641 bytes
-rw-r--r--uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/model/Uni$SyncMode.classbin0 -> 1501 bytes
-rw-r--r--uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/model/Uni$Type.classbin0 -> 1381 bytes
-rw-r--r--uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/model/Uni.classbin0 -> 8039 bytes
-rw-r--r--uni/unibase/target/maven-archiver/pom.properties5
-rw-r--r--uni/unibase/target/test-classes/com/cablelabs/vcpe/uni/unibase/client/UniClientTest.classbin0 -> 2949 bytes
-rw-r--r--uni/unibase/target/unibase.jarbin0 -> 18351 bytes
-rw-r--r--uni/unimgr/dbg.js84
-rw-r--r--uni/unimgr/package.json10
-rw-r--r--uni/unimgr/uniMgrEmu.js247
248 files changed, 10029 insertions, 0 deletions
diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 0000000..1d8fcc5
--- /dev/null
+++ b/.DS_Store
Binary files differ
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..c300426
--- /dev/null
+++ b/README.md
@@ -0,0 +1,139 @@
+===================
+VCPE Services Demo
+===================
+
+* There are 3 service layers in the VCPE demo, each runs independently
+ - cosmgr, evcmgr, svcmgr
+ - The build creates war files for each that are deployable on tomcat
+* Currently the code is housed in private VCPE gerrit repo:
+ http://euca-10-5-5-106.cirrus.cloud.cablelabs.com:8080/#/admin/projects/vcpe-services
+* All development and testing to date have been on OSX
+
+Environment Requirements:
+=========================
+* JDK for Java 7
+* Tomcat 8
+* Maven 3.3
+
+If you need help with environement set-up instrucitons, see "Environment Set Up" notes at the bottom of this document
+
+Building and Deploying VCPE service managers
+============================================
+Assumptions
+* You have an account on the vcpe gerrit server
+* Your environmnt has been completely set up as described at the bottom of this document
+
+ $ git clone ssh://yourusername@euca-10-5-5-106.cirrus.cloud.cablelabs.com:29418/vcpe-services
+ $ cd vcpe-services
+ $ chmod +x ./deploy.sh
+ $ ./deploy.sh
+
+* This will build cosmgr.war, evcmgr.war, and eplmgr.war, copy them to your tomcat webapps directory, and start tomcat
+* If you prefer to set up manually you can follow the following steps
+ $ cd vcpe-services
+ $ mvn clean install
+ $ cp ./cos/cosmgr/target/cosmgr.war /Library/Tomcat/webapps/.
+ $ cp ./evc/evcmgr/target/evcmgr.war /Library/Tomcat/webapps/.
+ $ cp ./svc/svcmgr/target/svcmgr.war /Library/Tomcat/webapps/.
+ $ /Library/Tomcat/bin/startup.sh
+
+* The 3 vcpe service managers are now running, and will expect/send REST calls on port 9090
+
+Running the ODL Uni Manager Emulator
+====================================
+* If you would like run the demo without running the ODL plugin, you can do so by running the unimgr emulator.
+ - This is a nodejs app that is listening for ODL specific REST calls, and when recieved, it prints the deatils of the call to the console
+* In order to run the unimgr emulator, you will need to install nodejs and npm. See "Install node/npm" in the "Environment Set Up" section at the bottom of this document for more details.
+* Before running the emulator, make sure that the ODL plugin is not running (or you will likely get a port conflict on 8181)
+* Build the runtime environement, and Start the emulator as follows:
+
+ $ cd vcpe-services/uni/unimgr
+ $ npm install (if node_modules does not exist)
+ $ node uniMgrEmu.js
+
+* Any REST calls targted to ODL will now be responded to by the ODL emulator, and logged to the console in which the emulator was started
+
+==================
+Environment Set Up
+==================
+
+Install JDK
+===========
+**OSX:**
+* Because OpenDaylight requires Java 7, all md-proto development has been against Java 7, so that all components (ODL based, and non ODL based) will be able to run on the same machine if needed
+* The md-proto development has been against JDK version 79
+ - Download installation package from here:
+ http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
+* Tomcat (and other applications) will require a JAVA_HOME environment variable. A convenient way to make sure that it is created correctly is to add the following to your .bashrc
+ - export JAVA_HOME=$(/usr/libexec/java_home)
+
+**Windows/Cygwin:**
+TBD
+
+**Linux:**
+TBD
+
+Install Tomcat
+==============
+**OSX:**
+* We are using Tomcat 8, which is the latest version that support Java7
+* Download tar.gz installation package from here
+ - https://tomcat.apache.org/download-80.cgi
+ - note: md-proto dev was against v 8.022
+
+* Assuming the tar.gz file is in your ~/Downloads folder:
+
+ $ sudo mkdir -p /usr/local (if /usr/local does not already)
+ $ cd /usr/local
+ $ sudo tar -xvf ~/Downloads/apache-tomcat-8.0.22.tar.gz (or other version)
+
+* For convenience, and to make it simpler to replace this with newer versions you can create a link /Library/Tomcat and point to the version specific tomcat directory (the instructions below assume, and the deployment script assume you have done so)
+
+ $ sudo rm -f /Library/Tomcat (if the link already exists)
+ $ sudo ln -s /usr/local/apache-tomcat-8.0.22 /Library/Tomcat
+ $ sudo chown -R -H <your_username> /Library/Tomcat
+ $ sudo chmod +x /Library/Tomcat/bin/*.sh
+
+* All of the vcpe services sent to 9090, so make sure that your /Library/Tomcat/conf/server.xml file is configured to have tomcat listen on 9090.
+
+ <Connector port="9090" protocol="HTTP/1.1"
+ connectionTimeout="20000"
+ redirectPort="8443" />
+
+**Windows/Cygwin:**
+TBD
+
+**Linux:**
+TBD
+
+Install Maven
+=============
+**OSX:**
+* Maven can be installed on OSX using brew
+ - brew is a package manager for OSX
+ - if you don’t have brew installed, do so as described here
+ http://coolestguidesontheplanet.com/installing-homebrew-os-x-yosemite-10-10-package-manager-unix-apps/
+
+* Now, install maven:
+
+ $ brew install maven
+
+**Windows/Cygwin:**
+TBD
+
+**Linux:**
+TBD
+
+
+Install node/npm
+================
+**OSX:**
+* If you plan on running the UNI ODL emluator you will need to install node/npm
+* Download and execute the Nodejs Mac OS X Installer (.pkg) from
+ https://nodejs.org/download/
+
+**Windows/Cygwin:**
+TBD
+
+**Linux:**
+TBD
diff --git a/common/pom.xml b/common/pom.xml
new file mode 100644
index 0000000..0a353d6
--- /dev/null
+++ b/common/pom.xml
@@ -0,0 +1,17 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>com.cablelabs.vcpe</groupId>
+ <artifactId>common</artifactId>
+ <packaging>jar</packaging>
+ <version>1.0-SNAPSHOT</version>
+
+ <build>
+ <finalName>common</finalName>
+ </build>
+
+ <dependencies></dependencies>
+
+</project>
diff --git a/common/src/main/java/com/cablelabs/vcpe/common/Dbg.java b/common/src/main/java/com/cablelabs/vcpe/common/Dbg.java
new file mode 100644
index 0000000..b98f1e1
--- /dev/null
+++ b/common/src/main/java/com/cablelabs/vcpe/common/Dbg.java
@@ -0,0 +1,24 @@
+package com.cablelabs.vcpe.common;
+
+/**
+ * Created by steve on 5/25/15.
+ */
+public class Dbg {
+
+ private static final String TAB = " ";
+
+
+ static public void p( String s) { p( 0, "", s);}
+ static public void p( int tabs, String s) { p( tabs, "", s);}
+ static public void p( int tabs, String pre, String s){
+ System.out.println(tab(tabs) + pre + s);
+ }
+
+ static private String tab (int tabs) {
+ String t = new String();
+ for ( int i = 0; i < tabs; i++ ) {
+ t = t + TAB;
+ }
+ return t;
+ }
+}
diff --git a/common/target/classes/com/cablelabs/vcpe/common/Dbg.class b/common/target/classes/com/cablelabs/vcpe/common/Dbg.class
new file mode 100644
index 0000000..9af32e8
--- /dev/null
+++ b/common/target/classes/com/cablelabs/vcpe/common/Dbg.class
Binary files differ
diff --git a/common/target/common.jar b/common/target/common.jar
new file mode 100644
index 0000000..267b07a
--- /dev/null
+++ b/common/target/common.jar
Binary files differ
diff --git a/common/target/maven-archiver/pom.properties b/common/target/maven-archiver/pom.properties
new file mode 100644
index 0000000..05beb19
--- /dev/null
+++ b/common/target/maven-archiver/pom.properties
@@ -0,0 +1,5 @@
+#Generated by Maven
+#Thu Aug 06 14:01:17 PDT 2015
+version=1.0-SNAPSHOT
+groupId=com.cablelabs.vcpe
+artifactId=common
diff --git a/common/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/common/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
new file mode 100644
index 0000000..4ef3036
--- /dev/null
+++ b/common/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
@@ -0,0 +1 @@
+com/cablelabs/vcpe/common/Dbg.class
diff --git a/common/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/common/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
new file mode 100644
index 0000000..72ad648
--- /dev/null
+++ b/common/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
@@ -0,0 +1 @@
+/Users/mmakati/vcpe-services/common/src/main/java/com/cablelabs/vcpe/common/Dbg.java
diff --git a/cos/cosbase/pom.xml b/cos/cosbase/pom.xml
new file mode 100644
index 0000000..6574e02
--- /dev/null
+++ b/cos/cosbase/pom.xml
@@ -0,0 +1,23 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <parent>
+ <groupId>com.cablelabs.vcpe</groupId>
+ <artifactId>cos</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ </parent>
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>com.cablelabs.vcpe</groupId>
+ <artifactId>cosbase</artifactId>
+ <packaging>jar</packaging>
+ <version>1.0-SNAPSHOT</version>
+
+ <build>
+ <finalName>cosbase</finalName>
+ </build>
+
+ <dependencies></dependencies>
+
+</project>
diff --git a/cos/cosbase/src/main/java/com/cablelabs/vcpe/cos/cosbase/client/CoSClient.java b/cos/cosbase/src/main/java/com/cablelabs/vcpe/cos/cosbase/client/CoSClient.java
new file mode 100644
index 0000000..d47b11b
--- /dev/null
+++ b/cos/cosbase/src/main/java/com/cablelabs/vcpe/cos/cosbase/client/CoSClient.java
@@ -0,0 +1,151 @@
+package com.cablelabs.vcpe.cos.cosbase.client;
+
+import com.cablelabs.vcpe.cos.cosbase.model.CoS;
+
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.util.List;
+
+/**
+ * Created by steve on 5/28/15.
+ */
+public class CoSClient {
+
+ private Client client; // provided by Jersey
+
+ public CoSClient() {
+ client = ClientBuilder.newClient();
+ }
+
+ //--------------------------------------------------------
+ public CoS create(CoS cos)
+ //--------------------------------------------------------
+ {
+ WebTarget target =client.target("http://localhost:9090/cosmgr/webapi/");
+ Response response = target.path("cos")
+ .request(MediaType.APPLICATION_JSON)
+ .post(Entity.entity(cos, MediaType.APPLICATION_JSON));
+
+ if (response.getStatus() != 200 ) // figure out how to use Status.OK
+ {
+ // in production you can be more specific based on reponse code, id, etc
+ throw new RuntimeException(response.getStatus() + ": there was an error on the server.");
+ }
+ return response.readEntity(CoS.class);
+ }
+
+ //--------------------------------------------------------
+ public CoS update(CoS cos)
+ //--------------------------------------------------------
+ {
+ WebTarget target =client.target("http://localhost:9090/cosmgr/webapi/");
+ Response response = target.path("cos/"+cos.getId())
+ .request(MediaType.APPLICATION_JSON)
+ .put(Entity.entity(cos, MediaType.APPLICATION_JSON));
+
+ if (response.getStatus() != 200 ) // figure out how to use Status.OK
+ {
+ // in production you can be more specific based on reponse code, id, etc
+ throw new RuntimeException(response.getStatus() + ": there was an error on the server.");
+ }
+ return response.readEntity(CoS.class);
+ }
+
+
+ //--------------------------------------------------------
+ public CoS get(String cosId)
+ //--------------------------------------------------------
+ // get CoS of specified ID
+ {
+ WebTarget target = client.target("http://localhost:9090/cosmgr/webapi/");
+
+ Response response = target.path("cos/"+cosId).request(MediaType.APPLICATION_JSON).get(Response.class);
+ if (response.getStatus() != 200) // figure out how to use Status.OK
+ {
+ // in production you can be more specific based on reponse code, id, etc
+ throw new RuntimeException(response.getStatus() + ": there was an error on the server.");
+ }
+
+ //return response;
+ return response.readEntity(CoS.class);
+ }
+
+ //--------------------------------------------------------
+ public List<CoS> getAll()
+ //--------------------------------------------------------
+ // get a list of all CoS instances
+ {
+
+ WebTarget target = client.target("http://localhost:9090/cosmgr/webapi/");
+
+ // Can I do this with a Response, so that I can check for errors
+ List<CoS> response = target.path("cos/list")
+ .request(MediaType.APPLICATION_JSON)
+ .get(new GenericType<List<CoS>>() {
+ });
+ if (response == null) // figure out how to use Status.OK
+ {
+ // in production you can be more specific based on reponse code, id, etc
+ throw new RuntimeException("there was an error on the server.");
+ }
+ return response;
+ }
+
+
+
+ //--------------------------------------------------------
+ public void delete(String cosId)
+ //--------------------------------------------------------
+ // delete CoS of specified ID
+ {
+ WebTarget target = client.target("http://localhost:9090/cosmgr/webapi/");
+ Response response = target.path("cos/"+cosId).request(MediaType.APPLICATION_JSON).delete();
+ if (response.getStatus() != 200) // figure out how to use Status.OK
+ {
+ // in production you can be more specific based on reponse code, id, etc
+ throw new RuntimeException(response.getStatus() + ": there was an error on the server.");
+ }
+ }
+
+ //--------------------------------------------------------
+ public CoS testGet()
+ //--------------------------------------------------------
+ // test marshaling of CoS class from server json
+ {
+ WebTarget target = client.target("http://localhost:9090/cosmgr/webapi/");
+
+ Response response = target.path("cos").request(MediaType.APPLICATION_JSON).get(Response.class);
+ if (response.getStatus() != 200) // figure out how to use Status.OK
+ {
+ // in production you can be more specific based on reponse code, id, etc
+ throw new RuntimeException(response.getStatus() + ": there was an error on the server.");
+ }
+
+ //return response;
+ return response.readEntity(CoS.class);
+ }
+
+ //--------------------------------------------------------
+ public String ping()
+ //--------------------------------------------------------
+ // test connectivity
+ {
+
+ WebTarget target = client.target("http://localhost:9090/cosmgr/webapi/");
+
+ Response response = target.path("cos").request(MediaType.TEXT_PLAIN).get();
+ if (response.getStatus() != 200) // figure out how to use Status.OK
+ {
+ // in production you can be more specific based on reponse code, id, etc
+ throw new RuntimeException(response.getStatus() + ": there was an error on the server.");
+ }
+
+
+ return response.readEntity(String.class);
+ }
+}
diff --git a/cos/cosbase/src/main/java/com/cablelabs/vcpe/cos/cosbase/model/BandwidthProfile.java b/cos/cosbase/src/main/java/com/cablelabs/vcpe/cos/cosbase/model/BandwidthProfile.java
new file mode 100644
index 0000000..70f7313
--- /dev/null
+++ b/cos/cosbase/src/main/java/com/cablelabs/vcpe/cos/cosbase/model/BandwidthProfile.java
@@ -0,0 +1,27 @@
+package com.cablelabs.vcpe.cos.cosbase.model;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * Created by steve on 5/24/15.
+ */
+
+@XmlRootElement
+public class BandwidthProfile {
+ private int committedInfoRate = 0; // MBS
+ private int committedBurtSize = 0; // MBS
+ private int excessInfoRate = 0; // MBS
+ private int excessBurstSize = 0; // MBS
+
+ public int getCommittedInfoRate() { return committedInfoRate; }
+ public void setCommittedInfoRate(int committedInfoRate) { this.committedInfoRate = committedInfoRate; }
+
+ public int getCommittedBurtSize() { return committedBurtSize; }
+ public void setCommittedBurtSize(int committedBurtSize) { this.committedBurtSize = committedBurtSize; }
+
+ public int getExcessInfoRate() { return excessInfoRate; }
+ public void setExcessInfoRate(int excessInfoRate) { this.excessInfoRate = excessInfoRate; }
+
+ public int getExcessBurstSize() { return excessBurstSize; }
+ public void setExcessBurstSize(int excessBurstSize) { this.excessBurstSize = excessBurstSize; }
+}
diff --git a/cos/cosbase/src/main/java/com/cablelabs/vcpe/cos/cosbase/model/CoS.java b/cos/cosbase/src/main/java/com/cablelabs/vcpe/cos/cosbase/model/CoS.java
new file mode 100644
index 0000000..8a4d219
--- /dev/null
+++ b/cos/cosbase/src/main/java/com/cablelabs/vcpe/cos/cosbase/model/CoS.java
@@ -0,0 +1,86 @@
+package com.cablelabs.vcpe.cos.cosbase.model;
+
+import com.cablelabs.vcpe.common.Dbg;
+
+import javax.xml.bind.annotation.XmlRootElement;
+import java.util.List;
+
+/**
+ * Created by steve on 5/24/15.
+ */
+
+@XmlRootElement
+public class CoS
+{
+ private String id;
+
+ // private BandwidthProfile ingressBWProfile;
+ // private BandwidthProfile egressBWProfile;
+ // Above should be integrated at some point
+ // ... for now we will support commitedInfoRate in Lie of BW Profiles
+ private int commitedInfoRate; // MBPS
+
+ private double availbility; // percentage
+ private double frameDelay; // milli-seconds
+ private double jitter; // milli-seconds
+ private double frameLoss; // percentage
+
+ // no argument constructor required for JAX-RS
+ public CoS() {
+ commitedInfoRate = 0;
+ availbility = 0.0;
+ frameDelay = 0.0;
+ jitter = 0.0;
+ frameLoss = 0.0;
+ }
+
+
+ public String getId() { return id; }
+ public void setId(String id) { this.id = id; }
+
+ public int getCommitedInfoRate() { return commitedInfoRate; }
+ public void setCommitedInfoRate(int commitedInfoRate) { this.commitedInfoRate = commitedInfoRate; }
+
+ public double getAvailbility() { return availbility; }
+ public void setAvailbility(double availbility) { this.availbility = availbility; }
+
+ public double getFrameDelay() { return frameDelay; }
+ public void setFrameDelay(double frameDelay) { this.frameDelay = frameDelay; }
+
+ public double getJitter() { return jitter; }
+ public void setJitter(double jitter) { this.jitter = jitter; }
+
+ public double getFrameLoss() { return frameLoss; }
+ public void setFrameLoss(double frameLoss) { this.frameLoss = frameLoss; }
+
+ public void setAllProps(String id, int commitedInfoRate, double availbility, double frameDelay, double jitter, double frameLoss)
+ {
+ this.id = id;
+ this.commitedInfoRate = commitedInfoRate;
+ this.availbility = availbility;
+ this.frameDelay = frameDelay;
+ this.jitter = jitter;
+ this.frameLoss = frameLoss;
+ }
+
+ public void dump() { dump(0); }
+ public void dump(int tab) {
+ Dbg.p(tab, "id: " + this.id);
+ Dbg.p(tab, "commInfoRate: " + this.commitedInfoRate);
+ Dbg.p(tab, "availbility: " + this.availbility);
+ Dbg.p(tab, "frameDelay: " + this.frameDelay);
+ Dbg.p(tab, "jitter: " + this.jitter);
+ Dbg.p(tab, "frameLoss: " + this.frameLoss);
+ }
+
+ public static void dumpList(List<CoS> cosList) { dumpList(0, cosList); }
+ public static void dumpList(int tab, List<CoS> cosList) {
+ int numCos = 0;
+ Dbg.p("----- CoS List : [" + cosList.size() + "] elements");
+ for (CoS curCos : cosList) {
+ numCos++;
+ Dbg.p(tab+1, "<Entry " + numCos+">");
+ curCos.dump(tab+2);
+ }
+ }
+}
diff --git a/cos/cosbase/src/main/java/com/cablelabs/vcpe/cos/cosbase/repository/CoSRespository.java b/cos/cosbase/src/main/java/com/cablelabs/vcpe/cos/cosbase/repository/CoSRespository.java
new file mode 100644
index 0000000..3a58000
--- /dev/null
+++ b/cos/cosbase/src/main/java/com/cablelabs/vcpe/cos/cosbase/repository/CoSRespository.java
@@ -0,0 +1,22 @@
+package com.cablelabs.vcpe.cos.cosbase.repository;
+
+import com.cablelabs.vcpe.cos.cosbase.model.CoS;
+
+import java.util.List;
+
+/**
+ * Created by steve on 5/25/15.
+ */
+public interface CoSRespository
+{
+ // TODO add exceptions
+
+ CoS add(CoS cos); // returns null if already exists, otherwise returns stored cos
+ CoS get(String cosId); // returns null if not found, otherwise stored cos
+ CoS update(CoS cos); // returns null if did not exit, otherwise cos as it was previous to update (put in any case)
+ CoS delete(String cosId); // returns null if not found, otherwise cos as it was previous to delete
+ int count(); // number of CoS stored in the repo
+ List<CoS> getAll();
+
+ public void dump(int tab); // print out contents of the repo
+}
diff --git a/cos/cosbase/src/main/java/com/cablelabs/vcpe/cos/cosbase/repository/CoSRespositoryInMem.java b/cos/cosbase/src/main/java/com/cablelabs/vcpe/cos/cosbase/repository/CoSRespositoryInMem.java
new file mode 100644
index 0000000..2fa44c1
--- /dev/null
+++ b/cos/cosbase/src/main/java/com/cablelabs/vcpe/cos/cosbase/repository/CoSRespositoryInMem.java
@@ -0,0 +1,74 @@
+package com.cablelabs.vcpe.cos.cosbase.repository;
+
+import com.cablelabs.vcpe.common.Dbg;
+import com.cablelabs.vcpe.cos.cosbase.model.CoS;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * Created by steve on 5/24/15.
+ */
+
+
+/*
+ Singleton that contains a hashmap which holds instances of CoS objects, indexed by CiS ID
+ */
+
+public enum CoSRespositoryInMem implements CoSRespository {
+ INSTANCE; // Singleton
+
+ private Map< String, CoS> cosDB = new ConcurrentHashMap<String, CoS>();
+
+ @Override
+ public CoS add(CoS cos) {
+ if ( this.get(cos.getId()) != null ) {
+ return null;
+ }
+ cosDB.put(cos.getId(), cos );
+ return cos;
+ }
+
+ @Override
+ public CoS get(String cosId) {
+ return cosDB.get(cosId);
+ }
+
+ @Override
+ public CoS update(CoS cos) {
+ // put returns null if cos did not exist, other returns cos as it stood prior to put
+ return cosDB.put(cos.getId(), cos);
+ }
+
+ @Override
+ public CoS delete(String cosId) {
+ // remove returns null if cos did not exist, other returns cos as it stood prior to remove
+ return cosDB.remove(cosId);
+ }
+
+ @Override
+ public List<CoS> getAll() {
+ List<CoS> cosList = new ArrayList<CoS>(cosDB.values());
+ return cosList;
+ }
+
+ @Override
+ public int count() {
+ return cosDB.size();
+ }
+
+ @Override
+ public void dump(int tab) {
+
+ Dbg.p(tab, "CoS Repo: " + cosDB.size() + " entrie(s)");
+ int numCos = 0;
+ for (CoS curCos : cosDB.values()) {
+ numCos++;
+ Dbg.p(tab+1, "<Entry " + numCos+">");
+ curCos.dump(tab+2);
+ }
+ }
+
+}
diff --git a/cos/cosbase/src/test/java/com/cablelabs/vcpe/cos/cosbase/client/CoSClientTest.java b/cos/cosbase/src/test/java/com/cablelabs/vcpe/cos/cosbase/client/CoSClientTest.java
new file mode 100644
index 0000000..cbf5516
--- /dev/null
+++ b/cos/cosbase/src/test/java/com/cablelabs/vcpe/cos/cosbase/client/CoSClientTest.java
@@ -0,0 +1,105 @@
+package com.cablelabs.vcpe.cos.cosbase.client;
+
+import com.cablelabs.vcpe.common.Dbg;
+import com.cablelabs.vcpe.cos.cosbase.model.CoS;
+import org.junit.Test;
+
+import java.util.List;
+
+import static org.junit.Assert.*;
+
+/**
+ * Created by steve on 5/28/15.
+ */
+
+public class CoSClientTest {
+
+ @Test
+ public void testAll() throws Exception {
+ CoSClient coSClient = new CoSClient();
+
+ CoS gold = new CoS();
+ gold.setAllProps("gold", 100, 0.99, 17.43, 2.43, 0.01);
+ Dbg.p("gold svc being created in CoS");
+ gold.dump(1);
+
+ gold = coSClient.create(gold);
+ assertNotNull(gold);
+
+ CoS retrievedCos = coSClient.get(gold.getId());
+
+ assertNotNull(retrievedCos);
+ Dbg.p("gold svc just retrieved from CoS");
+ retrievedCos.dump(1);
+ retrievedCos = null;
+
+ gold.setCommitedInfoRate(50);
+ Dbg.p("gold svc modified, to be updated");
+ gold.dump(1);
+ assertNotNull(coSClient.update(gold));
+ retrievedCos = coSClient.get(gold.getId());
+ assertNotNull(retrievedCos);
+ Dbg.p("gold svc modified, just retrieved from CoS");
+ retrievedCos.dump(1);
+
+ coSClient.delete(gold.getId());
+
+ CoS vid = new CoS();
+ CoS game = new CoS();
+ CoS dl = new CoS();
+
+ vid.setAllProps ("vid", 100, 0.99, 17.43, 2.43, 0.1);
+ game.setAllProps("game", 75, 0.99, 7.43, 1.43, 0.01);
+ dl.setAllProps("dl", 100, 0.99, 17.43, 2.43, 0.02);
+
+ vid = coSClient.create(vid);
+ assertNotNull(vid);
+
+ game = coSClient.create(game);
+ assertNotNull(game);
+
+ dl = coSClient.create(dl);
+ assertNotNull(dl);
+
+
+
+ List<CoS> cosList = coSClient.getAll();
+ assertNotNull(cosList);
+ assertEquals(cosList.size(), 3);
+ CoS.dumpList(cosList);
+
+ coSClient.delete(game.getId());
+ cosList = coSClient.getAll();
+ assertNotNull(cosList);
+ assertEquals(cosList.size(), 2);
+ CoS.dumpList(cosList);
+
+ coSClient.delete(vid.getId());
+ cosList = coSClient.getAll();
+ assertNotNull(cosList);
+ assertEquals(cosList.size(), 1);
+ CoS.dumpList(cosList);
+
+ coSClient.delete(dl.getId());
+ cosList = coSClient.getAll();
+ assertNotNull(cosList);
+ assertEquals(cosList.size(), 0);
+ CoS.dumpList(cosList);
+ }
+
+ @Test
+ public void testTestGet() throws Exception {
+ CoSClient coSClient = new CoSClient();
+ CoS cos = coSClient.testGet();
+ cos.dump();;
+ }
+
+ @Test
+ public void testPing() throws Exception {
+
+ CoSClient coSClient = new CoSClient();
+ String resp = coSClient.ping();
+ Dbg.p(resp);
+ }
+
+} \ No newline at end of file
diff --git a/cos/cosbase/src/test/java/com/cablelabs/vcpe/cos/cosbase/repository/CoSRepositoryTest.java b/cos/cosbase/src/test/java/com/cablelabs/vcpe/cos/cosbase/repository/CoSRepositoryTest.java
new file mode 100644
index 0000000..0c46737
--- /dev/null
+++ b/cos/cosbase/src/test/java/com/cablelabs/vcpe/cos/cosbase/repository/CoSRepositoryTest.java
@@ -0,0 +1,63 @@
+package com.cablelabs.vcpe.cos.cosbase.repository;
+
+import com.cablelabs.vcpe.cos.cosbase.model.CoS;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Created by steve on 5/25/15.
+ */
+public class CoSRepositoryTest
+{
+
+ @Test
+ public void test() {
+
+ CoS gold = new CoS();
+ CoS silver = new CoS();
+ CoS bronze = new CoS();
+
+ // id CIR/MBS avail delay jitter frameloss
+ gold.setAllProps("gold", 100, 0.99, 17.43, 2.43, 0.01);
+ silver.setAllProps("silver", 50, 0.95, 27.43, 2.43, 0.02);
+ bronze.setAllProps("bronze", 25, 0.90, 37.43, 2.43, 0.03);
+
+ CoSRespository repo = CoSRespositoryInMem.INSTANCE;
+
+ assertNotNull(repo.add(gold));
+ assertNotNull(repo.add(silver));
+ assertNotNull(repo.add(bronze));
+ assertNull(repo.add(bronze)); // duplicate
+ assertEquals(repo.count(), 3);
+
+ assertNotNull(repo.get(gold.getId()));
+ assertNotNull(repo.get(silver.getId()));
+ assertNotNull(repo.get(bronze.getId()));
+
+ assertNotNull(repo.delete(silver.getId()));
+ assertNull(repo.delete(silver.getId()));
+ assertNull(repo.delete("not-in-repo"));
+ assertEquals(repo.count(), 2);
+
+ assertEquals(repo.get(gold.getId()).getCommitedInfoRate(), 100);
+ assertNotEquals(repo.get(bronze.getId()).getCommitedInfoRate(), 100);
+
+ CoS tin = new CoS();
+ tin.setAllProps("tin", 1, 0.50, 47.43, 2.43, 0.04);
+
+
+ assertNull(repo.update(tin)); // update non-existent cos
+ assertEquals(repo.count(), 3);
+ assertEquals(repo.get("tin").getCommitedInfoRate(), 1);
+
+ tin.setCommitedInfoRate(5);
+ assertNotNull(repo.update(tin)); // update existing cos, same object
+ assertEquals(repo.get("tin").getCommitedInfoRate(), 5);
+
+ CoS tin2 = new CoS();
+ tin.setAllProps("tin", 8, 0.50, 47.43, 2.43, 0.04);
+ assertNotNull(repo.update(tin)); // update existing cos, new object
+ assertEquals(repo.get("tin").getCommitedInfoRate(), 8);
+ }
+}
diff --git a/cos/cosbase/target/classes/com/cablelabs/vcpe/cos/cosbase/client/CoSClient$1.class b/cos/cosbase/target/classes/com/cablelabs/vcpe/cos/cosbase/client/CoSClient$1.class
new file mode 100644
index 0000000..6e5c04d
--- /dev/null
+++ b/cos/cosbase/target/classes/com/cablelabs/vcpe/cos/cosbase/client/CoSClient$1.class
Binary files differ
diff --git a/cos/cosbase/target/classes/com/cablelabs/vcpe/cos/cosbase/client/CoSClient.class b/cos/cosbase/target/classes/com/cablelabs/vcpe/cos/cosbase/client/CoSClient.class
new file mode 100644
index 0000000..d20148c
--- /dev/null
+++ b/cos/cosbase/target/classes/com/cablelabs/vcpe/cos/cosbase/client/CoSClient.class
Binary files differ
diff --git a/cos/cosbase/target/classes/com/cablelabs/vcpe/cos/cosbase/model/BandwidthProfile.class b/cos/cosbase/target/classes/com/cablelabs/vcpe/cos/cosbase/model/BandwidthProfile.class
new file mode 100644
index 0000000..3e4a92d
--- /dev/null
+++ b/cos/cosbase/target/classes/com/cablelabs/vcpe/cos/cosbase/model/BandwidthProfile.class
Binary files differ
diff --git a/cos/cosbase/target/classes/com/cablelabs/vcpe/cos/cosbase/model/CoS.class b/cos/cosbase/target/classes/com/cablelabs/vcpe/cos/cosbase/model/CoS.class
new file mode 100644
index 0000000..744b89c
--- /dev/null
+++ b/cos/cosbase/target/classes/com/cablelabs/vcpe/cos/cosbase/model/CoS.class
Binary files differ
diff --git a/cos/cosbase/target/classes/com/cablelabs/vcpe/cos/cosbase/repository/CoSRespository.class b/cos/cosbase/target/classes/com/cablelabs/vcpe/cos/cosbase/repository/CoSRespository.class
new file mode 100644
index 0000000..d3b6054
--- /dev/null
+++ b/cos/cosbase/target/classes/com/cablelabs/vcpe/cos/cosbase/repository/CoSRespository.class
Binary files differ
diff --git a/cos/cosbase/target/classes/com/cablelabs/vcpe/cos/cosbase/repository/CoSRespositoryInMem.class b/cos/cosbase/target/classes/com/cablelabs/vcpe/cos/cosbase/repository/CoSRespositoryInMem.class
new file mode 100644
index 0000000..6d8f689
--- /dev/null
+++ b/cos/cosbase/target/classes/com/cablelabs/vcpe/cos/cosbase/repository/CoSRespositoryInMem.class
Binary files differ
diff --git a/cos/cosbase/target/cosbase.jar b/cos/cosbase/target/cosbase.jar
new file mode 100644
index 0000000..d991659
--- /dev/null
+++ b/cos/cosbase/target/cosbase.jar
Binary files differ
diff --git a/cos/cosbase/target/maven-archiver/pom.properties b/cos/cosbase/target/maven-archiver/pom.properties
new file mode 100644
index 0000000..0b6b211
--- /dev/null
+++ b/cos/cosbase/target/maven-archiver/pom.properties
@@ -0,0 +1,5 @@
+#Generated by Maven
+#Thu Aug 06 14:01:18 PDT 2015
+version=1.0-SNAPSHOT
+groupId=com.cablelabs.vcpe
+artifactId=cosbase
diff --git a/cos/cosbase/target/test-classes/com/cablelabs/vcpe/cos/cosbase/client/CoSClientTest.class b/cos/cosbase/target/test-classes/com/cablelabs/vcpe/cos/cosbase/client/CoSClientTest.class
new file mode 100644
index 0000000..a4c81fc
--- /dev/null
+++ b/cos/cosbase/target/test-classes/com/cablelabs/vcpe/cos/cosbase/client/CoSClientTest.class
Binary files differ
diff --git a/cos/cosbase/target/test-classes/com/cablelabs/vcpe/cos/cosbase/repository/CoSRepositoryTest.class b/cos/cosbase/target/test-classes/com/cablelabs/vcpe/cos/cosbase/repository/CoSRepositoryTest.class
new file mode 100644
index 0000000..c9f508e
--- /dev/null
+++ b/cos/cosbase/target/test-classes/com/cablelabs/vcpe/cos/cosbase/repository/CoSRepositoryTest.class
Binary files differ
diff --git a/cos/cosmgr/pom.xml b/cos/cosmgr/pom.xml
new file mode 100644
index 0000000..9245481
--- /dev/null
+++ b/cos/cosmgr/pom.xml
@@ -0,0 +1,29 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <parent>
+ <groupId>com.cablelabs.vcpe</groupId>
+ <artifactId>cos</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ </parent>
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>com.cablelabs.vcpe</groupId>
+ <artifactId>cosmgr</artifactId>
+ <packaging>war</packaging>
+ <version>1.0-SNAPSHOT</version>
+
+ <build>
+ <finalName>cosmgr</finalName>
+ </build>
+
+ <dependencies>
+ <dependency>
+ <groupId>com.cablelabs.vcpe</groupId>
+ <artifactId>cosbase</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ </dependency>
+ </dependencies>
+
+</project>
diff --git a/cos/cosmgr/src/main/java/com/cablelabs/vcpe/cos/cosmgr/CORSResponseFilter.java b/cos/cosmgr/src/main/java/com/cablelabs/vcpe/cos/cosmgr/CORSResponseFilter.java
new file mode 100644
index 0000000..50a118a
--- /dev/null
+++ b/cos/cosmgr/src/main/java/com/cablelabs/vcpe/cos/cosmgr/CORSResponseFilter.java
@@ -0,0 +1,25 @@
+package com.cablelabs.vcpe.cos.cosmgr;
+
+import java.io.IOException;
+
+import javax.ws.rs.container.ContainerRequestContext;
+import javax.ws.rs.container.ContainerResponseContext;
+import javax.ws.rs.container.ContainerResponseFilter;
+import javax.ws.rs.core.MultivaluedMap;
+
+//
+// enable cross origin responses, otherwise we can't send rest requests from domain different than that of the server hosting our service
+//
+
+public class CORSResponseFilter implements ContainerResponseFilter {
+
+ public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
+ throws IOException {
+
+ MultivaluedMap<String, Object> headers = responseContext.getHeaders();
+ headers.add("Access-Control-Allow-Origin", "*");
+ headers.add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
+ headers.add("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, X-Codingpedia");
+ }
+
+}
diff --git a/cos/cosmgr/src/main/java/com/cablelabs/vcpe/cos/cosmgr/CoSJaxRsApplication.java b/cos/cosmgr/src/main/java/com/cablelabs/vcpe/cos/cosmgr/CoSJaxRsApplication.java
new file mode 100644
index 0000000..8d9c889
--- /dev/null
+++ b/cos/cosmgr/src/main/java/com/cablelabs/vcpe/cos/cosmgr/CoSJaxRsApplication.java
@@ -0,0 +1,18 @@
+package com.cablelabs.vcpe.cos.cosmgr;
+
+import org.glassfish.jersey.server.ResourceConfig;
+
+//
+// In order to avoid CORS issues, register our CORS Response filter
+//
+
+public class CoSJaxRsApplication extends ResourceConfig {
+
+ /**
+ * Register JAX-RS application components.
+ */
+ public CoSJaxRsApplication() {
+ packages("com.cablelabs.vcpe.cos.cosmgr");
+ register(CORSResponseFilter.class);
+ }
+} \ No newline at end of file
diff --git a/cos/cosmgr/src/main/java/com/cablelabs/vcpe/cos/cosmgr/CoSService.java b/cos/cosmgr/src/main/java/com/cablelabs/vcpe/cos/cosmgr/CoSService.java
new file mode 100644
index 0000000..e9390fc
--- /dev/null
+++ b/cos/cosmgr/src/main/java/com/cablelabs/vcpe/cos/cosmgr/CoSService.java
@@ -0,0 +1,130 @@
+package com.cablelabs.vcpe.cos.cosmgr;
+
+import com.cablelabs.vcpe.common.Dbg;
+import com.cablelabs.vcpe.cos.cosbase.model.CoS;
+import com.cablelabs.vcpe.cos.cosbase.repository.CoSRespositoryInMem;
+
+import javax.ws.rs.*;
+import javax.ws.rs.core.GenericEntity;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.util.List;
+
+/**
+ * Root resource (exposed at "myresource" path)
+ */
+@Path("cos")
+public class CoSService
+{
+
+ @POST
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Produces(MediaType.APPLICATION_JSON)
+ //--------------------------------------------------------
+ public Response create(CoS cos)
+ //--------------------------------------------------------
+ {
+ if ( cos == null) {
+ return Response.status(Response.Status.BAD_REQUEST).build();
+ }
+
+ Dbg.p("\nADDING [" + cos.getId() + "] to cos repo");
+ CoSRespositoryInMem.INSTANCE.add(cos);
+ CoSRespositoryInMem.INSTANCE.dump(0);
+ return Response.ok().entity(cos).build();
+ }
+
+ @PUT
+ @Path("{cosId}")
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Produces(MediaType.APPLICATION_JSON)
+ //--------------------------------------------------------
+ public Response update(CoS cos)
+ //--------------------------------------------------------
+ {
+ Dbg.p("\nUPDATING [" + cos.getId()+"]");
+ CoSRespositoryInMem.INSTANCE.update(cos);
+ CoSRespositoryInMem.INSTANCE.dump(0);
+ return Response.ok().entity(cos).build();
+ }
+
+ @GET
+ @Produces(MediaType.APPLICATION_JSON)
+ @Path("{cosId}")
+ //--------------------------------------------------------
+ public Response get( @PathParam("cosId") String cosId )
+ //--------------------------------------------------------
+ {
+ if ( cosId == null) {
+ return Response.status(Response.Status.BAD_REQUEST).build();
+ }
+ Dbg.p("\nRETRIEVING ["+cosId+"]");
+ CoSRespositoryInMem.INSTANCE.dump(1);
+ CoS cos = CoSRespositoryInMem.INSTANCE.get(cosId);
+ if (cos == null) {
+ return Response.status(Response.Status.NOT_FOUND).build();
+ }
+ cos.dump(1);
+ return Response.ok().entity(cos).build();
+ }
+
+ @DELETE
+ @Path("{cosId}")
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Produces(MediaType.APPLICATION_JSON)
+ //--------------------------------------------------------
+ public Response delete(@PathParam("cosId") String cosId)
+ //--------------------------------------------------------
+
+ {
+ if ( cosId == null) {
+ return Response.status(Response.Status.BAD_REQUEST).build();
+ }
+ Dbg.p("\nDELETE:" + cosId);
+ CoSRespositoryInMem.INSTANCE.delete(cosId);
+ CoSRespositoryInMem.INSTANCE.dump(0);
+ return Response.ok().build();
+ }
+
+
+ @GET
+ @Path("list")
+ @Produces(MediaType.APPLICATION_JSON)
+ //--------------------------------------------------------
+ public Response cosList()
+ //--------------------------------------------------------
+ // get a list of all CoS objects
+ {
+ Dbg.p("\nCOS GET ALL:");
+ List cosList = CoSRespositoryInMem.INSTANCE.getAll();
+ if (cosList == null )
+ {
+ return Response.status(Response.Status.NOT_FOUND).build();
+ }
+ return Response.ok().entity(new GenericEntity<List<CoS>>(cosList) {}).build();
+ }
+
+ @GET
+ @Produces(MediaType.APPLICATION_JSON)
+ //--------------------------------------------------------
+ public CoS testGet()
+ //--------------------------------------------------------
+ // simple get to check out json format
+
+ {
+ CoS cos = new CoS();
+ cos.setAllProps("testGetCoS", 100, 0.99, 17.43, 2.43, 0.01);
+ return cos;
+ }
+
+ @GET
+ @Produces(MediaType.TEXT_PLAIN)
+ //--------------------------------------------------------
+ public String ping()
+ //--------------------------------------------------------
+ // simple ping to check connectivity
+ {
+ Dbg.p("In CoS Service simple get connection test server");
+ return "... pingCos reponse";
+ }
+}
diff --git a/cos/cosmgr/src/main/webapp/WEB-INF/web.xml b/cos/cosmgr/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..49cf6ad
--- /dev/null
+++ b/cos/cosmgr/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- This web.xml file is not required when using Servlet 3.0 container,
+see implementation details http://jersey.java.net/nonav/documentation/latest/jax-rs.html -->
+<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
+ <servlet>
+ <servlet-name>Jersey Web Application</servlet-name>
+ <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
+ <init-param>
+ <param-name>jersey.config.server.provider.packages</param-name>
+ <param-value>com.cablelabs.vcpe.cos</param-value>
+ </init-param>
+ <init-param>
+ <param-name>javax.ws.rs.Application</param-name>
+ <param-value>com.cablelabs.vcpe.cos.cosmgr.CoSJaxRsApplication</param-value>
+ </init-param>
+ <load-on-startup>1</load-on-startup>
+ </servlet>
+ <servlet-mapping>
+ <servlet-name>Jersey Web Application</servlet-name>
+ <url-pattern>/webapi/*</url-pattern>
+ </servlet-mapping>
+</web-app>
+
diff --git a/cos/cosmgr/src/main/webapp/index.jsp b/cos/cosmgr/src/main/webapp/index.jsp
new file mode 100644
index 0000000..a064b45
--- /dev/null
+++ b/cos/cosmgr/src/main/webapp/index.jsp
@@ -0,0 +1,8 @@
+<html>
+<body>
+ <h2>Jersey RESTful Web Application!</h2>
+ <p><a href="webapi/myresource">Jersey resource</a>
+ <p>Visit <a href="http://jersey.java.net">Project Jersey website</a>
+ for more information on Jersey!
+</body>
+</html>
diff --git a/cos/cosmgr/target/classes/com/cablelabs/vcpe/cos/cosmgr/CORSResponseFilter.class b/cos/cosmgr/target/classes/com/cablelabs/vcpe/cos/cosmgr/CORSResponseFilter.class
new file mode 100644
index 0000000..1bc8889
--- /dev/null
+++ b/cos/cosmgr/target/classes/com/cablelabs/vcpe/cos/cosmgr/CORSResponseFilter.class
Binary files differ
diff --git a/cos/cosmgr/target/classes/com/cablelabs/vcpe/cos/cosmgr/CoSJaxRsApplication.class b/cos/cosmgr/target/classes/com/cablelabs/vcpe/cos/cosmgr/CoSJaxRsApplication.class
new file mode 100644
index 0000000..ef46719
--- /dev/null
+++ b/cos/cosmgr/target/classes/com/cablelabs/vcpe/cos/cosmgr/CoSJaxRsApplication.class
Binary files differ
diff --git a/cos/cosmgr/target/classes/com/cablelabs/vcpe/cos/cosmgr/CoSService$1.class b/cos/cosmgr/target/classes/com/cablelabs/vcpe/cos/cosmgr/CoSService$1.class
new file mode 100644
index 0000000..cc9d6f7
--- /dev/null
+++ b/cos/cosmgr/target/classes/com/cablelabs/vcpe/cos/cosmgr/CoSService$1.class
Binary files differ
diff --git a/cos/cosmgr/target/classes/com/cablelabs/vcpe/cos/cosmgr/CoSService.class b/cos/cosmgr/target/classes/com/cablelabs/vcpe/cos/cosmgr/CoSService.class
new file mode 100644
index 0000000..23ee3d9
--- /dev/null
+++ b/cos/cosmgr/target/classes/com/cablelabs/vcpe/cos/cosmgr/CoSService.class
Binary files differ
diff --git a/cos/cosmgr/target/cosmgr.war b/cos/cosmgr/target/cosmgr.war
new file mode 100644
index 0000000..f10f3a5
--- /dev/null
+++ b/cos/cosmgr/target/cosmgr.war
Binary files differ
diff --git a/cos/cosmgr/target/cosmgr/WEB-INF/classes/com/cablelabs/vcpe/cos/cosmgr/CORSResponseFilter.class b/cos/cosmgr/target/cosmgr/WEB-INF/classes/com/cablelabs/vcpe/cos/cosmgr/CORSResponseFilter.class
new file mode 100644
index 0000000..1bc8889
--- /dev/null
+++ b/cos/cosmgr/target/cosmgr/WEB-INF/classes/com/cablelabs/vcpe/cos/cosmgr/CORSResponseFilter.class
Binary files differ
diff --git a/cos/cosmgr/target/cosmgr/WEB-INF/classes/com/cablelabs/vcpe/cos/cosmgr/CoSJaxRsApplication.class b/cos/cosmgr/target/cosmgr/WEB-INF/classes/com/cablelabs/vcpe/cos/cosmgr/CoSJaxRsApplication.class
new file mode 100644
index 0000000..ef46719
--- /dev/null
+++ b/cos/cosmgr/target/cosmgr/WEB-INF/classes/com/cablelabs/vcpe/cos/cosmgr/CoSJaxRsApplication.class
Binary files differ
diff --git a/cos/cosmgr/target/cosmgr/WEB-INF/classes/com/cablelabs/vcpe/cos/cosmgr/CoSService$1.class b/cos/cosmgr/target/cosmgr/WEB-INF/classes/com/cablelabs/vcpe/cos/cosmgr/CoSService$1.class
new file mode 100644
index 0000000..cc9d6f7
--- /dev/null
+++ b/cos/cosmgr/target/cosmgr/WEB-INF/classes/com/cablelabs/vcpe/cos/cosmgr/CoSService$1.class
Binary files differ
diff --git a/cos/cosmgr/target/cosmgr/WEB-INF/classes/com/cablelabs/vcpe/cos/cosmgr/CoSService.class b/cos/cosmgr/target/cosmgr/WEB-INF/classes/com/cablelabs/vcpe/cos/cosmgr/CoSService.class
new file mode 100644
index 0000000..23ee3d9
--- /dev/null
+++ b/cos/cosmgr/target/cosmgr/WEB-INF/classes/com/cablelabs/vcpe/cos/cosmgr/CoSService.class
Binary files differ
diff --git a/cos/cosmgr/target/cosmgr/WEB-INF/lib/asm-all-repackaged-2.2.0-b14.jar b/cos/cosmgr/target/cosmgr/WEB-INF/lib/asm-all-repackaged-2.2.0-b14.jar
new file mode 100644
index 0000000..9c1f40d
--- /dev/null
+++ b/cos/cosmgr/target/cosmgr/WEB-INF/lib/asm-all-repackaged-2.2.0-b14.jar
Binary files differ
diff --git a/cos/cosmgr/target/cosmgr/WEB-INF/lib/cglib-2.2.0-b14.jar b/cos/cosmgr/target/cosmgr/WEB-INF/lib/cglib-2.2.0-b14.jar
new file mode 100644
index 0000000..7d6963b
--- /dev/null
+++ b/cos/cosmgr/target/cosmgr/WEB-INF/lib/cglib-2.2.0-b14.jar
Binary files differ
diff --git a/cos/cosmgr/target/cosmgr/WEB-INF/lib/common-1.0-SNAPSHOT.jar b/cos/cosmgr/target/cosmgr/WEB-INF/lib/common-1.0-SNAPSHOT.jar
new file mode 100644
index 0000000..267b07a
--- /dev/null
+++ b/cos/cosmgr/target/cosmgr/WEB-INF/lib/common-1.0-SNAPSHOT.jar
Binary files differ
diff --git a/cos/cosmgr/target/cosmgr/WEB-INF/lib/cosbase-1.0-SNAPSHOT.jar b/cos/cosmgr/target/cosmgr/WEB-INF/lib/cosbase-1.0-SNAPSHOT.jar
new file mode 100644
index 0000000..d991659
--- /dev/null
+++ b/cos/cosmgr/target/cosmgr/WEB-INF/lib/cosbase-1.0-SNAPSHOT.jar
Binary files differ
diff --git a/cos/cosmgr/target/cosmgr/WEB-INF/lib/guava-14.0.1.jar b/cos/cosmgr/target/cosmgr/WEB-INF/lib/guava-14.0.1.jar
new file mode 100644
index 0000000..3a3d925
--- /dev/null
+++ b/cos/cosmgr/target/cosmgr/WEB-INF/lib/guava-14.0.1.jar
Binary files differ
diff --git a/cos/cosmgr/target/cosmgr/WEB-INF/lib/hk2-api-2.2.0-b14.jar b/cos/cosmgr/target/cosmgr/WEB-INF/lib/hk2-api-2.2.0-b14.jar
new file mode 100644
index 0000000..acec5bc
--- /dev/null
+++ b/cos/cosmgr/target/cosmgr/WEB-INF/lib/hk2-api-2.2.0-b14.jar
Binary files differ
diff --git a/cos/cosmgr/target/cosmgr/WEB-INF/lib/hk2-locator-2.2.0-b14.jar b/cos/cosmgr/target/cosmgr/WEB-INF/lib/hk2-locator-2.2.0-b14.jar
new file mode 100644
index 0000000..fb2687f
--- /dev/null
+++ b/cos/cosmgr/target/cosmgr/WEB-INF/lib/hk2-locator-2.2.0-b14.jar
Binary files differ
diff --git a/cos/cosmgr/target/cosmgr/WEB-INF/lib/hk2-utils-2.2.0-b14.jar b/cos/cosmgr/target/cosmgr/WEB-INF/lib/hk2-utils-2.2.0-b14.jar
new file mode 100644
index 0000000..2c8df43
--- /dev/null
+++ b/cos/cosmgr/target/cosmgr/WEB-INF/lib/hk2-utils-2.2.0-b14.jar
Binary files differ
diff --git a/cos/cosmgr/target/cosmgr/WEB-INF/lib/javax.annotation-api-1.2.jar b/cos/cosmgr/target/cosmgr/WEB-INF/lib/javax.annotation-api-1.2.jar
new file mode 100644
index 0000000..9ab39ff
--- /dev/null
+++ b/cos/cosmgr/target/cosmgr/WEB-INF/lib/javax.annotation-api-1.2.jar
Binary files differ
diff --git a/cos/cosmgr/target/cosmgr/WEB-INF/lib/javax.inject-2.2.0-b14.jar b/cos/cosmgr/target/cosmgr/WEB-INF/lib/javax.inject-2.2.0-b14.jar
new file mode 100644
index 0000000..21463e7
--- /dev/null
+++ b/cos/cosmgr/target/cosmgr/WEB-INF/lib/javax.inject-2.2.0-b14.jar
Binary files differ
diff --git a/cos/cosmgr/target/cosmgr/WEB-INF/lib/javax.ws.rs-api-2.0.jar b/cos/cosmgr/target/cosmgr/WEB-INF/lib/javax.ws.rs-api-2.0.jar
new file mode 100644
index 0000000..b7d364b
--- /dev/null
+++ b/cos/cosmgr/target/cosmgr/WEB-INF/lib/javax.ws.rs-api-2.0.jar
Binary files differ
diff --git a/cos/cosmgr/target/cosmgr/WEB-INF/lib/jersey-client-2.2.jar b/cos/cosmgr/target/cosmgr/WEB-INF/lib/jersey-client-2.2.jar
new file mode 100644
index 0000000..cab47b0
--- /dev/null
+++ b/cos/cosmgr/target/cosmgr/WEB-INF/lib/jersey-client-2.2.jar
Binary files differ
diff --git a/cos/cosmgr/target/cosmgr/WEB-INF/lib/jersey-common-2.2.jar b/cos/cosmgr/target/cosmgr/WEB-INF/lib/jersey-common-2.2.jar
new file mode 100644
index 0000000..55d27ed
--- /dev/null
+++ b/cos/cosmgr/target/cosmgr/WEB-INF/lib/jersey-common-2.2.jar
Binary files differ
diff --git a/cos/cosmgr/target/cosmgr/WEB-INF/lib/jersey-container-servlet-core-2.2.jar b/cos/cosmgr/target/cosmgr/WEB-INF/lib/jersey-container-servlet-core-2.2.jar
new file mode 100644
index 0000000..e03b5f9
--- /dev/null
+++ b/cos/cosmgr/target/cosmgr/WEB-INF/lib/jersey-container-servlet-core-2.2.jar
Binary files differ
diff --git a/cos/cosmgr/target/cosmgr/WEB-INF/lib/jersey-media-moxy-2.2.jar b/cos/cosmgr/target/cosmgr/WEB-INF/lib/jersey-media-moxy-2.2.jar
new file mode 100644
index 0000000..786290a
--- /dev/null
+++ b/cos/cosmgr/target/cosmgr/WEB-INF/lib/jersey-media-moxy-2.2.jar
Binary files differ
diff --git a/cos/cosmgr/target/cosmgr/WEB-INF/lib/jersey-server-2.2.jar b/cos/cosmgr/target/cosmgr/WEB-INF/lib/jersey-server-2.2.jar
new file mode 100644
index 0000000..37b3410
--- /dev/null
+++ b/cos/cosmgr/target/cosmgr/WEB-INF/lib/jersey-server-2.2.jar
Binary files differ
diff --git a/cos/cosmgr/target/cosmgr/WEB-INF/lib/org.eclipse.persistence.antlr-2.5.0.jar b/cos/cosmgr/target/cosmgr/WEB-INF/lib/org.eclipse.persistence.antlr-2.5.0.jar
new file mode 100644
index 0000000..cff0ef8
--- /dev/null
+++ b/cos/cosmgr/target/cosmgr/WEB-INF/lib/org.eclipse.persistence.antlr-2.5.0.jar
Binary files differ
diff --git a/cos/cosmgr/target/cosmgr/WEB-INF/lib/org.eclipse.persistence.asm-2.5.0.jar b/cos/cosmgr/target/cosmgr/WEB-INF/lib/org.eclipse.persistence.asm-2.5.0.jar
new file mode 100644
index 0000000..832e18e
--- /dev/null
+++ b/cos/cosmgr/target/cosmgr/WEB-INF/lib/org.eclipse.persistence.asm-2.5.0.jar
Binary files differ
diff --git a/cos/cosmgr/target/cosmgr/WEB-INF/lib/org.eclipse.persistence.core-2.5.0.jar b/cos/cosmgr/target/cosmgr/WEB-INF/lib/org.eclipse.persistence.core-2.5.0.jar
new file mode 100644
index 0000000..01bb838
--- /dev/null
+++ b/cos/cosmgr/target/cosmgr/WEB-INF/lib/org.eclipse.persistence.core-2.5.0.jar
Binary files differ
diff --git a/cos/cosmgr/target/cosmgr/WEB-INF/lib/org.eclipse.persistence.moxy-2.5.0.jar b/cos/cosmgr/target/cosmgr/WEB-INF/lib/org.eclipse.persistence.moxy-2.5.0.jar
new file mode 100644
index 0000000..29a1057
--- /dev/null
+++ b/cos/cosmgr/target/cosmgr/WEB-INF/lib/org.eclipse.persistence.moxy-2.5.0.jar
Binary files differ
diff --git a/cos/cosmgr/target/cosmgr/WEB-INF/lib/osgi-resource-locator-1.0.1.jar b/cos/cosmgr/target/cosmgr/WEB-INF/lib/osgi-resource-locator-1.0.1.jar
new file mode 100644
index 0000000..bd6aa17
--- /dev/null
+++ b/cos/cosmgr/target/cosmgr/WEB-INF/lib/osgi-resource-locator-1.0.1.jar
Binary files differ
diff --git a/cos/cosmgr/target/cosmgr/WEB-INF/lib/validation-api-1.1.0.Final.jar b/cos/cosmgr/target/cosmgr/WEB-INF/lib/validation-api-1.1.0.Final.jar
new file mode 100644
index 0000000..de85403
--- /dev/null
+++ b/cos/cosmgr/target/cosmgr/WEB-INF/lib/validation-api-1.1.0.Final.jar
Binary files differ
diff --git a/cos/cosmgr/target/cosmgr/WEB-INF/web.xml b/cos/cosmgr/target/cosmgr/WEB-INF/web.xml
new file mode 100644
index 0000000..49cf6ad
--- /dev/null
+++ b/cos/cosmgr/target/cosmgr/WEB-INF/web.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- This web.xml file is not required when using Servlet 3.0 container,
+see implementation details http://jersey.java.net/nonav/documentation/latest/jax-rs.html -->
+<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
+ <servlet>
+ <servlet-name>Jersey Web Application</servlet-name>
+ <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
+ <init-param>
+ <param-name>jersey.config.server.provider.packages</param-name>
+ <param-value>com.cablelabs.vcpe.cos</param-value>
+ </init-param>
+ <init-param>
+ <param-name>javax.ws.rs.Application</param-name>
+ <param-value>com.cablelabs.vcpe.cos.cosmgr.CoSJaxRsApplication</param-value>
+ </init-param>
+ <load-on-startup>1</load-on-startup>
+ </servlet>
+ <servlet-mapping>
+ <servlet-name>Jersey Web Application</servlet-name>
+ <url-pattern>/webapi/*</url-pattern>
+ </servlet-mapping>
+</web-app>
+
diff --git a/cos/cosmgr/target/cosmgr/index.jsp b/cos/cosmgr/target/cosmgr/index.jsp
new file mode 100644
index 0000000..a064b45
--- /dev/null
+++ b/cos/cosmgr/target/cosmgr/index.jsp
@@ -0,0 +1,8 @@
+<html>
+<body>
+ <h2>Jersey RESTful Web Application!</h2>
+ <p><a href="webapi/myresource">Jersey resource</a>
+ <p>Visit <a href="http://jersey.java.net">Project Jersey website</a>
+ for more information on Jersey!
+</body>
+</html>
diff --git a/cos/cosmgr/target/maven-archiver/pom.properties b/cos/cosmgr/target/maven-archiver/pom.properties
new file mode 100644
index 0000000..3ea6361
--- /dev/null
+++ b/cos/cosmgr/target/maven-archiver/pom.properties
@@ -0,0 +1,5 @@
+#Generated by Maven
+#Thu Aug 06 14:01:18 PDT 2015
+version=1.0-SNAPSHOT
+groupId=com.cablelabs.vcpe
+artifactId=cosmgr
diff --git a/cos/pom.xml b/cos/pom.xml
new file mode 100644
index 0000000..1ad3e4b
--- /dev/null
+++ b/cos/pom.xml
@@ -0,0 +1,24 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <parent>
+ <groupId>com.cablelabs.vcpe</groupId>
+ <artifactId>vcpe-services</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ </parent>
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>com.cablelabs.vcpe</groupId>
+ <artifactId>cos</artifactId>
+ <packaging>pom</packaging>
+ <version>1.0-SNAPSHOT</version>
+
+ <modules>
+ <module>cosbase</module>
+ <module>cosmgr</module>
+ </modules>
+
+ <dependencies></dependencies>
+
+</project>
diff --git a/demo-ui/README.md b/demo-ui/README.md
new file mode 100644
index 0000000..5382eef
--- /dev/null
+++ b/demo-ui/README.md
@@ -0,0 +1,149 @@
+===================================
+Virtual Business CPE Demo UI Portal
+===================================
+* This portal communicates with the vcpe service manager defined in vcpe-services repo (cosmgr, evcmgr, svcmgr)
+* It enbles the creation of Service Levels (Cos) and Eth Private Lines (EPL)
+* As part of the EPL creation, EVCs and UNIs are also created
+* Currently the code is housed in private VCPE gerrit repo:
+ http://euca-10-5-5-106.cirrus.cloud.cablelabs.com:8080/#/admin/projects/vcpe-ui
+* All development and testing have been on OSX
+* The portal currently must be run within Chrome
+
+Environment Requirements:
+=========================
+* node.js / npm
+* bower
+* grunt
+* less
+
+If you need help with environement set-up instrucitons, see "Environment Set Up" notes at the bottom of this document
+
+Building the runtime environement:
+==================================
+* Once your environemnt set up (per Environment Set Up instructions at the bottom of this document)
+
+ $ git clone http://yourusername@euca-10-5-5-106.cirrus.cloud.cablelabs.com:8080/vcpe-ui
+ $ cd vcpe-ui
+ $ npm install
+ - reads package.json to install dependencies for the vcpeUiServer.js node app
+ - dependencies are installed in ./node_modules directory
+ $ bower install
+ - reads bower.json to install dependencies for the webapp (angular,etc)
+ - dependencies are installed in ./bower_components directory
+ $ grunt
+ - reads gruntfile.js and carries out specified "build" steps
+ - in our case, we compile the .less file to .css
+
+Starting the web app
+===================
+* Start the vcpe server managers (so the app has someting to talk to)
+ - see README.md in vcpe-services repo
+* The webapp can be served by any web server. vcpeUiServer.js is a nodejs app that can be used as an easy way to serve the webapp.
+* Start the server (within the vcpe-ui directory)
+
+ $ node vcpeUiServer.js [portnum] &
+
+ NOTES:
+ - portnum is optional, and if not provided the app will be served on port 4000
+ - An issue that you may run into when you start the server is a port conflict if the server is already running from a previous session (Error: listen EADDRINUSE). To solve the issue run 'pkill node', and then start the server.
+
+* Bring up the web app
+ - To render properly, Chrome must be used (safari has an html flexbox issue, to be fixed in the future)
+ - In the chrome address bar enter the following
+
+ http://localhost:4000/app/views/vcpe-portal.html
+
+Using the web app
+===================
+* Config the app via the vcpe-ui/app/config.json file. This allows configuration of:
+ - Communications with the service managers (cosmgr, evcmgr, eplmgr)
+ - UNI's to be used for Eth Private Line creation
+* You will need to start the VCPE services (cosmgr, evcmgr, eplmgr) in order for the web app to run. Please refer to vcpe-services/README.md for instrutcioons on buiding and running these services
+* In order for the web app to work, either the vcpe ODL plugin, or the ODL emulator must be running, to handle ODL rest call sent by the UI.
+ - To run the ODL Uni Manager Emulator, please see the section "Running the ODL Uni Manager Emulator" section the vcpe-services/README.md
+ - To run the ODL plugin please see the vcpe-odl repsoitory
+* Start the app: http://localhost:4000/app/views/vcpe-portal.html
+* Two panels will be visible
+ - Service Levels (CoS in MEF Speak)
+ - Ethernet Private Lines
+* w/in each panel you can CRUD Service Levels (CoS) and Eth Private Lines (EPL)
+ - creation (+), modification (/) and delete (-)
+* Notes
+ - Service levels must be created before creating Eth Private Lines
+ - Eth private lines present drop down boxes with info as configured in config.json and created service levels
+
+Debugging the Web App
+=====================
+* The webapp provides farily extensive logging of events and issues
+* To see the logging and reported errors
+ - within the chrome menu: view/developer/developer tools
+
+To Look Behind the Scenes
+=========================
+* The web portal sends REST messages to CoS MGR, evc MGR, and epl MGR
+* Using postman (or similar tool), you can easily see a list of MEF entities that have been created w/in each of the service layers:
+ - NOTES:
+ header: Accept application/json
+ body: no body required
+ - To get list of created MEF entities (no request body required)
+ cos: GET http://localhost:9090/cosmgr/webapi/cos/list
+ evc: GET http://localhost:9090/evcmgr/webapi/evc/list
+ epl: GET http://localhost:9090/svcmgr/webapi/svc/epl/list
+
+==================
+Environment Set Up
+==================
+
+Install node/npm
+================
+**OSX:**
+* Download and execute the Nodejs Mac OS X Installer (.pkg) from
+ https://nodejs.org/download/
+
+**Windows/Cygwin:**
+TBD
+
+**Linux:**
+TBD
+
+Install Bower
+=============
+**OSX:**
+ * Bower is a web front end dependency mangament tool
+ * Once you have installed nodejs/npm, install bower as follows
+
+ $ sudo npm install -g bower
+
+**Windows/Cygwin:**
+TBD
+
+**Linux:**
+TBD
+
+Install Grunt Client
+====================
+**OSX:**
+ * Grunt is a web front end build utility
+ * Once you have installed nodejs/npm, install grunt client as follows
+
+ $ sudo npm install -g grunt-cli
+
+**Windows/Cygwin:**
+TBD
+
+**Linux:**
+TBD
+
+Install Less
+====================
+**OSX:**
+ * Less is a css enhancment environement
+ * Once you have installed nodejs/npm, install less as follows
+
+ $ sudo npm install -g less
+
+**Windows/Cygwin:**
+TBD
+
+**Linux:**
+TBD
diff --git a/demo-ui/app/config.json b/demo-ui/app/config.json
new file mode 100644
index 0000000..56c74c6
--- /dev/null
+++ b/demo-ui/app/config.json
@@ -0,0 +1,32 @@
+{
+ "cosMgr" : { "ip": "localhost", "port": "9090" },
+ "evcMgr" : { "ip": "localhost", "port": "9090" },
+ "eplMgr" : { "ip": "localhost", "port": "9090" },
+ "evcMgr" : { "ip": "localhost", "port": "9090" },
+ "uniMgr" : { "ip": "localhost", "port": "8181" },
+ "evcPathMgr": { "ip": "localhost", "port": "8181" },
+
+
+ "uniList" : [
+ {
+ "ip" : "10.1.1.11",
+ "mac" : "00:11:11:11:11:11",
+ "address" : "Denver"
+ },
+ {
+ "ip" : "10.1.1.12",
+ "mac" : "00:22:22:22:22:22",
+ "address" : "Paris"
+ },
+ {
+ "ip" : "10.1.1.13",
+ "mac" : "00:33:33:33:33:33",
+ "address" : "Tokyo"
+ },
+ {
+ "ip" : "10.1.1.14",
+ "mac" : "00:44:44:44:44:44",
+ "address" : "Quebec"
+ }
+ ]
+} \ No newline at end of file
diff --git a/demo-ui/app/controllers/CosController.js b/demo-ui/app/controllers/CosController.js
new file mode 100644
index 0000000..523f3c1
--- /dev/null
+++ b/demo-ui/app/controllers/CosController.js
@@ -0,0 +1,381 @@
+(function() {
+
+var CosController = function($scope, $http, $interval, $log, cosServices, model, dbg ) {
+
+ //
+ // Controller Set Up
+ //
+
+ dbg.p("---> in CosController()");
+
+ actionState = {
+ IDLE : 1, ADD : 2, UPDATE : 3, DEL : 4
+ }
+
+ // $scope variables
+ $scope.cosList = null;
+ $scope.selectedCosIdx = -1;
+ $scope.cosToEdit = null;
+ $scope.cosActionButtonText = "unset";
+
+ $scope.availableBWs = [
+ {
+ name : "10M",
+ cir : 10000
+ },
+ {
+ name : "100M",
+ cir : 100000
+ },
+ {
+ name : "1G",
+ cir : 1000000
+ },
+ {
+ name : "10G",
+ cir : 10000000
+ },
+ ];
+
+ dbg.p("bandwidths avaialble:")
+ dbg.pj($scope.availableBWs);
+
+ // congroller variables
+ var cosActionState = actionState.IDLE;
+ var newCos = null;
+ var uniqueId = true;
+ var nameNum = 1;
+
+
+ // cos constructor
+ var Cos = function(){
+ if ( uniqueId )
+ this.id = "new"+ nameNum;
+ else
+ this.id = "new";
+ this.commitedInfoRate = 50;
+ this.availbility = 95.5;
+ this.frameDelay = 2.2;
+ this.jitter = 3.3;
+ this.frameLoss = 4.4 ;
+ }
+
+ //
+ // utility fxns
+ //
+
+ var validCosIdx = function(idx) {
+ return ( idx >= 0 && idx < $scope.cosList.length )
+ }
+
+ var cosIdxReset = function() {
+ return ( $scope.cosList.length > 0 ? 0 : -1);
+ }
+
+ var cosIdxAfter = function( action ) {
+ switch ( action ) {
+ case actionState.DEL:
+ if ( validCosIdx($scope.selectedCosIdx) )
+ return $scope.selectedCosIdx;
+ else if ( validCosIdx($scope.selectedCosIdx-1) )
+ return $scope.selectedCosIdx-1;
+ else
+ return cosIdxReset();
+ break;
+ case actionState.ADD:
+ return ( $scope.cosList.length >= 0 ?
+ $scope.cosList.length-1 : cosIdxReset() );
+ break;
+ case actionState.UPDATE:
+ return ( validCosIdx($scope.selectedCosIdx) ?
+ $scope.selectedCosIdx : cosIdxReset() );
+ break;
+ default:
+ dbg.e("invalid action state");
+ break;
+ }
+ }
+
+ $scope.cosExists = function(cosId) {
+ var nameCheck = function (cosElm) { return cosElm.id == cosId; }
+ return ( $scope.cosList &&
+ $scope.cosList.filter(nameCheck).length > 0 );
+ }
+
+ $scope.bwText = function(cos) {
+ if (cos) {
+ switch ( cos.commitedInfoRate ) {
+ case 10000 : return "10M";
+ case 100000 : return "100M";
+ case 1000000 : return "1G";
+ case 10000000 : return "10G";
+ }
+ return "invalid BW";
+ }
+ else {
+ return "null cos";
+ }
+ }
+
+ // return index of avilable BW based cir (-1 if not found)
+ var availableBwIdx = function (cir) {
+ for ( var i = 0; i < $scope.availableBWs.length; i++ ) {
+ if ($scope.availableBWs[i].cir == cir) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ // return index of cos in current list (-1 if not found)
+ var cosNameToIdx = function ( cosName ) {
+ if ( !cosName || !$scope.cosList )
+ return -1;
+
+ for ( var i = 0; i < $scope.cosList.length; i++ ) {
+ if ($scope.cosList[i].id == cosName ) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ //
+ // HTTP Repsponse Handlers
+ //
+
+ var onRequestError = function(reason){
+ dbg.e("HTTP Request Problem\n" + JSON.stringify(reason));
+ };
+ var onCosListResp = function(data) {
+ dbg.p("in onCosListResp()");
+ $scope.cosList = data;
+
+ if ( $scope.cosList && $scope.cosList.length > 0 )
+ $scope.selectedCosIdx = 0;
+ else
+ $scope.selectedCosIdx = -1;
+
+ dbg.p("selectedCosIdx = " + $scope.selectedCosIdx,1);
+ };
+ var onCosCreateResp = function(data) {
+ dbg.p("in onCosCreateResp()");
+ dbg.p("following cos returned from create cmd", 1);
+ dbg.pj(data);
+ $scope.cosList.push(newCos);
+ $scope.selectedCosIdx = cosIdxAfter(actionState.ADD);
+ nameNum++;
+ newCos = null;
+ $scope.cosToEdit = null;
+ dbg.p("selectedCosIdx = " + $scope.selectedCosIdx,1);
+ };
+ var onCosUpdateResp = function(data) {
+ dbg.p("in onCosUpdateResp()");
+ dbg.p("following cos returned after update", 1);
+ dbg.pj(data);
+ $scope.selectedCosIdx = cosIdxAfter(actionState.UPDATE);
+ $scope.cosToEdit = null;
+ dbg.p("selectedCosIdx = " + $scope.selectedCosIdx,1);
+ };
+ var onCosDeleteResp = function(data) {
+ dbg.p("in onCosDeleteResp()");
+ dbg.p("following returned after delete", 1);
+ dbg.pj(data);
+ if ( validCosIdx($scope.selectedCosIdx) )
+ $scope.cosList.splice($scope.selectedCosIdx,1);
+ $scope.selectedCosIdx = cosIdxAfter(actionState.DEL);
+ dbg.p("selectedCosIdx = " + $scope.selectedCosIdx,1);
+ };
+
+ //
+ // CoS Event Handlers & Utils
+ //
+
+ $scope.onCosClick = function (i) {
+ dbg.p("in onCosClick(): clicked ("+i+")");
+ $scope.selectedCosIdx = i;
+ cosActionState = actionState.IDLE;
+ dbg.p("selectedCosIdx = "+ $scope.selectedCosIdx,1);
+ }
+ $scope.onAddCos = function () {
+ dbg.p("in onAddCos()");
+ cosActionState = actionState.ADD;
+ $scope.cosActionButtonText = "Create";
+ newCos = new Cos();
+ $scope.cosToEdit = newCos;
+
+ if ($scope.availableBWs.length >=3 )
+ $scope.cosToEdit.bwSelected = $scope.availableBWs[2];
+ else
+ $scope.cosToEdit.bwSelected = $scope.availableBWs[0];
+
+ dbg.pj(newCos);
+ }
+ $scope.onUpdateCos = function () {
+ dbg.p("in onUpdateCos()");
+ if ( $scope.cosList.length <= 0 )
+ {
+ dbg.p("nos CoS's exist, no action being taken");
+ return;
+ }
+ cosActionState = actionState.UPDATE;
+ $scope.cosActionButtonText = "Update";
+ $scope.cosToEdit = $scope.cosList[$scope.selectedCosIdx];
+
+ dbg.p("looking for dd list bw: " + $scope.cosToEdit.commitedInfoRate);
+ var availBwIdx = availableBwIdx($scope.cosToEdit.commitedInfoRate);
+ if ( availBwIdx < 0 || availBwIdx > $scope.availableBWs.length-1 ) {
+ dbg.e("invalid selected BW idx: "+availBwIdx+"(setting to 0)");
+ $scope.cosToEdit.bwSelected = $scope.availableBWs[0];
+ }
+ else {
+ $scope.cosToEdit.bwSelected = $scope.availableBWs[availBwIdx];
+ }
+
+ dbg.p("about to edit cos:");
+ dbg.pj($scope.cosToEdit);
+
+
+ }
+ $scope.onDelCos = function () {
+ dbg.p("in onDelCos()");
+ if ( $scope.cosList.length <= 0 )
+ {
+ dbg.p("nos CoS's exist, no action being taken");
+ return;
+ }
+ cosActionState = actionState.DEL;
+ $scope.cosActionButtonText = "Delete";
+ }
+
+ $scope.onCosInputSubmit = function () {
+ dbg.p("in onCosInputSubmit()");
+
+ var cosToOperateOn = null;
+ if ( cosActionState === actionState.ADD)
+ cosToOperateOn = newCos;
+ else
+ cosToOperateOn = $scope.cosList[$scope.selectedCosIdx];
+
+ switch(cosActionState) {
+
+ case actionState.DEL:
+ dbg.p("about to delete " + cosToOperateOn.id,1);
+ cosServices.deleteCos(cosToOperateOn)
+ .then(onCosDeleteResp, onRequestError);
+ break;
+
+ case actionState.ADD:
+ cosToOperateOn.commitedInfoRate = cosToOperateOn.bwSelected.cir;
+ delete cosToOperateOn.bwSelected;
+ dbg.p("about to add " + cosToOperateOn.id, 1);
+ cosServices.createCos(cosToOperateOn)
+ .then(onCosCreateResp, onRequestError);
+ break;
+
+ case actionState.UPDATE:
+ cosToOperateOn.commitedInfoRate = cosToOperateOn.bwSelected.cir;
+ delete cosToOperateOn.bwSelected;
+ dbg.p("about to update " + cosToOperateOn.id, 1);
+ cosServices.updateCos(cosToOperateOn)
+ .then(onCosUpdateResp, onRequestError);
+ break;
+
+ default:
+ dbg.e("invalid action state");
+ break;
+ }
+
+ cosActionState = actionState.IDLE;
+ }
+
+ //
+ // State query fxns
+ //
+
+ $scope.cosActionInProgress = function () {
+ return ( cosActionState != actionState.IDLE )
+ }
+ $scope.cosEditInProgress = function () {
+ return ( cosActionState === actionState.ADD ||
+ cosActionState === actionState.UPDATE );
+ }
+ $scope.cosUpdateInProgress = function () {
+ return ( cosActionState === actionState.UPDATE );
+ }
+ $scope.cosAddInProgress = function () {
+ return ( cosActionState === actionState.ADD );
+ }
+ $scope.cosDelInProgress = function () {
+ return ( cosActionState === actionState.DEL );
+ }
+ $scope.cosNameConflict = function () {
+ return ( $scope.cosAddInProgress() &&
+ $scope.cosExists($scope.cosToEdit.id));
+ }
+ $scope.showCosInputs = function () {
+ return $scope.cosEditInProgress();
+ }
+ $scope.showCosValues = function () {
+ return (!$scope.showCosInputs() &&
+ validCosIdx($scope.selectedCosIdx));
+ }
+ $scope.showCosNameInput = function () {
+ return $scope.cosAddInProgress();
+ }
+ $scope.showCosName = function () {
+ return (! $scope.showCosNameInput());
+ }
+ $scope.showCosActionButton = function () {
+ return ( $scope.cosAddInProgress() ||
+ ($scope.cosActionInProgress() &&
+ $scope.cosList.length > 0 ));
+ }
+ $scope.activateCosActionButton = function () {
+ return ( $scope.cosActionInProgress() &&
+ !$scope.cosNameConflict() )
+ }
+
+ //
+ // Watchers
+ //
+
+ // we can't get our initial CoS list until
+ // the URL has been set by config file read in
+ cosUrlWatcher = function () { return cosServices.getCosUrl(); }
+ onCosUrlChange = function (newCosUrl, oldCosUrl) {
+ if (newCosUrl !== oldCosUrl) {
+ dbg.p("detected cos url change, getting cos list");
+ cosServices.getCosList()
+ .then(onCosListResp, onRequestError);
+ }
+ }
+ $scope.$watch( cosUrlWatcher, onCosUrlChange );
+
+ // Watch for change in selected EPL so tht
+ // we can set the appropraite CoS as selected
+ eplWatcher = function () { return model.getCurrentEpl(); }
+ onEplChange = function (newEpl, oldEpl) {
+ dbg.p("in CosController:onEplChange");
+ //dbg.p("oldEpl:"); dbg.pj(oldEpl);
+ //dbg.p("newEpl:"); dbg.pj(newEpl);
+
+ // only make a chance if we have an
+ if ( newEpl ) {
+ var cosIdx = cosNameToIdx(newEpl.cos);
+ dbg.p("changing selected CoS to: " + newEpl.cos +
+ " [idx="+cosIdx+"]", 1);
+ if ( validCosIdx(cosIdx) ) {
+ cosActionState = actionState.IDLE
+ $scope.selectedCosIdx = cosIdx;
+ }
+ }
+ }
+ $scope.$watch( eplWatcher, onEplChange );
+
+};
+
+// register controller in the module
+app.controller("CosController", CosController);
+
+}()); \ No newline at end of file
diff --git a/demo-ui/app/controllers/EplController.js b/demo-ui/app/controllers/EplController.js
new file mode 100644
index 0000000..8dbdc90
--- /dev/null
+++ b/demo-ui/app/controllers/EplController.js
@@ -0,0 +1,528 @@
+(function() {
+
+var EplController = function($scope, $http, $interval, $log,
+ eplServices, cosServices, model, dbg ) {
+
+ //
+ // Controller Set Up
+ //
+ //
+
+ dbg.p("---> in EplController()");
+
+ actionState = {
+ IDLE : 1, ADD : 2, UPDATE : 3, DEL : 4
+ };
+
+ // $scope variables
+ $scope.eplList = [];
+ $scope.selectedEplIdx = -1;
+ $scope.eplToEdit = null;
+ $scope.eplActionButtonText = "unset";
+ $scope.availableUnis = [];
+ $scope.availableCosIds = [];
+
+ // for trouble shooting
+ $scope.availableCosIds.push("unset cos 0");
+ $scope.availableCosIds.push("unset cos 1");
+ $scope.availableCosIds.push("unset cos 2");
+
+ // controller variables
+ var _uniqueId = true;
+ var _nameNum = 1;
+ var _eplActionState = actionState.IDLE;
+ var _newEpl = null;
+
+ // start out with null until we do list query)
+ model.setCurrentEpl(null);
+
+ //
+ // utility fxns
+ //
+
+ var validEplIdx = function(idx) {
+ return ( idx >= 0 && idx < $scope.eplList.length )
+ }
+ var eplIdxReset = function() {
+ return ( $scope.eplList.length > 0 ? 0 : -1);
+ }
+ var cosIdxReset = function() {
+ return ( $scope.eplList.length > 0 ? 0 : -1);
+ }
+ var eplIdxAfter = function( action ) {
+ switch ( action ) {
+ case actionState.DEL:
+ if ( validEplIdx($scope.selectedEplIdx) )
+ return $scope.selectedEplIdx;
+ else if ( validEplIdx($scope.selectedEplIdx-1) )
+ return $scope.selectedEplIdx-1;
+ else
+ return eplIdxReset();
+ break;
+ case actionState.ADD:
+ return ( $scope.eplList.length >= 0 ?
+ $scope.eplList.length-1 : eplIdxReset() );
+ break;
+ case actionState.UPDATE:
+ return ( validEplIdx($scope.selectedEplIdx) ?
+ $scope.selectedEplIdx : eplIdxReset() );
+ break;
+ default:
+ dbg.e("invalid action state");
+ return -1;
+ break;
+ }
+ }
+ $scope.eplExists = function(eplId) {
+ var nameCheck = function (eplElm) { return eplElm.id == eplId; }
+ return ( $scope.eplList &&
+ $scope.eplList.filter(nameCheck).length > 0 );
+ }
+ var setEplUniInfo = function(epl, uniIdx1, uniIdx2) {
+
+ if ( $scope.availableUnis.length < 2 ) {
+ dbg.e("Can't set unis in constructor, avaulable uni list too short")
+ return;
+ }
+
+ epl.numCustLocations = 2;
+
+ if ( uniIdx1 < 0 || uniIdx1 > 1) {
+ epl.uniHostIpList.push($scope.availableUnis[0].ip);
+ epl.uniHostMacList.push($scope.availableUnis[0].mac);
+ epl.custAddressList.push($scope.availableUnis[0].address);
+ }
+ else {
+ epl.uniHostIpList.push($scope.availableUnis[uniIdx1].ip);
+ epl.uniHostMacList.push($scope.availableUnis[uniIdx1].mac);
+ epl.custAddressList.push($scope.availableUnis[uniIdx1].address);
+ }
+
+ if ( uniIdx2 < 0 || uniIdx2 > 1) {
+ epl.uniHostIpList.push($scope.availableUnis[0].ip);
+ epl.uniHostMacList.push($scope.availableUnis[0].mac);
+ epl.custAddressList.push($scope.availableUnis[0].address);
+ }
+ else {
+ epl.uniHostIpList.push($scope.availableUnis[uniIdx2].ip);
+ epl.uniHostMacList.push($scope.availableUnis[uniIdx2].mac);
+ epl.custAddressList.push($scope.availableUnis[uniIdx2].address);
+ }
+ }
+
+ // return index of avilable Uni based on IP (-1 if not found)
+ var availableUniIdx = function (uniIp) {
+ for ( var i = 0; i < $scope.availableUnis.length; i++ ) {
+ if ($scope.availableUnis[i].ip == uniIp) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ var updateEplWithSelectedUnis = function(epl) {
+
+ if ( epl == null || $scope.eplToEdit == null ) {
+ dbg.e("can't update EPL with UNIS, missing object");
+ return
+ }
+
+ epl.uniHostIpList = [];
+ epl.uniHostIpList.push($scope.eplToEdit.uni1Selected.ip);
+ epl.uniHostIpList.push($scope.eplToEdit.uni2Selected.ip);
+
+ epl.uniHostMacList = [];
+ epl.uniHostMacList.push($scope.eplToEdit.uni1Selected.mac);
+ epl.uniHostMacList.push($scope.eplToEdit.uni2Selected.mac);
+
+ epl.custAddressList = [];
+ epl.custAddressList.push($scope.eplToEdit.uni1Selected.address);
+ epl.custAddressList.push($scope.eplToEdit.uni2Selected.address);
+ }
+
+ //
+ // epl constructor
+ //
+
+ var Epl = function(){
+ dbg.pj("constructing EPL");
+ if ( _uniqueId )
+ this.id = "new"+ _nameNum;
+ else
+ this.id = "new";
+
+ // Don't set COS here, we have to wait until we get the latest cos list
+ this.cos = "unset";
+
+ // EVC ID set by lower layers
+ // TODO : how does evc ID cat capture at EPL layer??
+ this.evcId = "unset";
+
+ this.uniHostIpList = [];
+ this.uniHostMacList = [];
+ this.custAddressList = [];
+
+ if ( $scope.availableUnis.length >= 2 )
+ setEplUniInfo(this, 0, 1);
+ else {
+ dbg.e("can't construct EPL, not enough uni's in the available uni list");
+ return;
+ }
+
+ dbg.pj(this);
+ }
+
+ var copyReturnedEplParams = function(srcEpl, destEpl ) {
+ destEpl.evcId = srcEpl.evcId;
+ }
+
+ var setModalActiveEpl =function () {
+ if ( $scope.selectedEplIdx >= 0 &&
+ $scope.selectedEplIdx < $scope.eplList.length )
+ {
+ model.setCurrentEpl($scope.eplList[$scope.selectedEplIdx]);
+ }
+ else
+ {
+ model.setCurrentEpl(null);
+ }
+ }
+
+ //
+ // EPL HTTP Response Handlers
+ //
+
+ var onRequestError = function(reason){
+ dbg.e("HTTP Request Problem\n" + JSON.stringify(reason));
+ };
+
+ var onEplListResp = function(data) {
+ dbg.p("in onEplListResp()");
+ $scope.eplList = data;
+
+ if ( $scope.eplList && $scope.eplList.length > 0 ) {
+ $scope.selectedEplIdx = 0;
+ model.setCurrentEpl($scope.eplList[$scope.selectedEplIdx]);
+ dbg.p("selectedEplIdx/Id = "+ $scope.selectedEplIdx + "/" +
+ $scope.eplList[$scope.selectedEplIdx].id, 1);
+ }
+ else {
+ $scope.selectedEplIdx = -1;
+ model.setCurrentEpl(null);
+ dbg.p("selectedEplIdx = "+ $scope.selectedEplIdx, 1);
+ }
+ _eplActionState = actionState.IDLE;
+ };
+ var onEplCreateResp = function(returnedEpl) {
+ dbg.p("in onEplCreateResp()");
+ dbg.p("following epl returned from create cmd", 1);
+ dbg.pj(returnedEpl);
+
+ // grab entire returned Epl, since we don't know what
+ // the svcmgr may have changed on creation
+ $scope.eplList.push(returnedEpl);
+
+ // a safer alternative?
+ //copyReturnedEplParams(returnedEpl, _newEpl );
+ //$scope.eplList.push(_newEpl);
+
+ $scope.selectedEplIdx = eplIdxAfter(actionState.ADD);
+ setModalActiveEpl();
+
+ _nameNum++;
+ _newEpl = null;
+ $scope.eplToEdit = null;
+ dbg.p("selectedEplIdx = " + $scope.selectedEplIdx,1);
+ };
+ var onEplUpdateResp = function(returnedEpl) {
+ dbg.p("in onEplUpdateResp()");
+ dbg.p("following epl returned after update", 1);
+ dbg.pj(returnedEpl);
+
+ // splice in entire returned Epl, since we don't know what
+ // the svcmgr may have changed on update (esp evc)
+ $scope.eplList[$scope.selectedEplIdx] = returnedEpl;
+
+ // a safer alternative?
+ // copyReturnedEplParams(returnedEpl, eplToEdit );
+
+
+
+ $scope.selectedEplIdx = eplIdxAfter(actionState.UPDATE);
+
+ // To force a refresh
+ model.setCurrentEpl(null);
+ setModalActiveEpl();
+
+ $scope.eplToEdit = null;
+ dbg.p("selectedEplIdx = " + $scope.selectedEplIdx,1);
+ };
+ var onEplDeleteResp = function(data) {
+ dbg.p("in onEplDeleteResp()");
+ dbg.p("following returned after delete", 1);
+ dbg.pj(data);
+ if ( validEplIdx($scope.selectedEplIdx) )
+ $scope.eplList.splice($scope.selectedEplIdx,1);
+ $scope.selectedEplIdx = eplIdxAfter(actionState.DEL);
+ setModalActiveEpl();
+ dbg.p("selectedEplIdx = " + $scope.selectedEplIdx,1);
+ };
+
+ //
+ // Epl Event Handlers
+ //
+
+ $scope.onEplClick = function (i) {
+ dbg.p("in onEplClick(): clicked ("+i+")");
+ $scope.selectedEplIdx = i;
+ _eplActionState = actionState.IDLE;
+ eplToOperateOn = $scope.eplList[$scope.selectedEplIdx]
+ model.setCurrentEpl(eplToOperateOn);
+ dbg.p("selectedEplIdx/Id = "+ $scope.selectedEplIdx + "/" +
+ eplToOperateOn.id, 1);
+ }
+ $scope.onAddEpl = function () {
+ dbg.p("in onAddEpl()");
+ _eplActionState = actionState.ADD;
+ $scope.eplActionButtonText = "Create";
+
+ var updateEplToAddOnCosListResponse = function(data) {
+ dbg.p("in updateNewEplCosOnCosListResponse()", 1);
+ var cosList = data;
+
+ $scope.availableCosIds = [];
+ for ( var i = 0; i < cosList.length; i++ )
+ $scope.availableCosIds.push(cosList[i].id);
+
+ dbg.p("Avilable CoS List");
+ dbg.pj($scope.availableCosIds);
+
+ // defaults for drop down lists
+ if ( $scope.availableCosIds.length > 0 )
+ $scope.eplToEdit.cos = $scope.availableCosIds[0];
+
+ $scope.eplToEdit.uni1Selected = $scope.availableUnis[0];
+ $scope.eplToEdit.uni2Selected = $scope.availableUnis[1];
+
+ dbg.p("Newly created EPL to add after CoS list retrieved");
+ dbg.pj($scope.eplToEdit);
+ };
+
+ _newEpl = new Epl();
+ $scope.eplToEdit = _newEpl;
+
+ // need to get the current cos list before adding new EPL
+ cosServices.getCosList()
+ .then(updateEplToAddOnCosListResponse,
+ onRequestError);
+ }
+ $scope.onUpdateEpl = function () {
+ dbg.p("in onUpdateEpl()");
+ if ( $scope.eplList.length <= 0 )
+ {
+ dbg.p("nos Epl's exist, no action being taken");
+ return;
+ }
+ _eplActionState = actionState.UPDATE;
+ $scope.eplActionButtonText = "Update";
+
+ var updateEplToEditOnCosListResponse = function(data) {
+ dbg.p("in onCosListResp()");
+ var cosList = data;
+ $scope.availableCosIds = [];
+ for ( var i = 0; i < cosList.length; i++ )
+ $scope.availableCosIds.push(cosList[i].id);
+ dbg.p("Avilable CoS List");
+ dbg.pj($scope.availableCosIds);
+
+ $scope.eplToEdit = $scope.eplList[$scope.selectedEplIdx];
+
+ // TODO (if time): put below stuff in fxn since duplicated twice
+ dbg.p("looking for dd list ip: " + $scope.eplToEdit.uniHostIpList[0] );
+ var availUniIdx = availableUniIdx($scope.eplToEdit.uniHostIpList[0]);
+ if ( availUniIdx < 0 || availUniIdx > $scope.availableUnis.length-1 ) {
+ dbg.e("invalid selected uni-1 idx: "+availUniIdx+"(setting to 0)");
+ $scope.eplToEdit.uni1Selected = $scope.availableUnis[0];
+ }
+ else {
+ $scope.eplToEdit.uni1Selected = $scope.availableUnis[availUniIdx];
+ }
+
+ dbg.p("looking for dd list ip: " + $scope.eplToEdit.uniHostIpList[1] );
+ availUniIdx = availableUniIdx($scope.eplToEdit.uniHostIpList[1]);
+ if ( availUniIdx < 0 || availUniIdx > $scope.availableUnis.length-1 ) {
+ dbg.e("invalid selected uni-2 idx: "+availUniIdx+"(setting to 0)");
+ $scope.eplToEdit.uni2Selected = $scope.availableUnis[0]
+ }
+ else {
+ $scope.eplToEdit.uni2Selected = $scope.availableUnis[availUniIdx];
+ }
+
+ dbg.p("about to edit epl:");
+ dbg.pj($scope.eplToEdit);
+ };
+
+ // need to get the current cos list before editing
+ cosServices.getCosList()
+ .then(updateEplToEditOnCosListResponse,
+ onRequestError);
+ }
+
+ $scope.onDelEpl = function () {
+ dbg.p("in onDelEpl()");
+ if ( $scope.eplList.length <= 0 )
+ {
+ dbg.p("nos Epl's exist, no action being taken");
+ return;
+ }
+ _eplActionState = actionState.DEL;
+ $scope.eplActionButtonText = "Delete";
+ }
+
+ $scope.onEplInputSubmit = function () {
+ dbg.p("in onEplInputSubmit()");
+
+ var eplToOperateOn = null;
+ if ( _eplActionState === actionState.ADD)
+ eplToOperateOn = _newEpl;
+ else
+ eplToOperateOn = $scope.eplList[$scope.selectedEplIdx];
+
+ switch(_eplActionState) {
+
+ case actionState.DEL:
+
+ dbg.p("about to delete " + eplToOperateOn.id,1);
+ eplServices.deleteEpl(eplToOperateOn)
+ .then(onEplDeleteResp, onRequestError);
+ break;
+
+ case actionState.ADD:
+
+ updateEplWithSelectedUnis(eplToOperateOn);
+
+ delete $scope.eplToEdit.uni1Selected;
+ delete $scope.eplToEdit.uni2Selected;
+
+ dbg.p("about to add " + eplToOperateOn.id, 1);
+ dbg.pj(eplToOperateOn);
+ eplServices.createEpl(eplToOperateOn)
+ .then(onEplCreateResp, onRequestError);
+ break;
+
+ case actionState.UPDATE:
+
+ updateEplWithSelectedUnis(eplToOperateOn);
+
+ delete $scope.eplToEdit.uni1Selected;
+ delete $scope.eplToEdit.uni2Selected;
+
+ dbg.p("about to update " + eplToOperateOn.id, 1);
+ eplServices.updateEpl(eplToOperateOn)
+ .then(onEplUpdateResp, onRequestError);
+ break;
+
+ default:
+ dbg.e("invalid action state");
+ break;
+ }
+
+ _eplActionState = actionState.IDLE;
+ }
+
+ //
+ // State query fxns
+ //
+
+ $scope.eplActionInProgress = function () {
+ return ( _eplActionState != actionState.IDLE )
+ }
+ $scope.eplEditInProgress = function () {
+ return ( _eplActionState === actionState.ADD ||
+ _eplActionState === actionState.UPDATE );
+ }
+ $scope.eplUpdateInProgress = function () {
+ return ( _eplActionState === actionState.UPDATE );
+ }
+ $scope.eplAddInProgress = function () {
+ return ( _eplActionState === actionState.ADD );
+ }
+ $scope.eplDelInProgress = function () {
+ return ( _eplActionState === actionState.DEL );
+ }
+ $scope.cosExists = function () {
+ return ( $scope.availableCosIds &&
+ $scope.availableCosIds.length > 0 );
+ }
+ $scope.cosConflict = function () {
+ return ( $scope.eplAddInProgress() &&
+ !$scope.cosExists() );
+ }
+ $scope.eplNameConflict = function () {
+ return ( $scope.eplAddInProgress() &&
+ $scope.eplExists($scope.eplToEdit.id));
+ }
+ $scope.uniConflict = function () {
+ return ( $scope.eplToEdit &&
+ $scope.eplToEdit.uni1Selected &&
+ $scope.eplToEdit.uni2Selected &&
+ $scope.eplEditInProgress() &&
+ ( $scope.eplToEdit.uni1Selected.ip ==
+ $scope.eplToEdit.uni2Selected.ip ));
+ }
+ $scope.showEplInputs = function () {
+ return $scope.eplEditInProgress();
+ }
+ $scope.showEplValues = function () {
+ return (!$scope.showEplInputs() &&
+ validEplIdx($scope.selectedEplIdx));
+ }
+ $scope.showEplNameInput = function () {
+ return $scope.eplAddInProgress();
+ }
+ $scope.showEplName = function () {
+ return (! $scope.showEplNameInput());
+ }
+ $scope.showEplActionButton = function () {
+ return ( $scope.eplAddInProgress() ||
+ ($scope.eplActionInProgress() &&
+ $scope.eplList.length > 0 ));
+ }
+ $scope.activateEplActionButton = function () {
+ return ( $scope.eplActionInProgress() &&
+ !$scope.eplNameConflict() &&
+ !$scope.uniConflict() &&
+ !$scope.cosConflict() )
+ }
+
+ //
+ // Initial Page Set Up
+ //
+
+ eplUrlWatcher = function () { return eplServices.getEplUrl(); }
+ onEplUrlChange = function (newEplUrl, oldEplUrl) {
+ if (newEplUrl !== oldEplUrl) {
+ dbg.p("detected epl url change, getting epl list");
+ eplServices.getEplList()
+ .then(onEplListResp, onRequestError);
+ }
+ }
+ $scope.$watch( eplUrlWatcher, onEplUrlChange );
+
+
+ uniListWatcher = function () { return model.getAvailableUnis(); }
+ onUniListChange = function (newUniList, oldUniList) {
+ if (newUniList !== oldUniList) {
+ dbg.p("detected uni list change")
+ dbg.p("new avilable uni list:")
+ $scope.availableUnis = newUniList;
+ dbg.pj($scope.availableUnis);
+ }
+ }
+ $scope.$watch( uniListWatcher, onUniListChange );
+};
+
+// register controller in the module
+app.controller("EplController", EplController);
+
+}()); \ No newline at end of file
diff --git a/demo-ui/app/controllers/MainController.js b/demo-ui/app/controllers/MainController.js
new file mode 100644
index 0000000..199048b
--- /dev/null
+++ b/demo-ui/app/controllers/MainController.js
@@ -0,0 +1,31 @@
+// Create our module
+var app = angular.module("vcpe", []);
+
+(function() {
+var MainController = function($http, $log, cosServices, eplServices, mefServices, model, dbg ) {
+
+ dbg.p("---> in MainController()");
+
+ // config our app
+ var cfgFile = "../config.json";
+ $http.get(cfgFile).
+ success(function(data) {
+ dbg.p("in cfgFile read callback");
+ dbg.p("incoming data");
+ dbg.pj(data);
+ cosServices.setCosUrl(data.cosMgr);
+ eplServices.setEplUrl(data.eplMgr);
+ mefServices.setEvcUrl(data.evcMgr);
+ mefServices.setUniUrl(data.uniMgr);
+ mefServices.setEvcPathUrl(data.evcPathMgr);
+ model.setAvailableUnis(data.uniList);
+ }).
+ error(function() {
+ dbg.e("Could not read " + cfgFile);
+ });
+};
+
+// register controller in the module
+app.controller("MainController", MainController);
+
+}()); \ No newline at end of file
diff --git a/demo-ui/app/controllers/MefController.js b/demo-ui/app/controllers/MefController.js
new file mode 100644
index 0000000..9531b49
--- /dev/null
+++ b/demo-ui/app/controllers/MefController.js
@@ -0,0 +1,117 @@
+(function() {
+
+var MefController = function($scope, $log, mefServices, model, dbg ) {
+
+ //
+ // Controller Set Up
+ //
+
+ dbg.p("---> in MefController()");
+ $scope.currentEpl = null;
+ $scope.currentEplEvc = null;
+ $scope.currentEvcUnis = [];
+
+ //
+ // Utils
+ //
+
+ $scope.curEplEvcToJson = function () {
+ return angular.toJson($scope.currentEplEvc, true);
+ };
+
+
+ $scope.uniToSpeedString = function(uni) {
+ if (uni) {
+ speed = uni.uni[0].speed;
+ return Object.getOwnPropertyNames(speed)[0];s
+ }
+ else
+ return "";
+ }
+ //
+ // HTTP Response Handlers
+ //
+
+ var onRequestError = function(reason){
+ dbg.e("HTTP Request Problem\n" + JSON.stringify(reason));
+ };
+
+
+ var onUniGetResp = function(data) {
+ dbg.p("in onUniGetResp()");
+ dbg.pj(data);
+
+ // dbg.p("current EVC UNI list before adding");
+ //oSpeedString($scop dbg.pj($scope.currentEvcUnis);
+
+ $scope.currentEvcUnis.push(data);
+
+ // dbg.p("current EVC UNI list after adding");
+ // dbg.pj($scope.currentEvcUnis);
+ }
+
+ var onEvcGetResp = function(data) {
+ dbg.p("in onEvcGetResp()");
+ dbg.pj(data);
+ $scope.currentEplEvc = data;
+
+ // out with the old unis
+ $scope.currentEvcUnis = [];
+
+ // in with the new unis
+ mefServices.getUni($scope.currentEplEvc.uniIdList[0])
+ .then(onUniGetResp, onRequestError);
+ mefServices.getUni($scope.currentEplEvc.uniIdList[1])
+ .then(onUniGetResp, onRequestError);
+ };
+
+ //
+ // State query fxns
+ //
+
+ $scope.showEvcValues = function () {
+ return ( $scope.currentEplEvc != null );
+ }
+
+ $scope.showUniValues = function () {
+ return ( $scope.currentEvcUnis != null );
+ }
+
+ //
+ // Watch for change in selected EPL so tht we can
+ // update the corresponding EVC info
+ //
+
+ eplWatcher = function () { return model.getCurrentEpl(); }
+ onEplChange = function (newEpl, oldEpl) {
+ dbg.p("in MefController:onEplChange");
+ // dbg.p("oldEpl:"); dbg.pj(oldEpl);
+ // dbg.p("newEpl:"); dbg.pj(newEpl);
+
+ // only make a chance if we have a new EPL object
+ if ( newEpl ) {
+ var newEplId = newEpl.id;
+ var oldEplId = "null";
+ if (oldEpl) oldId = oldEpl.id
+
+ dbg.p("detected selected EPL change from " +
+ oldEplId + " to " + newEplId, 1);
+ $scope.currentEpl = newEpl;
+
+ // get the EVC info
+ mefServices.getEvc($scope.currentEpl.evcId)
+ .then(onEvcGetResp, onRequestError);
+ }
+ else {
+ $scope.currentEplEvc = null;
+ $scope.currentEvcUnis = null;
+ }
+
+ }
+ $scope.$watch( eplWatcher, onEplChange );
+};
+
+// register controller in the module
+app.controller("MefController", MefController);
+
+}()); \ No newline at end of file
diff --git a/demo-ui/app/services/cosServices.js b/demo-ui/app/services/cosServices.js
new file mode 100644
index 0000000..c650b6d
--- /dev/null
+++ b/demo-ui/app/services/cosServices.js
@@ -0,0 +1,64 @@
+(function(){
+
+ var cosServices = function ($http, dbg) {
+
+ var _cosBasePath = "/cosmgr/webapi/cos"
+ var _cosUrl = "unset";
+
+ var setCosUrl = function (cosMgrCfg) {
+ dbg.p("in setCosUrl");
+ _cosUrl = "http://"+cosMgrCfg.ip+":"+cosMgrCfg.port+_cosBasePath;
+ dbg.p(_cosUrl);
+ }
+
+ var getCosUrl = function () {
+ dbg.p("in getCosUrl");
+ return _cosUrl;
+ }
+
+ var getCosList = function() {
+ dbg.p("in cosServices.getCosList()",2);
+ var url = _cosUrl+ "/list;"
+ dbg.p("GET: " + url , 2);
+ return $http.get(url)
+ .then(function(response){ return response.data; });
+ };
+ var createCos = function(cos) {
+ dbg.p("in cosServices.createCos()",2)
+ var url = _cosUrl;
+ dbg.p("POST: " + url, 2);
+ dbg.pj(cos);
+ return $http.post(url, cos)
+ .then(function(response){ return response.data; });
+ };
+ var updateCos = function(cos) {
+ dbg.p("in cosServices.updateCos()",2)
+ var url = _cosUrl + "/" + cos.id;
+ dbg.p("PUT: " + url, 2);
+ dbg.pj(cos);
+ return $http.put(url, cos)
+ .then(function(response){ return response.data; });
+ };
+ var deleteCos = function(cos) {
+ dbg.p("in cosServices.deleteCos()",2)
+ var url = _cosUrl + "/" + cos.id;
+ dbg.p("DELELE: " + url, 2);
+ dbg.pj(cos);
+ return $http.delete(url)
+ .then(function(response){ return response.data; });
+ };
+
+ return { // public API
+ setCosUrl : setCosUrl,
+ getCosUrl : getCosUrl,
+ createCos : createCos,
+ getCosList : getCosList,
+ deleteCos : deleteCos,
+ updateCos : updateCos
+ };
+ };
+
+ var module = angular.module("vcpe");
+ module.factory("cosServices", cosServices);
+
+}()); \ No newline at end of file
diff --git a/demo-ui/app/services/dbg.js b/demo-ui/app/services/dbg.js
new file mode 100644
index 0000000..1e12523
--- /dev/null
+++ b/demo-ui/app/services/dbg.js
@@ -0,0 +1,54 @@
+(function(){
+
+ var dbg = function ($log) {
+
+ var dbgFlag = true;
+
+ var on = function() { dbgFlag = true; };
+ var off = function() { dbgFlag = false; };
+
+ var p = function(str, tab, emphasize) {
+ if ( dbgFlag )
+ {
+ var tabStr = "";
+ if (tab) {
+ for (var i = 0; i < tab; i++ )
+ tabStr += " ";
+ }
+ var preStr = "... " + tabStr;
+ var postStr = "";
+ if ( emphasize ) {
+ preStr = tabStr + "####################### ";
+ postStr = " ####################### ";
+ }
+ $log.info(preStr + str + postStr);
+ }
+ };
+
+ var pj = function(obj) {
+ if ( dbgFlag )
+ $log.info(JSON.stringify(obj,null,3))
+ };
+
+ var e = function(eMsg) {
+ $log.error("!! ERROR: " + eMsg);
+ }
+
+ var w = function(eMsg) {
+ $log.warn("!! WARNIING: " + eMsg);
+ }
+
+ return { // Public API
+ on : on, // squelch DBG printing
+ off : off, // enable DBG printing
+ p : p, // print a debug string
+ pj : pj, // print JSON version of an object
+ w : w, // print an warning msg
+ e : e // print an error msg
+ };
+ };
+
+ var module = angular.module("vcpe");
+ module.factory("dbg", dbg);
+
+}()); \ No newline at end of file
diff --git a/demo-ui/app/services/eplServices.js b/demo-ui/app/services/eplServices.js
new file mode 100644
index 0000000..20fb7af
--- /dev/null
+++ b/demo-ui/app/services/eplServices.js
@@ -0,0 +1,64 @@
+(function(){
+
+ var eplServices = function ($http, dbg) {
+
+ var _eplBasePath = "/svcmgr/webapi/svc/epl"
+ var _eplUrl = "unset";
+
+ var setEplUrl = function (eplMgrCfg) {
+ dbg.p("in setEplUrl");
+ _eplUrl = "http://"+eplMgrCfg.ip+":"+eplMgrCfg.port+_eplBasePath;
+ dbg.p(_eplUrl);
+ }
+
+ var getEplUrl = function () {
+ dbg.p("in setEplUrl");
+ return _eplUrl;
+ }
+
+ var getEplList = function() {
+ dbg.p("in eplServices.getEplList()",2);
+ var url = _eplUrl+ "/list;"
+ dbg.p("GET: " + url , 2);
+ return $http.get(url)
+ .then(function(response){ return response.data; });
+ };
+ var createEpl = function(epl) {
+ dbg.p("in eplServices.createEpl()",2)
+ var url = _eplUrl;
+ dbg.p("POST: " + url, 2);
+ dbg.pj(epl);
+ return $http.post(url, epl)
+ .then(function(response){ return response.data; });
+ };
+ var updateEpl = function(epl) {
+ dbg.p("in eplServices.updateEpl()",2)
+ var url = _eplUrl + "/" + epl.id;
+ dbg.p("PUT: " + url, 2);
+ dbg.pj(epl);
+ return $http.put(url, epl)
+ .then(function(response){ return response.data; });
+ };
+ var deleteEpl = function(epl) {
+ dbg.p("in eplServices.deleteEpl()",2)
+ var url = _eplUrl + "/" + epl.id;
+ dbg.p("DELELE: " + url, 2);
+ dbg.pj(epl);
+ return $http.delete(url)
+ .then(function(response){ return response.data; });
+ };
+
+ return { // public API
+ setEplUrl : setEplUrl,
+ getEplUrl : getEplUrl,
+ createEpl : createEpl,
+ getEplList : getEplList,
+ deleteEpl : deleteEpl,
+ updateEpl : updateEpl
+ };
+ };
+
+ var module = angular.module("vcpe");
+ module.factory("eplServices", eplServices);
+
+}()); \ No newline at end of file
diff --git a/demo-ui/app/services/mefServices.js b/demo-ui/app/services/mefServices.js
new file mode 100644
index 0000000..798ceb3
--- /dev/null
+++ b/demo-ui/app/services/mefServices.js
@@ -0,0 +1,71 @@
+(function(){
+
+ var mefServices = function ($http, dbg) {
+
+ var _evcBasePath = "/evcmgr/webapi/evc"
+ var _evcUrl = "unset";
+
+ var _uniBasePath = "/restconf/operational/cl-vcpe-mef:unis/uni"
+ var _uniUrl = "unset";
+
+ var _evcPathBasePath = "/restconf/operational/cl-vcpe-mef:evcs"
+ var _evcPathUrl = "unset";
+
+ //
+ // Configuration services
+ //
+
+ var setEvcUrl = function (evcMgrCfg) {
+ dbg.p("in setEvcUrl");
+ _evcUrl = "http://"+evcMgrCfg.ip+":"+evcMgrCfg.port+_evcBasePath;
+ dbg.p(_evcUrl);
+ }
+
+ var setUniUrl = function (uniMgrCfg) {
+ dbg.p("in setUniUrl");
+ _uniUrl = "http://"+uniMgrCfg.ip+":"+uniMgrCfg.port+_uniBasePath;
+ dbg.p(_uniUrl);
+ }
+
+ var setEvcPathUrl = function (evcPathMgrCfg) {
+ dbg.p("in setEvcPathUrl");
+ _evcPathUrl = "http://"+evcPathMgrCfg.ip+":"+evcPathMgrCfg.port+_evcPathBasePath;
+ dbg.p(_evcPathUrl);
+ }
+
+ //
+ // REST services
+ //
+
+ var getEvc = function(evcId) {
+ dbg.p("in mefServices.getEvc()",2)
+ var url = _evcUrl + "/" + evcId;
+ dbg.p("GET: " + url, 2);
+ return $http.get(url)
+ .then(function(response){ return response.data; });
+ };
+
+ var getUni = function(uniId) {
+ dbg.p("in mefServices.getUni()",2)
+ var url = _uniUrl + "/" + uniId;
+ dbg.p("GET: " + url, 2);
+ // return $http.get(url)
+ // .then(function(response){ return response.data; });
+ return $http({method: 'GET', url: url,
+ headers: {'Authorization': 'Basic YWRtaW46YWRtaW4='}})
+ .then(function(response){ return response.data; });
+ };
+
+ return { // public API
+ setEvcUrl : setEvcUrl,
+ setUniUrl : setUniUrl,
+ setEvcPathUrl : setEvcPathUrl,
+ getEvc : getEvc,
+ getUni : getUni
+ };
+ };
+
+ var module = angular.module("vcpe");
+ module.factory("mefServices", mefServices);
+
+}()); \ No newline at end of file
diff --git a/demo-ui/app/services/model.js b/demo-ui/app/services/model.js
new file mode 100644
index 0000000..c41794b
--- /dev/null
+++ b/demo-ui/app/services/model.js
@@ -0,0 +1,61 @@
+//
+// For data that must be shared accross controllers
+//
+
+(function(){
+var model = function ($log, dbg) {
+
+ var _shared = {
+ availableUnis : [],
+ currentEpl : null
+ };
+
+ var getAvailableUnis = function () {
+ return _shared.availableUnis;
+ }
+
+ var setAvailableUnis = function (availableUnis) {
+ dbg.p("in model:setAvailableUnis");
+ _shared.availableUnis = availableUnis;
+ dbg.pj(_shared.availableUnis);
+ }
+
+ // var getCurrentEplId = function () {
+ // // dbg.p("in model:getCurrentEplId, returning: "+_shared.currentEplId);
+ // return _shared.currentEplId;
+ // }
+
+ // var setCurrentEplId = function (currentEplId) {
+ // // dbg.p("in model:setCurrentEplId, setting to: "+currentEplId);
+ // _shared.currentEplId = currentEplId;
+ // }
+
+ var getCurrentEpl = function () {
+ dbg.p("in model:getCurrentEpl:");
+ //dbg.pj(_shared.currentEpl);
+ return _shared.currentEpl;
+ }
+
+ var setCurrentEpl = function (currentEpl) {
+ // dbg.p("in model:setCurrentEplId, setting to: "+currentEplId);
+ dbg.p("in model:setCurrentEpl");
+ //dbg.pj(currentEpl);
+ _shared.currentEpl = currentEpl;
+ }
+
+
+ var dumpShareDdata = function() { dbg.pj(_shared); };
+
+ return { // Public API
+ getAvailableUnis : getAvailableUnis,
+ setAvailableUnis : setAvailableUnis,
+ getCurrentEpl : getCurrentEpl,
+ setCurrentEpl : setCurrentEpl,
+ dumpShareDdata : dumpShareDdata
+ };
+ };
+
+ var module = angular.module("vcpe");
+ module.factory("model", model);
+
+}()); \ No newline at end of file
diff --git a/demo-ui/app/views/cos-panel.html b/demo-ui/app/views/cos-panel.html
new file mode 100644
index 0000000..682f154
--- /dev/null
+++ b/demo-ui/app/views/cos-panel.html
@@ -0,0 +1,171 @@
+<!--
+
+To Do
+ Change Bandwidth to drop down, with selected levels (10M, 100M, 1G, etc)
+ -->
+
+<div class="primary-lable ">Service Levels</div>
+<div class="cos-list">
+ <div class="list-item choosable"
+ ng-repeat="cos in cosList track by $index"
+
+ ng-class="{'selected-item-idle' : $index === selectedCosIdx &&
+ !cosActionInProgress(),
+ 'selected-item-update' : $index === selectedCosIdx &&
+ cosUpdateInProgress(),
+ 'selected-item-delete' : $index === selectedCosIdx &&
+ cosDelInProgress() }"
+ ng-click="onCosClick($index)">
+ {{ cos.id }}
+ </div>
+</div>
+
+<div class = "action-icon-container">
+
+ <span class="action-icon glyphicon glyphicon-plus"
+ ng-click="onAddCos()"
+ ng-class="{'action' : cosAddInProgress()}">
+ </span>
+
+ <span class="action-icon glyphicon glyphicon-pencil"
+ ng-click="onUpdateCos()"
+ ng-class="{'action' : cosUpdateInProgress()}">
+ </span>
+
+ <span class="action-icon glyphicon glyphicon-minus"
+ ng-click="onDelCos()"
+ ng-class="{'action' : cosDelInProgress()}">
+ </span>
+</div>
+
+<div class="cos-info-contaier">
+ <form role="form" ng-submit="onCosInputSubmit()">
+
+ <!-- Name -->
+
+ <div class="data-row">
+ <div class="label-col">Name:</div>
+ <div class="data-col" ng-show="showCosName()">
+ <span class="data-item">
+ {{ cosList[selectedCosIdx].id }}
+ </span>
+ </div>
+ <div class="data-col" ng-show="showCosNameInput()">
+ <input class="data-input" name="id"
+ type="text" ng-required="showCosInputs()"
+ ng-model="cosToEdit.id">
+ </div>
+ </div>
+
+ <div class="data-row">
+ <div class="label-col">Bandwidth:</div>
+ <div class="data-col" ng-show="showCosValues()">
+
+ <span class="data-item">
+ {{ bwText(cosList[selectedCosIdx]) }}
+ </span>
+ </div>
+ <div class="data-col" ng-show="showCosInputs()">
+ <select class="cos-dd-input"
+ name="bandwidth"
+ ng-required="showCosInputs()"
+ ng-model="cosToEdit.bwSelected"
+ ng-options="bw.name for bw in availableBWs"
+ >
+ </option>
+ </select>
+ </div>
+ </div>
+
+ <!-- Availability -->
+
+ <div class="data-row">
+ <div class="label-col">Availability:</div>
+ <div class="data-col" ng-show="showCosValues()">
+ <span class="data-item">
+ {{ cosList[selectedCosIdx].availbility }}
+ </span>
+ <span class="data-unit">%</span>
+ </div>
+ <div class="data-col" ng-show="showCosInputs()">
+ <input class="data-input" name="availbility"
+ type="number" step="any" ng-required="showCosInputs()"
+ min="1" max="100"
+ ng-model="cosToEdit.availbility">
+ <span class="data-unit">%</span>
+ </div>
+ </div>
+
+ <!-- Frame Delay -->
+
+ <div class="data-row">
+ <div class="label-col">Frame Delay:</div>
+ <div class="data-col" ng-show="showCosValues()">
+ <span class="data-item">
+ {{ cosList[selectedCosIdx].frameDelay }}
+ </span>
+ <span class="data-unit">ms</span>
+ </div>
+ <div class="data-col" ng-show="showCosInputs()">
+ <input class="data-input" name="frameDelay"
+ type="number" step="any" ng-required="showCosInputs()"
+ min="0"
+ ng-model="cosToEdit.frameDelay">
+ <span class="data-unit">ms</span>
+ </div>
+ </div>
+
+ <!-- Jitter -->
+
+ <div class="data-row">
+ <div class="label-col">Jitter:</div>
+ <div class="data-col" ng-show="showCosValues()">
+ <span class="data-item">
+ {{ cosList[selectedCosIdx].jitter }}
+ </span>
+ <span class="data-unit">ms</span>
+ </div>
+ <div class="data-col" ng-show="showCosInputs()">
+ <input class="data-input" name="jitter"
+ type="number" step="any" ng-required="showCosInputs()"
+ min="0"
+ ng-model="cosToEdit.jitter">
+ <span class="data-unit">ms</span>
+ </div>
+ </div>
+
+ <!-- Frame Loss -->
+
+ <div class="data-row">
+ <div class="label-col">Frame Loss:</div>
+ <div class="data-col" ng-show="showCosValues()">
+ <span class="data-item">
+ {{ cosList[selectedCosIdx].frameLoss }}
+ </span>
+ <span class="data-unit">%</span>
+ </div>
+ <div class="data-col" name="frameLoss"ng-show="showCosInputs()">
+ <input class="data-input" name="frameLoss"
+ type="number" step="any" ng-required="showCosInputs()"
+ min="0" max="100"
+ ng-model="cosToEdit.frameLoss">
+ <span class="data-unit">%</span>
+ </div>
+ </div>
+
+
+ <div class="warning-container">
+ <div class="warning" ng-show="cosNameConflict()">Please Enter Unique Name</div>
+ </div>
+ <div class="button-container">
+ <button type="submit"
+ class="btn btn-sm my-btn-addon"
+ <div ng-class="{'btn-success' : cosAddInProgress(),
+ 'btn-warning' : cosUpdateInProgress(),
+ 'btn-danger' : cosDelInProgress()}"
+ ng-disabled="!activateCosActionButton()"
+ ng-show="showCosActionButton()")>
+ {{ cosActionButtonText }}</button>
+ </div>
+ </form>
+</div>
diff --git a/demo-ui/app/views/css/vcpe.css b/demo-ui/app/views/css/vcpe.css
new file mode 100644
index 0000000..0d08734
--- /dev/null
+++ b/demo-ui/app/views/css/vcpe.css
@@ -0,0 +1,340 @@
+input[type='number'] {
+ font-size: 12px;
+}
+.choosable {
+ cursor: pointer;
+}
+.gradient {
+ background: -webkit-linear-gradient(rgba(255, 255, 255, 0) 0%, #ffffff 100%);
+ background: linear-gradient(to bottom, #ffffff 0%, rgba(255, 255, 255, 0) 100%);
+}
+.my-btn-addon {
+ height: 30px;
+ width: 100px;
+}
+.primary-lable {
+ color: darkred;
+ font-size: large;
+ font-weight: bold;
+ text-align: center;
+}
+.list-item {
+ color: black;
+ font-size: small;
+ font-weight: normal;
+ text-align: left;
+ background-color: none;
+}
+.selected-item-idle {
+ background-color: #e3e3e3;
+}
+.selected-item-delete {
+ background-color: #FFE4E1;
+}
+.selected-item-update {
+ background-color: #FFEFD5;
+}
+.primary-container {
+ border: 3px solid black;
+ background-color: #e3e3e3;
+ border-radius: 15px;
+ padding: 10px;
+ height: 400px;
+}
+.secondary-container {
+ border: 1px solid darkgray;
+ background-color: white;
+ padding: 5px 10px;
+ margin: 10px 10px -1px 10px;
+ height: 125px;
+ overflow-y: scroll;
+}
+.action-icon-container {
+ border: 1px solid darkgray;
+ background: -webkit-linear-gradient(rgba(255, 255, 255, 0) 0%, #ffffff 100%);
+ background: linear-gradient(to bottom, #ffffff 0%, rgba(255, 255, 255, 0) 100%);
+ margin: 0px 10px;
+ padding: 2px 10px;
+}
+.action-icon {
+ cursor: pointer;
+ padding: 0px 1px;
+ font-size: small;
+ color: black;
+ padding: 2px;
+}
+.action {
+ color: blue !important;
+}
+.warning {
+ color: red !important;
+ font-size: small !important;
+}
+.data-row {
+ display: flex;
+ flex-flow: row nowrap;
+ height: 20px;
+ width: 300;
+}
+.label-col {
+ color: purple;
+ font-size: small;
+ font-weight: normal;
+ text-align: left;
+ flex: 0 0 auto;
+ order: 1;
+ width: 85px;
+}
+.data-col {
+ flex: 0 0 auto;
+ order: 2;
+ color: black;
+ font-size: small;
+ font-weight: normal;
+ text-align: left;
+}
+.data-label {
+ color: purple;
+ font-size: small;
+ font-weight: normal;
+ text-align: left;
+ vertical-align: middle;
+}
+.data-item {
+ color: black;
+ font-size: small;
+ font-weight: bold;
+ text-align: left;
+}
+.data-input {
+ height: 20px;
+ width: 70px;
+ border-radius: 5px;
+}
+.cos-dd-input {
+ height: 20px;
+ width: 70px;
+}
+.epl-dd-input {
+ height: 20px;
+ width: 150px;
+}
+.data-unit {
+ color: black;
+ font-size: small;
+ font-weight: normal;
+ text-align: left;
+ margin-left: 5px;
+ vertical-align: middle;
+}
+.header-container {
+ display: flex;
+ flex-flow: row nowrap;
+ justify-content: space-between;
+}
+.header-container .hdr {
+ flex: 1 1 auto;
+ order: 1;
+}
+.header-container .img {
+ flex: 1 1 auto;
+ order: 2;
+ align-self: flex-end;
+ margin-bottom: 12px;
+}
+.frame {
+ display: flex;
+ flex-flow: row nowrap;
+ border: 1px solid lightgray;
+ margin: 20px;
+ padding: 20px 0px;
+}
+.frame .left {
+ flex: 1 6 5%;
+ order: 1;
+}
+.frame .right {
+ flex: 1 6 5%;
+ order: 3;
+}
+.frame .content {
+ border: none;
+ flex: 1 6 90%;
+ order: 2;
+}
+.frame .content .action-container {
+ border: none;
+ display: flex;
+ flex-flow: row nowrap;
+}
+.frame .content .action-container .cos-container {
+ border: 3px solid black;
+ background-color: #e3e3e3;
+ border-radius: 15px;
+ padding: 10px;
+ height: 400px;
+ flex: 1 1 50%;
+ order: 1;
+ margin-right: 20px;
+}
+.frame .content .action-container .cos-container .cos-list {
+ border: 1px solid darkgray;
+ background-color: white;
+ padding: 5px 10px;
+ margin: 10px 10px -1px 10px;
+ height: 125px;
+ overflow-y: scroll;
+}
+.frame .content .action-container .cos-container .cos-info-contaier {
+ display: flex;
+ flex-flow: column nowrap;
+ margin: 10px 20px;
+}
+.frame .content .action-container .cos-container .cos-info-contaier .labelContainer {
+ flex: 1 1 33%;
+ order: 1;
+ min-width: 80px;
+ color: purple;
+ font-size: small;
+ font-weight: normal;
+ text-align: left;
+ vertical-align: middle;
+}
+.frame .content .action-container .cos-container .warning-container {
+ height: 15px;
+ margin-top: 10px;
+}
+.frame .content .action-container .epl-container {
+ border: 3px solid black;
+ background-color: #e3e3e3;
+ border-radius: 15px;
+ padding: 10px;
+ height: 400px;
+ flex: 1 1 50%;
+ order: 2;
+ margin-right: 20px;
+}
+.frame .content .action-container .epl-container .epl-list {
+ border: 1px solid darkgray;
+ background-color: white;
+ padding: 5px 10px;
+ margin: 10px 10px -1px 10px;
+ height: 125px;
+ overflow-y: scroll;
+}
+.frame .content .action-container .epl-container .epl-info-contaier {
+ display: flex;
+ flex-flow: column nowrap;
+ margin: 10px 20px;
+}
+.frame .content .action-container .epl-container .epl-info-contaier .labelContainer {
+ flex: 1 1 33%;
+ order: 1;
+ min-width: 80px;
+ color: purple;
+ font-size: small;
+ font-weight: normal;
+ text-align: left;
+ vertical-align: middle;
+}
+.frame .content .action-container .epl-container .warning-container {
+ height: 15px;
+ margin-top: 10px;
+}
+.frame .content .monitor-container .mef-container {
+ border: 3px solid black;
+ background-color: #e3e3e3;
+ border-radius: 15px;
+ padding: 10px;
+ height: 400px;
+ height: 450px;
+ background-color: #B0C4DE;
+ margin: 20px 20px 20px 0px;
+}
+.frame .content .monitor-container .mef-container .primary-mef-lable {
+ color: SteelBlue;
+ font-size: large;
+ font-weight: bold;
+ text-align: center;
+ margin-bottom: 10px;
+}
+.frame .content .monitor-container .mef-container .mef-panel-hdr {
+ border-bottom: 1px solid SlateGray;
+}
+.frame .content .monitor-container .mef-container .secondary-mef-label {
+ color: SlateGray;
+ font-size: small;
+ font-weight: bold;
+ text-align: center;
+ background-color: #e3e3e3;
+}
+.frame .content .monitor-container .mef-container .mef-data-label {
+ color: purple;
+ font-size: small;
+ font-weight: normal;
+ text-align: left;
+ vertical-align: middle;
+}
+.frame .content .monitor-container .mef-container .mef-label-col {
+ color: purple;
+ font-size: small;
+ font-weight: normal;
+ text-align: left;
+ flex: 0 0 auto;
+ order: 1;
+ padding-left: 10px;
+}
+.frame .content .monitor-container .mef-container .evc-label-col {
+ color: purple;
+ font-size: small;
+ font-weight: normal;
+ text-align: left;
+ flex: 0 0 auto;
+ order: 1;
+ padding-left: 10px;
+ width: 200px;
+}
+.frame .content .monitor-container .mef-container .uni-label-col {
+ color: purple;
+ font-size: small;
+ font-weight: normal;
+ text-align: left;
+ flex: 0 0 auto;
+ order: 1;
+ padding-left: 10px;
+ width: 100px;
+}
+.frame .content .monitor-container .mef-container .mef-info-container {
+ display: flex;
+ flex-flow: row nowrap;
+ justify-content: center;
+}
+.frame .content .monitor-container .mef-container .mef-info-container .mef-secondary-container {
+ border: 1px solid darkgray;
+ background-color: WhiteSmoke;
+ margin: 5px;
+}
+.frame .content .monitor-container .mef-container .mef-info-container .uni1-container {
+ border: 1px solid darkgray;
+ background-color: WhiteSmoke;
+ margin: 5px;
+ border: 2px solid SlateGray;
+ flex: 1 1 24%;
+ order: 1;
+}
+.frame .content .monitor-container .mef-container .mef-info-container .evc-container {
+ border: 1px solid darkgray;
+ background-color: WhiteSmoke;
+ margin: 5px;
+ border: 2px solid SlateGray;
+ flex: 1 1 38%;
+ order: 2;
+}
+.frame .content .monitor-container .mef-container .mef-info-container .uni2-container {
+ border: 1px solid darkgray;
+ background-color: WhiteSmoke;
+ margin: 5px;
+ border: 2px solid SlateGray;
+ flex: 1 1 24%;
+ order: 3;
+}
diff --git a/demo-ui/app/views/epl-panel.html b/demo-ui/app/views/epl-panel.html
new file mode 100644
index 0000000..3de2523
--- /dev/null
+++ b/demo-ui/app/views/epl-panel.html
@@ -0,0 +1,187 @@
+<!--
+
+To Do
+ construct default name based on UNIs and COS
+ display EVC params when clicked
+ changed currently hardcoded widths (150) of input fields/dd's to be set by a class
+ update config file based on watch (already have hit issue), rather than wait
+ update available cos list when new cos added (low priority)
+
+ -->
+
+<!-- List of existing EPLs -->
+
+<div class="primary-lable ">Ethernet Private Line Services</div>
+<div class="epl-list">
+ <div class="list-item choosable"
+ ng-repeat="epl in eplList track by $index"
+
+ ng-class="{'selected-item-idle' : $index === selectedEplIdx &&
+ !eplActionInProgress(),
+ 'selected-item-update' : $index === selectedEplIdx &&
+ eplUpdateInProgress(),
+ 'selected-item-delete' : $index === selectedEplIdx &&
+ eplDelInProgress() }"
+ ng-click="onEplClick($index)">
+ {{ epl.id }}
+ </div>
+</div>
+
+
+<!-- Action Icons (add/mod/del) -->
+
+<div class = "action-icon-container">
+
+ <span class="action-icon glyphicon glyphicon-plus"
+ ng-click="onAddEpl()"
+ ng-class="{'action' : eplAddInProgress()}">
+ </span>
+
+ <span class="action-icon glyphicon glyphicon-pencil"
+ ng-click="onUpdateEpl()"
+ ng-class="{'action' : eplUpdateInProgress()}">
+ </span>
+
+ <span class="action-icon glyphicon glyphicon-minus"
+ ng-click="onDelEpl()"
+ ng-class="{'action' : eplDelInProgress()}">
+ </span>
+</div>
+
+<!-- Data for EPL selected / being acted on -->
+
+<div class="epl-info-contaier">
+ <form role="form" ng-submit="onEplInputSubmit()">
+
+ <!-- Name -->
+
+ <div class="data-row">
+ <div class="label-col">Name:</div>
+ <div class="data-col" ng-show="showEplName()">
+ <span class="data-item">
+ {{ eplList[selectedEplIdx].id }}
+ </span>
+ </div>
+
+ <div class="data-col" ng-show="showEplNameInput()">
+ <input class="data-input" name="id"
+ style="width:150"
+ type="text" ng-required="showEplInputs()"
+ ng-model="eplToEdit.id">
+ </div>
+ </div>
+
+ <!-- Class of servce -->
+
+ <div class="data-row">
+ <div class="label-col">Service level</div>
+ <div class="data-col" ng-show="showEplValues()">
+ <span class="data-item">
+ {{ eplList[selectedEplIdx].cos }}</span>
+ </div>
+ <div class="data-col" ng-show="showEplInputs()">
+ <select class="dd-input"
+ style="width:150"
+ name="cos Id"
+ ng-required="showEplInputs()"
+ ng-model="eplToEdit.cos"
+ >
+ <option ng-repeat="cos in availableCosIds"
+ value="{{ cos }}"
+ ng-selected="{{cos == eplToEdit.cos}}"
+ >
+ {{ cos }}
+ </option>
+ </select>
+ </div>
+ </div>
+
+
+ <!-- UNI 1 -->
+
+ <div class="data-row">
+ <div class="label-col">UNI 1</div>
+ <div class="data-col" ng-show="showEplValues()">
+ <span class="data-item">
+ {{ eplList[selectedEplIdx].uniHostIpList[0] }}&nbsp
+ ( {{ eplList[selectedEplIdx].custAddressList[0] }} )
+ </span>
+ </div>
+
+ <div class="data-col" ng-show="showEplInputs()">
+ <select class="dd-input"
+ style="width:150"
+ name="uni 1"
+ ng-required="showEplInputs()"
+ ng-model="eplToEdit.uni1Selected"
+ ng-options="uni.ip + ' ( ' + uni.address + ' )' for uni in availableUnis"
+ >
+ </option>
+ </select>
+ </div>
+ </div>
+
+
+ <!-- UNI 2 -->
+
+ <div class="data-row">
+ <div class="label-col">UNI 2</div>
+ <div class="data-col" ng-show="showEplValues()">
+ <span class="data-item">
+ {{ eplList[selectedEplIdx].uniHostIpList[1] }}&nbsp
+ ( {{ eplList[selectedEplIdx].custAddressList[1] }} )
+ </span>
+ </div>
+
+ <div class="data-col" ng-show="showEplInputs()">
+ <select class="dd-input"
+ style="width:150"
+ name="uni 1"
+ ng-required="showEplInputs()"
+ ng-model="eplToEdit.uni2Selected"
+ ng-options="uni.ip + ' ( ' + uni.address + ' )' for uni in availableUnis"
+ >
+ </option>
+ </select>
+ </div>
+ </div>
+
+
+ <!-- Evc -->
+
+ <div class="data-row" >
+ <div class="label-col" ng-hide="eplAddInProgress()">Assoc Evc:</div>
+ <div class="data-col">
+ <span class="data-item" ng-hide="eplAddInProgress()">
+ {{ eplList[selectedEplIdx].evcId }}
+ </span>
+ </div>
+ </div>
+
+ <!-- Action Buttons -->
+
+ <div class="warning-container">
+ &nbsp<span class="warning" ng-show="eplNameConflict()">[Please Enter Unique Name]&nbsp&nbsp&nbsp</span>
+ <span class="warning" ng-show="uniConflict()">[UNI-1 and UNI-2 must be different]&nbsp&nbsp&nbsp</span>
+ <span class="warning" ng-show="cosConflict()">[Must create SL before creating EPL]&nbsp&nbsp&nbsp</span>
+ </div>
+ <div class="button-container">
+ <button type="submit"
+ class="btn btn-sm my-btn-addon"
+ <div ng-class="{'btn-success' : eplAddInProgress(),
+ 'btn-warning' : eplUpdateInProgress(),
+ 'btn-danger' : eplDelInProgress()}"
+ ng-disabled="!activateEplActionButton()"
+ ng-show="showEplActionButton()")>
+ {{ eplActionButtonText }}</button>
+ </div>
+
+ <!-- Debug -->
+
+<!--
+ <div>
+ </div>
+ -->
+
+ </form>
+</div>
diff --git a/demo-ui/app/views/less/vcpe.less b/demo-ui/app/views/less/vcpe.less
new file mode 100644
index 0000000..5598160
--- /dev/null
+++ b/demo-ui/app/views/less/vcpe.less
@@ -0,0 +1,365 @@
+@dbg-flg: false;
+
+@side-panel-width: 5%;
+@main-panel-width: 100%-(2*@side-panel-width);
+
+@backgroundGray: #E3E3E3;
+
+@cos-basis: 50%;
+@epl-basis: 100%-(@cos-basis);
+
+
+//
+// Utilities
+//
+
+.dbg-border( // show border if @dbg-flg is true
+ @dbg-bordersFlg,
+ @dbg-borderClr,
+ @dbg-borderStyle)
+ when (@dbg-bordersFlg=true) {
+ border: 3px @dbg-borderStyle @dbg-borderClr;
+ margin: 1px; padding: 1px;
+}
+
+.set-text(@color,
+ @font-size,
+ @font-weight,
+ @text-align) {
+ color:@color; font-size:@font-size;
+ font-weight:@font-weight; text-align:@text-align;
+}
+
+//
+// Common Styles
+//
+
+input[type='number'] { font-size: 12px; }
+
+.choosable {
+ cursor: pointer;
+}
+
+.gradient {
+ background: -webkit-linear-gradient(rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 100%);
+ background: linear-gradient(to bottom, rgba(255, 255, 255, 1) 0%, rgba(255, 255, 255, 0) 100%);
+}
+
+.my-btn-addon {
+ height: 30px;
+ width: 100px;
+}
+
+.primary-lable {
+ .set-text(darkred, large, bold, center); }
+
+.list-item {
+ .set-text(black, small, normal, left);
+ background-color:none; }
+
+.selected-item-idle {
+ background-color: @backgroundGray; }
+
+.selected-item-delete {
+ background-color: #FFE4E1; }
+
+.selected-item-update {
+ background-color: #FFEFD5; }
+
+.primary-container {
+ border: 3px solid black;
+ .dbg-border(@dbg-flg, blue, solid);
+ background-color: @backgroundGray;
+ border-radius: 15px;
+ padding: 10px;
+ height: 400px;
+}
+
+.secondary-container {
+ border: 1px solid darkgray;
+ .dbg-border(@dbg-flg, green, solid);
+ background-color: white;
+ padding: 5px 10px; // TB RL
+ margin: 10px 10px -1px 10px; // T R B L
+ height: 125px;
+ overflow-y: scroll;
+}
+
+.action-icon-container {
+ border: 1px solid darkgray;
+ .dbg-border(@dbg-flg, magenta, solid);
+ .gradient;
+ margin: 0px 10px; // TB RL
+ padding: 2px 10px; // TB RL
+}
+
+.action-icon {
+ .choosable;
+ padding: 0px 1px; // TB RL
+ font-size: small;
+ color: black;
+ padding: 2px;
+}
+
+.action {
+ color: blue !important;
+}
+
+.warning {
+ color: red !important;
+ font-size: small !important;
+}
+
+.data-row {
+ .dbg-border(@dbg-flg, red, solid);
+ display: flex;
+ flex-flow:row nowrap;
+ height: 20px;
+ width: 300;
+ }
+.label-col {
+ .dbg-border(@dbg-flg, gray, solid);
+ .set-text(purple, small, normal, left);
+ flex: 0 0 auto; order: 1;
+ width: 85px;
+ }
+
+
+.data-col {
+ .dbg-border(@dbg-flg, gray, solid);
+ flex: 0 0 auto; order: 2;
+ .set-text(black, small, normal, left);
+
+ }
+
+.data-label {
+ .set-text(purple, small, normal, left);
+ vertical-align: middle;
+}
+.data-item {
+ .set-text(black, small, bold, left);
+}
+.data-input {
+ height: 20px;
+ width: 70px;
+ border-radius: 5px;
+}
+.cos-dd-input {
+ height: 20px;
+ width: 70px;
+}
+
+.epl-dd-input {
+ height: 20px;
+ width: 150px;
+}
+
+
+.data-unit {
+ .set-text(black, small, normal, left);
+ margin-left: 5px;
+ vertical-align: middle;
+}
+
+//
+// Page starts here
+//
+
+.header-container {
+ display: flex;
+ flex-flow:row nowrap;
+ justify-content: space-between;
+ .hdr {
+ flex: 1 1 auto; order: 1;
+ }
+ .img {
+ flex: 1 1 auto; order: 2;
+ align-self: flex-end;
+ margin-bottom: 12px;
+ }
+}
+
+
+.frame{
+ .dbg-border(@dbg-flg, lightgray, solid);
+ display: flex;
+ flex-flow:row nowrap;
+ border: 1px solid lightgray;
+
+ margin: 20px; // TBRL
+ padding: 20px 0px; // TB RL
+
+ .left { .dbg-border(@dbg-flg, lightgray, solid);
+ flex: 1 6 @side-panel-width; order: 1; }
+
+ .right{ .dbg-border(@dbg-flg, lightgray, solid);
+ flex: 1 6 @side-panel-width; order: 3; }
+
+ .content {
+ border: none;
+ .dbg-border(@dbg-flg, lightgray, solid);
+ flex: 1 6 @main-panel-width; order: 2;
+
+ .action-container {
+ border: none;
+ .dbg-border(@dbg-flg, yellow, solid);
+
+ display: flex;
+ flex-flow:row nowrap;
+
+ .cos-container {
+ .primary-container;
+ flex: 1 1 @cos-basis; order: 1;
+ margin-right: 20px;
+
+ .cos-list {
+ .secondary-container;
+ }
+ .cos-info-contaier {
+ .dbg-border(@dbg-flg, green, solid);
+ display: flex;
+ flex-flow:column nowrap;
+ margin: 10px 20px; // TB RL
+ .labelContainer {
+ .dbg-border(@dbg-flg, yellow, solid);
+ flex: 1 1 33%; order: 1;
+ min-width: 80px;
+ .data-label;
+ }
+ }
+ .warning-container {
+ .dbg-border(@dbg-flg, magenta, solid);
+ height: 15px;
+ margin-top: 10px;
+ }
+ .button-container {
+ .dbg-border(@dbg-flg, magenta, solid);
+ }
+ }
+ .epl-container {
+ .primary-container;
+ flex: 1 1 @epl-basis; order: 2;
+ margin-right: 20px;
+
+ .epl-list {
+ .secondary-container;
+ }
+ .epl-info-contaier {
+ .dbg-border(@dbg-flg, green, solid);
+ display: flex;
+ flex-flow:column nowrap;
+ margin: 10px 20px; // TB RL
+ .labelContainer {
+ .dbg-border(@dbg-flg, yellow, solid);
+ flex: 1 1 33%; order: 1;
+ min-width: 80px;
+ .data-label;
+ }
+ }
+ .warning-container {
+ .dbg-border(@dbg-flg, magenta, solid);
+ height: 15px;
+ margin-top: 10px;
+ }
+ .button-container {
+ .dbg-border(@dbg-flg, magenta, solid);
+ }
+ }
+ }
+
+ .monitor-container {
+ .dbg-border(@dbg-flg, yellow, solid);
+
+
+ .mef-container {
+ .primary-container;
+ height: 450px;
+
+ .dbg-border(@dbg-flg, blue, solid);
+ background-color: #B0C4DE;
+ margin: 20px 20px 20px 0px; // T R B L
+
+ .primary-mef-lable {
+ .set-text(SteelBlue, large, bold, center);
+ margin-bottom: 10px;
+ }
+
+ @mef-container-border-color: SlateGray;
+
+ .mef-panel-hdr {
+ border-bottom: 1px solid @mef-container-border-color;
+ .dbg-border(@dbg-flg, blue, solid);
+ }
+
+ .secondary-mef-label {
+ .set-text(SlateGray, small, bold, center);
+ background-color: @backgroundGray;
+ }
+
+ .mef-data-label {
+ .set-text(purple, small, normal, left);
+ vertical-align: middle;
+
+ }
+ .mef-label-col {
+ .dbg-border(@dbg-flg, gray, solid);
+ .set-text(purple, small, normal, left);
+ flex: 0 0 auto; order: 1;
+ padding-left: 10px;
+ }
+
+ .evc-label-col {
+ .mef-label-col;
+ width: 200px;
+
+ }
+ .uni-label-col {
+ .mef-label-col;
+ width: 100px;
+ }
+
+ .mef-info-container {
+ display: flex;
+ flex-flow:row nowrap;
+ justify-content: center;
+
+ .mef-secondary-container {
+ border: 1px solid darkgray;
+ .dbg-border(@dbg-flg, green, solid);
+ background-color: WhiteSmoke;
+ //padding: 5px 30px; // TB RL
+ margin: 5px;
+ }
+
+ @evc-basis: 38%;
+ @uni-basis: 100%-(2*@evc-basis);
+
+ .uni1-container {
+ .mef-secondary-container;
+ border: 2px solid @mef-container-border-color;
+ .dbg-border(@dbg-flg, darkred, solid);
+ flex: 1 1 @uni-basis; order: 1;
+
+ }
+ .evc-container {
+ .mef-secondary-container;
+ border: 2px solid @mef-container-border-color;
+ .dbg-border(@dbg-flg, darkred, solid);
+ flex: 1 1 @evc-basis; order: 2;
+
+ }
+ .uni2-container {
+ .mef-secondary-container;
+ border: 2px solid @mef-container-border-color;
+ .dbg-border(@dbg-flg, darkred, solid);
+ flex: 1 1 @uni-basis; order: 3;
+
+ }
+ }
+ }
+ }
+ }
+}
+
+
+
diff --git a/demo-ui/app/views/mef-panel.html b/demo-ui/app/views/mef-panel.html
new file mode 100644
index 0000000..df9f60b
--- /dev/null
+++ b/demo-ui/app/views/mef-panel.html
@@ -0,0 +1,370 @@
+<!--
+
+To Do
+ Use cases to handle properly RE EVC/UNI displaying info
+ - EPL exist at start up
+ - no EPL at start up
+ - delete an EPL
+ - delete last EPL
+ -->
+
+<div class="primary-mef-lable">MEF EPL Data</div>
+<div class="mef-info-container">
+
+
+ <!-- UNI 1 -->
+
+ <div class="uni1-container">
+ <div class="mef-panel-hdr">
+ <div class="secondary-mef-label">UNI-1 MEF Attributes</div>
+ <div class="secondary-mef-label"
+ style="font-size: xx-small; font-weight: normal; color: #b3b3b3;">
+ (Source = ODL UNI Mgr DB)
+ </div>
+ </div>
+
+ <div class="data-row">
+ <div class="uni-label-col">Uni ID:</div>
+ <div class="data-col" ng-show="showEvcValues()">
+ <span class="data-item">
+ {{ currentEvcUnis[0].uni[0]["id"] }}
+ </span>
+ </div>
+ </div>
+
+ <div class="data-row">
+ <div class="uni-label-col">IP Address:</div>
+ <div class="data-col" ng-show="showEvcValues()">
+ <span class="data-item">
+ {{ currentEvcUnis[0].uni[0]["ip-address"] }}
+ </span>
+ </div>
+ </div>
+
+ <div class="data-row">
+ <div class="uni-label-col">MAC Address:</div>
+ <div class="data-col" ng-show="showEvcValues()">
+ <span class="data-item">
+ {{ currentEvcUnis[0].uni[0]["mac-address"] }}
+ </span>
+ </div>
+ </div>
+
+ <div class="data-row">
+ <div class="uni-label-col">Speed:</div>
+ <div class="data-col" ng-show="showEvcValues()">
+ <span class="data-item">
+ {{ uniToSpeedString(currentEvcUnis[0]) }}
+ </span>
+ </div>
+ </div>
+
+ <div class="data-row">
+ <div class="uni-label-col">Mac Layer:</div>
+ <div class="data-col" ng-show="showEvcValues()">
+ <span class="data-item">
+ {{ currentEvcUnis[0].uni[0]["mac-layer"] }}
+ </span>
+ </div>
+ </div>
+
+ <div class="data-row">
+ <div class="uni-label-col">Phys Medium:</div>
+ <div class="data-col" ng-show="showEvcValues()">
+ <span class="data-item">
+ {{ currentEvcUnis[0].uni[0]["physical-medium"] }}
+ </span>
+ </div>
+ </div>
+
+ <div class="data-row">
+ <div class="uni-label-col">MTU Size:</div>
+ <div class="data-col" ng-show="showEvcValues()">
+ <span class="data-item">
+ {{ currentEvcUnis[0].uni[0]["mtu-size"] }}
+ </span>
+ </div>
+ </div>
+
+ <div class="data-row">
+ <div class="uni-label-col">Mode:</div>
+ <div class="data-col" ng-show="showEvcValues()">
+ <span class="data-item">
+ {{ currentEvcUnis[0].uni[0]["mode"] }}
+ </span>
+ </div>
+ </div>
+
+ <div class="data-row">
+ <div class="uni-label-col">Type:</div>
+ <div class="data-col" ng-show="showEvcValues()">
+ <span class="data-item">
+ {{ currentEvcUnis[0].uni[0]["type"] }}
+ </span>
+ </div>
+ </div>
+
+ </div>
+
+ <!-- EVC -->
+
+ <div class="evc-container">
+
+ <div class="mef-panel-hdr">
+ <div class="secondary-mef-label">EVC MEF Attributes</div>
+ <div class="secondary-mef-label"
+ style="font-size: xx-small; font-weight: normal; color: #b3b3b3;">
+ (Source = EVC Mgr DB)</div>
+ </div>
+ <div class="data-row">
+ <div class="evc-label-col">Evc ID:</div>
+ <div class="data-col" ng-show="showEvcValues()">
+ <span class="data-item">
+ {{ currentEplEvc.id }}
+ </span>
+ </div>
+ </div>
+
+ <div class="data-row">
+ <div class="evc-label-col">CoS ID:</div>
+ <div class="data-col" ng-show="showEvcValues()">
+ <span class="data-item">
+ {{ currentEplEvc.cosId }}
+ </span>
+ </div>
+ </div>
+
+ <div class="data-row">
+ <div class="evc-label-col">Uni-1/2 IDs:</div>
+ <div class="data-col" ng-show="showEvcValues()">
+
+ <span class="data-item">
+ {{ "[" + currentEplEvc.uniIdList[0] + "] | [" + currentEplEvc.uniIdList[1] + "]"}}
+ </span>
+
+ </div>
+ </div>
+
+ <div class="data-row">
+ <div class="evc-label-col">Uni-1/2 IPs:</div>
+ <div class="data-col" ng-show="showEvcValues()">
+ <span class="data-item">
+ {{ currentEplEvc.uniIpList[0] }}
+ </span>
+ </div>
+ </div>
+ <div class="data-row">
+ <div class="evc-label-col"></div>
+ <div class="data-col" ng-show="showEvcValues()">
+ <span class="data-item">
+ {{ currentEplEvc.uniIpList[1] }}
+ </span>
+ </div>
+ </div>
+
+ <div class="data-row">
+ <div class="evc-label-col">Uni-1/2 MACs:</div>
+ <div class="data-col" ng-show="showEvcValues()">
+ <span class="data-item">
+ {{ currentEplEvc.uniMacList[0] }}
+ </span>
+ </div>
+ </div>
+ <div class="data-row">
+ <div class="evc-label-col"></div>
+ <div class="data-col" ng-show="showEvcValues()">
+ <span class="data-item">
+ {{ currentEplEvc.uniMacList[1] }}
+ </span>
+ </div>
+ </div>
+
+ <div class="data-row">
+ <div class="evc-label-col">1-Way Availability:</div>
+ <div class="data-col" ng-show="showEvcValues()">
+ <span class="data-item">
+ {{ currentEplEvc.oneWayAvailability }}
+ </span>
+ <span class="data-unit">%</span>
+ </div>
+ </div>
+
+ <div class="data-row">
+ <div class="evc-label-col">1-Way Frame Delay:</div>
+ <div class="data-col" ng-show="showEvcValues()">
+ <span class="data-item">
+ {{ currentEplEvc.oneWayFrameDelay }}
+ </span>
+ <span class="data-unit">ms</span>
+ </div>
+ </div>
+
+ <div class="data-row">
+ <div class="evc-label-col">1-Way Frame Loss Ratio:</div>
+ <div class="data-col" ng-show="showEvcValues()">
+ <span class="data-item">
+ {{ currentEplEvc.oneWayFrameLossRatio }}
+ </span>
+ <span class="data-unit">%</span>
+ </div>
+ </div>
+
+ <div class="data-row">
+ <div class="evc-label-col">EVC Type:</div>
+ <div class="data-col" ng-show="showEvcValues()">
+ <span class="data-item">
+ {{ currentEplEvc.evcType }}
+ </span>
+ </div>
+ </div>
+
+ <div class="data-row">
+ <div class="evc-label-col">Unicast Frame Delivery:</div>
+ <div class="data-col" ng-show="showEvcValues()">
+ <span class="data-item">
+ {{ currentEplEvc.unicastFrameDelivery }}
+ </span>
+ </div>
+ </div>
+
+ <div class="data-row">
+ <div class="evc-label-col">Broadcast Frame Delivery:</div>
+ <div class="data-col" ng-show="showEvcValues()">
+ <span class="data-item">
+ {{ currentEplEvc.broadcastFrameDelivery }}
+ </span>
+ </div>
+ </div>
+
+ <div class="data-row">
+ <div class="evc-label-col">Multicast Frame Delivery:</div>
+ <div class="data-col" ng-show="showEvcValues()">
+ <span class="data-item">
+ {{ currentEplEvc.multicastFrameDelivery }}
+ </span>
+ </div>
+ </div>
+
+ <div class="data-row">
+ <div class="evc-label-col">CE VLAN ID Preservation:</div>
+ <div class="data-col" ng-show="showEvcValues()">
+ <span class="data-item">
+ {{ currentEplEvc.ceVLanIdPreservation }}
+ </span>
+ </div>
+ </div>
+
+ <div class="data-row">
+ <div class="evc-label-col">CE VLAN CoS Preservation:</div>
+ <div class="data-col" ng-show="showEvcValues()">
+ <span class="data-item">
+ {{ currentEplEvc.ceVlanCosPreservation }}
+ </span>
+ </div>
+ </div>
+
+ <div class="data-row">
+ <div class="evc-label-col">Max Service Frame Size:</div>
+ <div class="data-col" ng-show="showEvcValues()">
+ <span class="data-item">
+ {{ currentEplEvc.evcMaxSvcFrameSize }}
+ </span>
+ <span class="data-unit">bytes</span>
+ </div>
+ </div>
+ </div>
+
+ <!-- UNI 2 -->
+
+ <div class="uni2-container">
+ <div class="mef-panel-hdr">
+ <div class="secondary-mef-label">UNI-2 MEF Attributes</div>
+ <div class="secondary-mef-label"
+ style="font-size: xx-small; font-weight: normal; color: #b3b3b3;">
+ (Source = ODL UNI Mgr DB)
+ </div>
+ </div>
+
+ <div class="data-row">
+ <div class="uni-label-col">Uni ID:</div>
+ <div class="data-col" ng-show="showEvcValues()">
+ <span class="data-item">
+ {{ currentEvcUnis[1].uni[0]["id"] }}
+ </span>
+ </div>
+ </div>
+
+ <div class="data-row">
+ <div class="uni-label-col">IP Address:</div>
+ <div class="data-col" ng-show="showEvcValues()">
+ <span class="data-item">
+ {{ currentEvcUnis[1].uni[0]["ip-address"] }}
+ </span>
+ </div>
+ </div>
+
+ <div class="data-row">
+ <div class="uni-label-col">MAC Address:</div>
+ <div class="data-col" ng-show="showEvcValues()">
+ <span class="data-item">
+ {{ currentEvcUnis[1].uni[0]["mac-address"] }}
+ </span>
+ </div>
+ </div>
+
+ <div class="data-row">
+ <div class="uni-label-col">Speed:</div>
+ <div class="data-col" ng-show="showEvcValues()">
+ <span class="data-item">
+ {{ uniToSpeedString(currentEvcUnis[1]) }}
+ </span>
+ </div>
+ </div>
+
+ <div class="data-row">
+ <div class="uni-label-col">Mac Layer:</div>
+ <div class="data-col" ng-show="showEvcValues()">
+ <span class="data-item">
+ {{ currentEvcUnis[1].uni[0]["mac-layer"] }}
+ </span>
+ </div>
+ </div>
+
+ <div class="data-row">
+ <div class="uni-label-col">Phys Medium:</div>
+ <div class="data-col" ng-show="showEvcValues()">
+ <span class="data-item">
+ {{ currentEvcUnis[1].uni[0]["physical-medium"] }}
+ </span>
+ </div>
+ </div>
+
+ <div class="data-row">
+ <div class="uni-label-col">MTU Size:</div>
+ <div class="data-col" ng-show="showEvcValues()">
+ <span class="data-item">
+ {{ currentEvcUnis[0].uni[0]["mtu-size"] }}
+ </span>
+ </div>
+ </div>
+
+ <div class="data-row">
+ <div class="uni-label-col">Mode:</div>
+ <div class="data-col" ng-show="showEvcValues()">
+ <span class="data-item">
+ {{ currentEvcUnis[1].uni[0]["mode"] }}
+ </span>
+ </div>
+ </div>
+
+ <div class="data-row">
+ <div class="uni-label-col">Type:</div>
+ <div class="data-col" ng-show="showEvcValues()">
+ <span class="data-item">
+ {{ currentEvcUnis[1].uni[0]["type"] }}
+ </span>
+ </div>
+ </div>
+
+ </div>
+</div> \ No newline at end of file
diff --git a/demo-ui/app/views/vcpe-portal.html b/demo-ui/app/views/vcpe-portal.html
new file mode 100644
index 0000000..437485f
--- /dev/null
+++ b/demo-ui/app/views/vcpe-portal.html
@@ -0,0 +1,71 @@
+<!--
+
+TODO
+ - Use watchers to trigger changes aftger config file reads as opposed
+ to the current "sleep for a bit" approach
+
+ -->
+
+<html ng-app="vcpe">
+<head ng-controller="MainController">
+
+ <script src="../../bower_components/angular/angular.min.js"></script>
+
+ <link rel="stylesheet" href="../../bower_components/bootstrap/dist/css/bootstrap.min.css">
+ <link rel="stylesheet" href="../../bower_components/bootstrap/dist/css/bootstrap-theme.min.css">
+
+ <link rel="stylesheet" href="css/vcpe.css" />
+ <script src="../controllers/MainController.js"></script>
+ <script src="../controllers/CosController.js"></script>
+ <script src="../controllers/EplController.js"></script>
+ <script src="../controllers/MefController.js"></script>
+ <script src="../services/cosServices.js"></script>
+ <script src="../services/eplServices.js"></script>
+ <script src="../services/mefServices.js"></script>
+ <script src="../services/model.js"></script>
+ <script src="../services/dbg.js"></script>
+
+</head>
+
+<body>
+<div class="frame">
+<div class="left"></div>
+
+<div class="content">
+
+ <div class="header-container">
+ <div class="hdr">
+ <h2>Virtual Business CPE Demo</h2>
+ </div>
+ </div>
+
+ <div class="action-container">
+
+ <div class="cos-container"
+ ng-controller="CosController"
+ ng-include="'cos-panel.html'">
+ </div>
+
+ <div class="epl-container"
+ ng-controller="EplController"
+ ng-include="'epl-panel.html'">
+ </div>
+
+ </div>
+
+ <div class="monitor-container">
+
+ <div class="mef-container"
+ ng-controller="MefController"
+ ng-include="'mef-panel.html'">
+ </div>
+
+
+ </div>
+
+</div>
+
+<div class="right"></div>
+</div>
+</body>
+</html>
diff --git a/demo-ui/bower.json b/demo-ui/bower.json
new file mode 100644
index 0000000..aaac185
--- /dev/null
+++ b/demo-ui/bower.json
@@ -0,0 +1,11 @@
+{
+ "name": "dhd",
+ "version": "0.0.1",
+ "dependencies": {
+ "angular": "1.4.1",
+ "bootstrap": "3.3.5"
+ },
+ "resolutions": {
+ "angular": "1.4.1"
+ }
+}
diff --git a/demo-ui/gruntfile.js b/demo-ui/gruntfile.js
new file mode 100644
index 0000000..7e8bc68
--- /dev/null
+++ b/demo-ui/gruntfile.js
@@ -0,0 +1,25 @@
+module.exports = function (grunt) {
+
+ grunt.initConfig({
+ less: {
+ app: {
+ files: {
+ 'app/views/css/vcpe.css': 'app/views/less/vcpe.less'
+ }
+ }
+ },
+
+ watch: {
+ less: {
+ files: 'app/views/less/*.less',
+ tasks: ['css']
+ }
+ }
+ });
+
+ grunt.loadNpmTasks('grunt-contrib-less');
+ grunt.loadNpmTasks('grunt-contrib-watch');
+ grunt.registerTask('css', ['less']);
+ grunt.registerTask('default', ['css']);
+
+};
diff --git a/demo-ui/package.json b/demo-ui/package.json
new file mode 100644
index 0000000..086cadb
--- /dev/null
+++ b/demo-ui/package.json
@@ -0,0 +1,18 @@
+{
+ "name": "vcpe-demo-portal",
+ "version": "0.0.1",
+ "description": "Portal that drives VCPE MEF demo",
+ "main": "src/portal.js",
+ "author": "steve@sentosatech.com",
+ "dependencies": {
+ "less": "latest",
+ "express": "latest",
+ "body-parser": "*"
+ },
+ "devDependencies": {
+ "grunt": "^0.4.5",
+ "grunt-contrib-copy": "^0.8.0",
+ "grunt-contrib-less": "^1.0.1",
+ "grunt-contrib-watch": "^0.6.1"
+ }
+}
diff --git a/demo-ui/vcpeUiServer.js b/demo-ui/vcpeUiServer.js
new file mode 100644
index 0000000..94c5b9c
--- /dev/null
+++ b/demo-ui/vcpeUiServer.js
@@ -0,0 +1,19 @@
+// Create express HTTP server app
+var express = require('express');
+var app = express();
+
+var bodyParser = require('body-parser');
+app.use(bodyParser.json());
+app.use(express.static("."));
+
+// defaults
+var PORT = 4000;
+
+// grap the command line arguments
+var args = process.argv.slice(2);
+if ( args[0] ) {
+ PORT = args[0];
+}
+
+app.listen(PORT);
+console.log('Running on http://localhost:' + PORT); \ No newline at end of file
diff --git a/deploy.sh b/deploy.sh
new file mode 100755
index 0000000..e267f4b
--- /dev/null
+++ b/deploy.sh
@@ -0,0 +1,25 @@
+#!/bin/bash
+
+echo ... stopping tomcat
+/Library/Tomcat/bin/shutdown.sh
+
+declare -a services=('cos' 'evc' 'svc')
+for svc in "${services[@]}"
+do
+ for del in `ls -d /Library/Tomcat/webapps/${svc}*`; do
+ echo ... removing $del
+ rm -rf $del
+ done
+done
+
+echo ... building new war files
+mvn clean install
+
+echo ... moving war files to tomcat root
+cp ./cos/cosmgr/target/cosmgr.war /Library/Tomcat/webapps/.
+cp ./evc/evcmgr/target/evcmgr.war /Library/Tomcat/webapps/.
+cp ./svc/svcmgr/target/svcmgr.war /Library/Tomcat/webapps/.
+ls -l /Library/Tomcat/webapps/*.war
+
+echo ... starting tomcat
+/Library/Tomcat/bin/startup.sh
diff --git a/doc/dev-notes.md b/doc/dev-notes.md
new file mode 100644
index 0000000..1ff24b6
--- /dev/null
+++ b/doc/dev-notes.md
@@ -0,0 +1,9 @@
+## REST Clients Notes : CoSClient, EvcClient, EplClient
+1. Provide rest communications to cosmgr, evcmgr, and eplmgr repsectivly.
+ - provide create/request/update/delete capabilities
+ - these services must be running within tomcat
+ - each has it's own separate war file
+2. Creating resources
+ - The create() methods take cos/epl/evc objects as inputs
+ - Not all inputs are known at time of resource creation, and the create service itself will set some of the parameters, and the all return object of the type that was created which will capture any values set within the create service (in addition to remembering the values originally supplied)
+ - You must capture the object returned by the create function, as there will be values that were set during that proccess
diff --git a/doc/sample-json.txt b/doc/sample-json.txt
new file mode 100644
index 0000000..d46dc4c
--- /dev/null
+++ b/doc/sample-json.txt
@@ -0,0 +1,46 @@
+
+// cos
+Content-Type application/json
+Accept application/json
+{
+ "id" : "gold",
+ "commitedInfoRate" : 100,
+ "availbility" : 99.9,
+ "frameDelay" : 2.5,
+ "jitter" : 3.6,
+ "frameLoss" : 4.7
+}
+
+// evc
+Content-Type application/json
+Accept application/json
+{
+ "broadcastFrameDelivery": "UNCONDITIONAL",
+ "ceVLanIdPreservation": true,
+ "ceVlanCosPreservation": true,
+ "cosId": "gold",
+ "evcMaxSvcFrameSize": 1600,
+ "evcType": "POINT_TO_POINT",
+ "id": "11:00:11:11:11:11|11:00:22:22:22:22",
+ "maxUnis": 2,
+ "multicastFrameDelivery": "UNCONDITIONAL",
+ "oneWayAvailability": 0.99,
+ "oneWayFrameDelay": 17.43,
+ "oneWayFrameLossRatio": 0.01,
+ "uniIdList": [
+ "UNI-1",
+ "UNI-2"
+ ],
+ "uniIpList": [
+ "192.168.1.1",
+ "192.168.1.2"
+ ],
+ "uniMacList": [
+ "11:00:11:11:11:11",
+ "11:00:22:22:22:22"
+ ],
+ "unicastFrameDelivery": "UNCONDITIONAL"
+}
+
+// for the simple ping test gets
+Accept text/plain \ No newline at end of file
diff --git a/doc/state-of-code.md b/doc/state-of-code.md
new file mode 100644
index 0000000..0a9eff3
--- /dev/null
+++ b/doc/state-of-code.md
@@ -0,0 +1,22 @@
+This is a proof of concept prototype implementation enabling the creation and management of MEF EPL Services.
+
+Being a proof of concept prototype, there are some areas which have received only superficial coverage or no coverage at all. Following are items that should be addressed when evolving this to a production oriented implementation
+
+1. The current test suite is reasonable, but exhaustive. Production targeted version should have more thourough test coverage
+2. Exception handling is only superficially implemented. A production system should include a more robust exception handling and error reporting architecture
+3. Only a subset of the MEF Attributes have been implemented. Long term the goal is to evolve this code base to fully support all MEF paramaters
+4. We are only implementing a portion of the data model for the sake of expediency.
+ - Only EPL service is supported at the moment
+ - Currently, the service repo is hard coded to hold EPL (we have not implemented the more general MEFSvc and Eline/ELine/Tree classes that in the future will also reside in the repo).
+ - The MEF service hierarchy (MEFSvc->Eline->EPL) need to be architected and implemented
+ - The SvcMgr needs to be architected in order to handle multiple service types from a REST API perspective and from a persitance perspective
+ - the REST URL/path architecture is currently hard coded, should be configurable at some point (config file, etc).
+5. There has not been a definitive analysis of which specific service attributes are recieved, generated, or queried at each service layer.
+ - It would be very useful to do this analysis, and then reflect in the code through structure and documentation, which attributes are set/queried at each layer
+
+Specific To Do:
+1. Who supplies/generates evcMaxSvcFrameSize? Currently hard coded to 1600 in EplService.create()
+2. Make sure for all XXXClient.create(xxx), that we capture the returned version, in case the service layer modified it
+ - for example epl = eplClient.create(epl)
+3. Check for nulls when prior to printing out lists in dump() fxns
+4. Unique EVC IDs are being generated via an internal counter. This of course does not scale nor survive restart. A proper unique ID generation approach will be needed for production. \ No newline at end of file
diff --git a/evc/evcbase/pom.xml b/evc/evcbase/pom.xml
new file mode 100644
index 0000000..07c6464
--- /dev/null
+++ b/evc/evcbase/pom.xml
@@ -0,0 +1,29 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <parent>
+ <groupId>com.cablelabs.vcpe</groupId>
+ <artifactId>evc</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ </parent>
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>com.cablelabs.vcpe</groupId>
+ <artifactId>evcbase</artifactId>
+ <packaging>jar</packaging>
+ <version>1.0-SNAPSHOT</version>
+
+ <build>
+ <finalName>evcbase</finalName>
+ </build>
+
+ <dependencies>
+ <dependency>
+ <groupId>com.cablelabs.vcpe</groupId>
+ <artifactId>cosbase</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ </dependency>
+ </dependencies>
+
+</project>
diff --git a/evc/evcbase/src/main/java/com/cablelabs/vcpe/evc/evcbase/client/EvcClient.java b/evc/evcbase/src/main/java/com/cablelabs/vcpe/evc/evcbase/client/EvcClient.java
new file mode 100644
index 0000000..25fae8b
--- /dev/null
+++ b/evc/evcbase/src/main/java/com/cablelabs/vcpe/evc/evcbase/client/EvcClient.java
@@ -0,0 +1,149 @@
+package com.cablelabs.vcpe.evc.evcbase.client;
+
+import com.cablelabs.vcpe.evc.evcbase.model.Evc;
+
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.util.List;
+
+/**
+ * Created by steve on 6/8/15.
+ */
+public class EvcClient {
+
+ private Client client; // provided by Jersey
+
+ public EvcClient() {
+ client = ClientBuilder.newClient();
+ }
+
+ //--------------------------------------------------------
+ public Evc create(Evc evc)
+ //--------------------------------------------------------
+ {
+ WebTarget target =client.target("http://localhost:9090/evcmgr/webapi/");
+ Response response = target.path("evc")
+ .request(MediaType.APPLICATION_JSON)
+ .post(Entity.entity(evc, MediaType.APPLICATION_JSON));
+
+ if (response.getStatus() != 200 ) // figure out how to use Status.OK
+ {
+ // in production you can be more specific based on reponse code, id, etc
+ throw new RuntimeException(response.getStatus() + ": there was an error on the server.");
+ }
+ return response.readEntity(Evc.class);
+ }
+
+ //--------------------------------------------------------
+ public Evc update(Evc evc)
+ //--------------------------------------------------------
+ {
+ WebTarget target =client.target("http://localhost:9090/evcmgr/webapi/");
+ Response response = target.path("evc/"+evc.getId())
+ .request(MediaType.APPLICATION_JSON)
+ .put(Entity.entity(evc, MediaType.APPLICATION_JSON));
+
+ if (response.getStatus() != 200 ) // figure out how to use Status.OK
+ {
+ // in production you can be more specific based on reponse code, id, etc
+ throw new RuntimeException(response.getStatus() + ": there was an error on the server.");
+ }
+ return response.readEntity(Evc.class);
+ }
+
+ //--------------------------------------------------------
+ public Evc get(String evcId)
+ //--------------------------------------------------------
+ // get Evc of specified ID
+
+ {
+ WebTarget target = client.target("http://localhost:9090/evcmgr/webapi/");
+
+ Response response = target.path("evc/"+evcId).request(MediaType.APPLICATION_JSON).get(Response.class);
+ if (response.getStatus() != 200) // figure out how to use Status.OK
+ {
+ // in production you can be more specific based on reponse code, id, etc
+ throw new RuntimeException(response.getStatus() + ": there was an error on the server.");
+ }
+
+ //return response;
+ return response.readEntity(Evc.class);
+ }
+
+ //--------------------------------------------------------
+ public List<Evc> getAll()
+ //--------------------------------------------------------
+ // get a list of all Evc instances
+ {
+
+ WebTarget target = client.target("http://localhost:9090/evcmgr/webapi/");
+
+ // Can I do this with a Response, so that I can check for errors
+ List<Evc> response = target.path("evc/list")
+ .request(MediaType.APPLICATION_JSON)
+ .get(new GenericType<List<Evc>>() {
+ });
+ if (response == null) // figure out how to use Status.OK
+ {
+ // in production you can be more specific based on reponse code, id, etc
+ throw new RuntimeException("there was an error on the server.");
+ }
+ return response;
+ }
+
+ //--------------------------------------------------------
+ public void delete(String evcId)
+ //--------------------------------------------------------
+ // delete Evc of specified ID
+ {
+ WebTarget target = client.target("http://localhost:9090/evcmgr/webapi/");
+ Response response = target.path("evc/"+evcId).request(MediaType.APPLICATION_JSON).delete();
+ if (response.getStatus() != 200) // figure out how to use Status.OK
+ {
+ // in production you can be more specific based on reponse code, id, etc
+ throw new RuntimeException(response.getStatus() + ": there was an error on the server.");
+ }
+ }
+
+ //--------------------------------------------------------
+ public Evc testGet()
+ //--------------------------------------------------------
+ // test marshaling of Evc class from server json
+
+ {
+ WebTarget target = client.target("http://localhost:9090/evcmgr/webapi/");
+
+ Response response = target.path("evc").request(MediaType.APPLICATION_JSON).get(Response.class);
+ if (response.getStatus() != 200) // figure out how to use Status.OK
+ {
+ // in production you can be more specific based on reponse code, id, etc
+ throw new RuntimeException(response.getStatus() + ": there was an error on the server.");
+ }
+
+ //return response;
+ return response.readEntity(Evc.class);
+ }
+
+ //--------------------------------------------------------
+ public String ping()
+ //--------------------------------------------------------
+ // test connectivity
+ {
+
+ WebTarget target = client.target("http://localhost:9090/evcmgr/webapi/");
+
+ Response response = target.path("evc").request(MediaType.TEXT_PLAIN).get();
+ if (response.getStatus() != 200) // figure out how to use Status.OK
+ {
+ // in production you can be more specific based on reponse code, id, etc
+ throw new RuntimeException(response.getStatus() + ": there was an error on the server.");
+ }
+
+ return response.readEntity(String.class);
+ }
+}
diff --git a/evc/evcbase/src/main/java/com/cablelabs/vcpe/evc/evcbase/model/Evc.java b/evc/evcbase/src/main/java/com/cablelabs/vcpe/evc/evcbase/model/Evc.java
new file mode 100644
index 0000000..f44af27
--- /dev/null
+++ b/evc/evcbase/src/main/java/com/cablelabs/vcpe/evc/evcbase/model/Evc.java
@@ -0,0 +1,235 @@
+package com.cablelabs.vcpe.evc.evcbase.model;
+
+import com.cablelabs.vcpe.common.Dbg;
+
+import javax.xml.bind.annotation.XmlRootElement;
+import java.util.List;
+
+/**
+ * Created by steve on 5/24/15.
+ */
+
+@XmlRootElement
+public class Evc
+{
+ // set up so that we can use the ENUM's as strings for REST calls & dbg prints
+
+ public enum EvcType {
+
+ UNASSIGNED ("UNASSIGNED"),
+ POINT_TO_POINT ("POINT_TO_POINT"),
+ MULTIPOINT_TO_MULTIPOINT ("MULTIPOINT_TO_MULTIPOINT"),
+ ROOTED_MULTIPOINT ("ROOTED_MULTIPOINT");
+ private final String s;
+ private EvcType(final String s) {this.s = s;}
+ @Override public String toString() { return s; }
+ }
+ public enum FrameDelivery { // may belong in more general location eventually
+
+ UNASSIGNED ("UNASSIGNED"),
+ DISCARD ("DISCARD"),
+ UNCONDITIONAL ("UNCONDITIONAL"),
+ CONDITIONAL ("CONDITIONAL");
+ private final String s;
+ private FrameDelivery(final String s) {this.s = s;}
+ @Override public String toString() { return s; }
+ }
+
+ private String id;
+ private EvcType evcType;
+ private long maxUnis;
+ private FrameDelivery unicastFrameDelivery;
+ private FrameDelivery multicastFrameDelivery;
+ private FrameDelivery broadcastFrameDelivery;
+ private List<String> uniIdList = null;
+ private List<String> uniIpList = null;
+ private List<String> uniMacList = null;
+ private boolean ceVLanIdPreservation;
+ private boolean ceVlanCosPreservation;
+ private long evcMaxSvcFrameSize; // at least 1522, should be > 1600 byte
+ private String cosId; // CoS Attributes serving as EVCPerformance attr for now
+ //private EvcPerf evcPerf = null;
+
+ // EVC Perf params
+ private double oneWayFrameDelay; // milliseconds
+ private double oneWayFrameLossRatio; // percentage
+ private double oneWayAvailability; // percentage
+
+ // zero argument constructor required for JAX-RS
+ public Evc() {
+ id = "unset";
+ evcType = EvcType.UNASSIGNED;
+ maxUnis = -1;
+ unicastFrameDelivery = FrameDelivery.UNASSIGNED;
+ multicastFrameDelivery = FrameDelivery.UNASSIGNED;;
+ broadcastFrameDelivery = FrameDelivery.UNASSIGNED;;
+ uniIdList = null;
+ uniIpList = null;
+ uniMacList = null;
+ ceVLanIdPreservation = false;
+ ceVlanCosPreservation = false;
+ evcMaxSvcFrameSize = -1;
+ cosId = "unset";
+
+ //evcPerf = new EvcPerf();
+ oneWayFrameDelay = -1.0;
+ oneWayFrameLossRatio = -1.0;
+ oneWayAvailability = -1.0;
+ }
+
+ // Utility methods
+
+ public void setAllNonPerfProps(String id, EvcType evcType, long maxUnis,
+ List<String> uniIdList, List<String> uniMacList, List<String> uniIpList,
+ FrameDelivery unicastFrameDelivery,
+ FrameDelivery multicastFrameDelivery,
+ FrameDelivery broadcastFrameDelivery,
+ boolean ceVLanIdPreservation, boolean ceVlanCosPreservation,
+ long evcMaxSvcFrameSize, String cosId) {
+ this.id = id;
+ this.evcType = evcType;
+ this.uniIdList = uniIdList;
+ this.uniMacList = uniMacList;
+ this.uniIpList = uniIpList;
+ this.maxUnis = maxUnis;
+ this.unicastFrameDelivery = unicastFrameDelivery;
+ this.multicastFrameDelivery = multicastFrameDelivery;
+ this.broadcastFrameDelivery = broadcastFrameDelivery;
+ this.ceVLanIdPreservation = ceVLanIdPreservation;
+ this.ceVlanCosPreservation = ceVlanCosPreservation;
+ this.evcMaxSvcFrameSize = evcMaxSvcFrameSize;
+ this.cosId = cosId;
+ }
+
+ public void setAllPerfProps( double oneWayFrameDelay,
+ double oneWayFrameLossRatio,
+ double oneWayAvailability )
+ {
+ this.oneWayFrameDelay = oneWayFrameDelay;
+ this.oneWayFrameLossRatio = oneWayFrameLossRatio;
+ this.oneWayAvailability = oneWayAvailability;
+ }
+
+ public void dump() { dump(0); }
+ public void dump(int tab) {
+ Dbg.p(tab, "id: " + this.id);
+ Dbg.p(tab, "cosId: " + this.cosId);
+ Dbg.p(tab, "evcType: " + this.evcType);
+ Dbg.p(tab, "maxUnis: " + this.maxUnis);
+ Dbg.p(tab, "Uni ID List:");
+ for (String uniId : uniIdList)
+ Dbg.p(tab+1, uniId);
+ Dbg.p(tab, "Uni Mac List:");
+ for (String macId : uniMacList)
+ Dbg.p(tab+1, macId);
+ Dbg.p(tab, "Uni IP List:");
+ for (String ipAddr : uniIpList)
+ Dbg.p(tab+1, ipAddr);
+ Dbg.p(tab, "UnicastFrameDelivery: " + this.unicastFrameDelivery);
+ Dbg.p(tab, "MulticastFrameDelivery: " + this.multicastFrameDelivery);
+ Dbg.p(tab, "BroadcastFrameDelivery: " + this.broadcastFrameDelivery);
+ Dbg.p(tab, "CeVLanIdPreservation: " + this.ceVLanIdPreservation);
+ Dbg.p(tab, "CeVlanCosPreservation: " + this.ceVlanCosPreservation);
+ Dbg.p(tab, "EvcMaxSvcFrameSize: " + this.evcMaxSvcFrameSize);
+ Dbg.p(tab, "--- EVC Performance Params");
+ Dbg.p(tab+1, "oneWayFrameDelay: " + this.oneWayFrameDelay);
+ Dbg.p(tab+1, "oneWayFrameLossRatio: " + this.oneWayFrameLossRatio);
+ Dbg.p(tab+1, "oneWayAvailability: " + this.oneWayAvailability);
+ }
+
+ public static void dumpList(List<Evc> evcList) { dumpList(0, evcList); }
+ public static void dumpList(int tab, List<Evc> evcList) {
+ int numEvc = 0;
+ Dbg.p("----- Evc List : [" + evcList.size() + "] elements");
+ for (Evc curEvc : evcList) {
+ numEvc++;
+ Dbg.p(tab+1, "<Entry " + numEvc+">");
+ curEvc.dump(tab+2);
+ }
+ }
+
+ // Getters & Setters
+
+ public String getId() { return id; }
+ public void setId(String id) { this.id = id; }
+
+ public EvcType getEvcType() { return evcType; }
+ public void setEvcType(EvcType evcType) { this.evcType = evcType; }
+
+ public long getMaxUnis() { return maxUnis; }
+
+ public void setMaxUnis(long maxUnis) { this.maxUnis = maxUnis; }
+
+ public FrameDelivery getUnicastFrameDelivery() { return unicastFrameDelivery; }
+ public void setUnicastFrameDelivery(FrameDelivery unicastFrameDelivery) {
+ this.unicastFrameDelivery = unicastFrameDelivery; }
+
+ public FrameDelivery getMulticastFrameDelivery() { return multicastFrameDelivery; }
+ public void setMulticastFrameDelivery(FrameDelivery multicastFrameDelivery) {
+ this.multicastFrameDelivery = multicastFrameDelivery; }
+
+ public FrameDelivery getBroadcastFrameDelivery() { return broadcastFrameDelivery; }
+ public void setBroadcastFrameDelivery(FrameDelivery broadcastFrameDelivery) {
+ this.broadcastFrameDelivery = broadcastFrameDelivery; }
+
+ public List<String> getUniIdList() { return uniIdList; }
+ public void setUniIdList(List<String> uniIdList) { this.uniIdList = uniIdList; }
+
+ public List<String> getUniMacList() { return uniMacList; }
+ public void setUniMacList(List<String> uniMacList) { this.uniMacList = uniMacList; }
+
+
+ public List<String> getUniIpList() { return uniIpList; }
+ public void setUniIpList(List<String> uniIpList) { this.uniIpList = uniIpList; }
+
+ public boolean isCeVLanIdPreservation() { return ceVLanIdPreservation; }
+ public void setCeVLanIdPreservation(boolean ceVLanIdPreservation) {
+ this.ceVLanIdPreservation = ceVLanIdPreservation; }
+
+ public boolean isCeVlanCosPreservation() { return ceVlanCosPreservation; }
+
+ public void setCeVlanCosPreservation(boolean ceVlanCosPreservation) {
+ this.ceVlanCosPreservation = ceVlanCosPreservation; }
+
+ public long getEvcMaxSvcFrameSize() { return evcMaxSvcFrameSize; }
+ public void setEvcMaxSvcFrameSize(long evcMaxSvcFrameSize) {
+ this.evcMaxSvcFrameSize = evcMaxSvcFrameSize; }
+
+ public String getCosId() { return cosId; }
+ public void setCosId(String cosId) { this.cosId = cosId; }
+
+ public double getOneWayFrameDelay() { return oneWayFrameDelay; }
+ public void setOneWayFrameDelay(double oneWayFrameDelay) { this.oneWayFrameDelay = oneWayFrameDelay; }
+
+ public double getOneWayFrameLossRatio() { return oneWayFrameLossRatio; }
+ public void setOneWayFrameLossRatio(double oneWayFrameLossRatio) { this.oneWayFrameLossRatio = oneWayFrameLossRatio; }
+
+ public double getOneWayAvailability() { return oneWayAvailability; }
+ public void setOneWayAvailability(double oneWayAvailability) { this.oneWayAvailability = oneWayAvailability; }
+
+
+ // Someday might make sense to put all EVC Perf params in seperate class
+// private class EvcPerf {
+// private long oneWayFrameDelay; // milliseconds
+// private long oneWayFrameDelayRange; // milliseconds
+//
+//
+// public EvcPerf () {
+// this.oneWayFrameDelay = -333;
+// this.oneWayFrameDelayRange = -333;
+// }
+//
+// public void setAllParams (long oneWayFrameDelay, long oneWayFrameDelayRange) {
+// this.oneWayFrameDelay = oneWayFrameDelay;
+// this.oneWayFrameDelayRange = oneWayFrameDelayRange;
+// }
+//
+// public long getOneWayFrameDelay() { return oneWayFrameDelay; }
+// public void setOneWayFrameDelay(long oneWayFrameDelay) {
+// this.oneWayFrameDelay = oneWayFrameDelay; }
+//
+// public long getOneWayFrameDelayRange() { return oneWayFrameDelayRange; }
+// public void setOneWayFrameDelayRange(long oneWayFrameDelayRange) {
+// this.oneWayFrameDelayRange = oneWayFrameDelayRange; }
+// }
+}
diff --git a/evc/evcbase/src/main/java/com/cablelabs/vcpe/evc/evcbase/model/EvcPerformance.java b/evc/evcbase/src/main/java/com/cablelabs/vcpe/evc/evcbase/model/EvcPerformance.java
new file mode 100644
index 0000000..e1bd19e
--- /dev/null
+++ b/evc/evcbase/src/main/java/com/cablelabs/vcpe/evc/evcbase/model/EvcPerformance.java
@@ -0,0 +1,102 @@
+package com.cablelabs.vcpe.evc.evcbase.model;
+
+import com.cablelabs.vcpe.common.Dbg;
+
+/**
+ * Created by steve on 6/9/15.
+ */
+public class EvcPerformance {
+
+ private String cosId; // associated CoS
+ private long oneWayFrameDelay; // milliseconds
+ private long oneWayFrameDelayRange; // milliseconds
+ private long oneWayMeanFrameDelay; // milliseconds
+ private long oneWayInterFrameDelayVariation; // milliseconds
+ private double oneWayFrameLossRatio; // percentage
+ private double oneWayAvailability; // percentage
+ private long oneWayResilHighLossIntervals; //count
+ private long oneWayResilConsecHighLossIntervals; //count
+
+ // zero argument constructor required for JAX-RS
+ public EvcPerformance() {
+ oneWayFrameDelay = -1;
+ oneWayFrameDelayRange = -1;
+ oneWayMeanFrameDelay = -1;
+ oneWayInterFrameDelayVariation = -1;
+ oneWayFrameLossRatio = -1.0;
+ oneWayAvailability = -1.0;
+ oneWayResilHighLossIntervals = -1;
+ oneWayResilConsecHighLossIntervals = -1;
+ }
+
+ public void setAllProps (String cosId, long oneWayFrameDelay, long oneWayFrameDelayRange,
+ long oneWayMeanFrameDelay, long oneWayInterFrameDelayVariation,
+ double oneWayFrameLossRatio, double oneWayAvailability,
+ long oneWayResilHighLossIntervals, long oneWayResilConsecHighLossIntervals)
+ {
+ this.cosId = cosId;
+ this.oneWayFrameDelay = oneWayFrameDelay;
+ this.oneWayFrameDelayRange = oneWayFrameDelayRange;
+ this.oneWayMeanFrameDelay = oneWayMeanFrameDelay;
+ this.oneWayInterFrameDelayVariation = oneWayInterFrameDelayVariation;
+ this.oneWayFrameLossRatio = oneWayFrameLossRatio;
+ this.oneWayAvailability = oneWayAvailability;
+ this.oneWayResilHighLossIntervals = oneWayResilHighLossIntervals;
+ this.oneWayResilConsecHighLossIntervals = oneWayResilConsecHighLossIntervals;
+ }
+
+
+ // util fxns
+
+ public void dump() { dump(0); }
+ public void dump(int tab) {
+ Dbg.p(tab, "cosId: " + this.cosId);
+ Dbg.p(tab, "oneWayFrameDelay: " + this.oneWayFrameDelay);
+ Dbg.p(tab, "oneWayFrameDelayRange: " + this.oneWayFrameDelayRange);
+ Dbg.p(tab, "oneWayMeanFrameDelay: " + this.oneWayMeanFrameDelay);
+ Dbg.p(tab, "oneWayFrameLossRatio: " + this.oneWayFrameLossRatio);
+ Dbg.p(tab, "oneWayAvailability: " + this.oneWayAvailability);
+ Dbg.p(tab, "oneWayInterFrameDelayVariation: " + this.oneWayInterFrameDelayVariation);
+ Dbg.p(tab, "oneWayResilHighLossIntervals: " + this.oneWayResilHighLossIntervals);
+ Dbg.p(tab, "oneWayResilConsecHighLossIntervals: " + this.oneWayResilConsecHighLossIntervals);
+ }
+
+ // Getters and setters
+
+ public String getCosId() { return cosId; }
+ public void setCosId(String cosId) { this.cosId = cosId; }
+
+ public long getOneWayFrameDelay() { return oneWayFrameDelay; }
+ public void setOneWayFrameDelay(long oneWayFrameDelay) {
+ this.oneWayFrameDelay = oneWayFrameDelay; }
+
+ public long getOneWayFrameDelayRange() { return oneWayFrameDelayRange; }
+ public void setOneWayFrameDelayRange(long oneWayFrameDelayRange) {
+ this.oneWayFrameDelayRange = oneWayFrameDelayRange; }
+
+ public long getOneWayMeanFrameDelay() { return oneWayMeanFrameDelay; }
+ public void setOneWayMeanFrameDelay(long oneWayMeanFrameDelay) {
+ this.oneWayMeanFrameDelay = oneWayMeanFrameDelay; }
+
+ public long getOneWayInterFrameDelayVariation() { return oneWayInterFrameDelayVariation; }
+ public void setOneWayInterFrameDelayVariation(long oneWayInterFrameDelayVariation) {
+ this.oneWayInterFrameDelayVariation = oneWayInterFrameDelayVariation; }
+
+ public double getOneWayFrameLossRatio() { return oneWayFrameLossRatio; }
+ public void setOneWayFrameLossRatio(double oneWayFrameLossRatio) {
+ this.oneWayFrameLossRatio = oneWayFrameLossRatio; }
+
+ public double getOneWayAvailability() { return oneWayAvailability; }
+ public void setOneWayAvailability(double oneWayAvailability) {
+ this.oneWayAvailability = oneWayAvailability; }
+
+ public long getOneWayResilHighLossIntervals() { return oneWayResilHighLossIntervals; }
+ public void setOneWayResilHighLossIntervals(long oneWayResilHighLossIntervals) {
+ this.oneWayResilHighLossIntervals = oneWayResilHighLossIntervals; }
+
+ public long getOneWayResilConsecHighLossIntervals() { return oneWayResilConsecHighLossIntervals; }
+ public void setOneWayResilConsecHighLossIntervals(long oneWayResilConsecHighLossIntervals) {
+ this.oneWayResilConsecHighLossIntervals = oneWayResilConsecHighLossIntervals; }
+
+
+}
diff --git a/evc/evcbase/src/main/java/com/cablelabs/vcpe/evc/evcbase/repository/EvcRespository.java b/evc/evcbase/src/main/java/com/cablelabs/vcpe/evc/evcbase/repository/EvcRespository.java
new file mode 100644
index 0000000..80bebc7
--- /dev/null
+++ b/evc/evcbase/src/main/java/com/cablelabs/vcpe/evc/evcbase/repository/EvcRespository.java
@@ -0,0 +1,21 @@
+package com.cablelabs.vcpe.evc.evcbase.repository;
+
+import com.cablelabs.vcpe.evc.evcbase.model.Evc;
+
+import java.util.List;
+
+/**
+ * Created by steve on 5/25/15.
+ */
+public interface EvcRespository
+{
+ // TODO add exceptions
+
+ Evc add(Evc evc); // returns null if already exists, otherwise returns stored evc
+ Evc get(String evcId); // returns null if not found, otherwise stored evc
+ Evc update(Evc evc); // returns null if did not exit, otherwise evc as it was previous to update (put in any case)
+ Evc delete(String evcId); // returns null if not found, otherwise evc as it was previous to delete
+ int count(); // number of Evc stored in the repo
+ public void dump(int tab); // print out contents of the repo
+ List<Evc> getAll();
+}
diff --git a/evc/evcbase/src/main/java/com/cablelabs/vcpe/evc/evcbase/repository/EvcRespositoryInMem.java b/evc/evcbase/src/main/java/com/cablelabs/vcpe/evc/evcbase/repository/EvcRespositoryInMem.java
new file mode 100644
index 0000000..158ae3f
--- /dev/null
+++ b/evc/evcbase/src/main/java/com/cablelabs/vcpe/evc/evcbase/repository/EvcRespositoryInMem.java
@@ -0,0 +1,91 @@
+package com.cablelabs.vcpe.evc.evcbase.repository;
+
+import com.cablelabs.vcpe.common.Dbg;
+import com.cablelabs.vcpe.evc.evcbase.model.Evc;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * Created by steve on 5/24/15.
+ */
+
+
+/*
+ Singleton that contains a hashmap which holds instances of Evc objects, indexed by CiS ID
+ */
+
+public enum EvcRespositoryInMem implements EvcRespository {
+ INSTANCE; // Singleton
+
+ private Map<String, Evc> evcDB = new ConcurrentHashMap<>();
+
+ @Override
+ //--------------------------------------------------------
+ public Evc add(Evc evc)
+ //--------------------------------------------------------
+ {
+ if ( this.get(evc.getId()) != null ) {
+ return null;
+ }
+ evcDB.put(evc.getId(), evc );
+ return evc;
+ }
+
+ @Override
+ //--------------------------------------------------------
+ public Evc get(String evcId) {
+ return evcDB.get(evcId);
+ }
+ //--------------------------------------------------------
+
+ @Override
+ //--------------------------------------------------------
+ public Evc update(Evc evc)
+ //--------------------------------------------------------
+ {
+ // put returns null if evc did not exist, other returns evc as it stood prior to put
+ return evcDB.put(evc.getId(), evc);
+ }
+
+ @Override
+ //--------------------------------------------------------
+ public Evc delete(String evcId)
+ //--------------------------------------------------------
+ {
+ // remove returns null if evc did not exist, other returns evc as it stood prior to remove
+ return evcDB.remove(evcId);
+ }
+
+ @Override
+ //--------------------------------------------------------
+ public int count() {
+ return evcDB.size();
+ }
+ //--------------------------------------------------------
+
+ @Override
+ //--------------------------------------------------------
+ public List<Evc> getAll()
+ //--------------------------------------------------------
+ {
+ List<Evc> evcList = new ArrayList<Evc>(evcDB.values());
+ return evcList;
+ }
+
+ @Override
+ //--------------------------------------------------------
+ public void dump(int tab)
+ //--------------------------------------------------------
+ {
+ Dbg.p(tab, "Evc Repo: " + evcDB.size() + " entrie(s)");
+ int numEvc = 0;
+ for (Evc curEvc : evcDB.values()) {
+ numEvc++;
+ Dbg.p(tab+1, "<Entry " + numEvc+">");
+ curEvc.dump(tab+2);
+ }
+ }
+}
diff --git a/evc/evcbase/src/test/java/com/cablelabs/vcpe/evc/evcbase/client/EvcClientTest.java b/evc/evcbase/src/test/java/com/cablelabs/vcpe/evc/evcbase/client/EvcClientTest.java
new file mode 100644
index 0000000..3f62320
--- /dev/null
+++ b/evc/evcbase/src/test/java/com/cablelabs/vcpe/evc/evcbase/client/EvcClientTest.java
@@ -0,0 +1,163 @@
+package com.cablelabs.vcpe.evc.evcbase.client;
+
+import com.cablelabs.vcpe.common.Dbg;
+import com.cablelabs.vcpe.cos.cosbase.client.CoSClient;
+import com.cablelabs.vcpe.cos.cosbase.model.CoS;
+import com.cablelabs.vcpe.evc.evcbase.model.Evc;
+
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * Created by steve on 6/8/15.
+ */
+public class EvcClientTest {
+
+ @Test
+ public void testAll() throws Exception {
+
+ // We have to have a CoS for Evc to referece
+ CoSClient coSClient = new CoSClient();
+
+ // Add gold service to CoS layer
+ CoS gold = new CoS();
+ gold.setAllProps("gold", 100, 0.99, 17.43, 2.43, 0.01);
+ Dbg.p("gold svc being created in CoS");
+
+ gold = coSClient.create(gold);
+ assertNotNull(gold);
+
+ Evc evc_1 = new Evc();
+
+ List<String> uniIdList1 = new ArrayList<String>();
+ uniIdList1.add("unset-id-1");
+ uniIdList1.add("unset-id-1");
+
+ List<String> uniMacList1 = new ArrayList<String>();
+ uniMacList1.add("11:00:11:11:11:11");
+ uniMacList1.add("11:00:22:22:22:22");
+
+ List<String> ipList1 = new ArrayList<String>();
+ ipList1.add("192.168.1.1");
+ ipList1.add("192.168.1.2");
+
+ evc_1.setAllNonPerfProps("id-unset-1",
+ Evc.EvcType.POINT_TO_POINT, 2, uniIdList1, uniMacList1, ipList1,
+ Evc.FrameDelivery.UNCONDITIONAL,
+ Evc.FrameDelivery.UNCONDITIONAL,
+ Evc.FrameDelivery.UNCONDITIONAL,
+ true, true, 1600, gold.getId());
+
+ EvcClient evcClient = new EvcClient();
+ Dbg.p(evc_1.getId()+" being created via evcmgr");
+ evc_1.dump(1);
+
+ evc_1 = evcClient.create(evc_1);
+ assertNotNull(evc_1);
+
+ Evc retrievedEvc = evcClient.get(evc_1.getId());
+ assertNotNull(retrievedEvc);
+ Dbg.p("evc just retrieved from Evc Service");
+ retrievedEvc.dump(1);
+ retrievedEvc = null;
+
+ evc_1.setBroadcastFrameDelivery(Evc.FrameDelivery.DISCARD);
+ Dbg.p("EVC["+ evc_1.getId()+ "] : about to be updated");
+ evc_1.dump(1);
+ assertNotNull(evcClient.update(evc_1));
+ retrievedEvc = evcClient.get(evc_1.getId());
+ assertNotNull(retrievedEvc);
+ Dbg.p("EVC["+ evc_1.getId()+ "] : retrieved after the update");
+ retrievedEvc.dump(1);
+
+ Evc evc_2 = new Evc();
+ Evc evc_3 = new Evc();
+
+ List<String> uniIdList2 = new ArrayList<String>();
+ uniIdList2.add("unset-id-11");
+ uniIdList2.add("unset-id-22");
+
+ List<String> uniIdList3 = new ArrayList<String>();
+ uniIdList3.add("unset-id-111");
+ uniIdList3.add("unset-id-222");
+
+ List<String> uniMacList2 = new ArrayList<String>();
+ uniMacList2.add("22:00:11:11:11:11");
+ uniMacList2.add("22:00:22:22:22:22");
+
+ List<String> uniMacList3 = new ArrayList<String>();
+ uniMacList3.add("33:00:11:11:11:11");
+ uniMacList3.add("33:00:22:22:22:22");
+
+ List<String> ipList2 = new ArrayList<String>();
+ ipList2.add("192.168.2.1");
+ ipList2.add("192.168.2.2");
+
+ List<String> ipList3 = new ArrayList<String>();
+ ipList3.add("192.168.3.1");
+ ipList3.add("192.168.3.2");
+
+ evc_2.setAllNonPerfProps("id-unset-2",
+ Evc.EvcType.ROOTED_MULTIPOINT, 2, uniIdList2, uniMacList2, ipList2,
+ Evc.FrameDelivery.CONDITIONAL,
+ Evc.FrameDelivery.CONDITIONAL,
+ Evc.FrameDelivery.CONDITIONAL,
+ true, false, 1111, gold.getId());
+
+ evc_3.setAllNonPerfProps("id-unset-3",
+ Evc.EvcType.MULTIPOINT_TO_MULTIPOINT, 2, uniIdList3, uniMacList2, ipList3,
+ Evc.FrameDelivery.DISCARD,
+ Evc.FrameDelivery.DISCARD,
+ Evc.FrameDelivery.DISCARD,
+ false, true, 2222, gold.getId());
+
+ evc_2 = evcClient.create(evc_2);
+ assertNotNull(evc_2);
+
+ evc_3 = evcClient.create(evc_3);
+ assertNotNull(evc_3);
+
+ List<Evc> evcList = evcClient.getAll();
+ assertNotNull(evcList);
+ assertEquals(evcList.size(), 3);
+
+ Evc.dumpList(evcList);
+
+ evcClient.delete(evc_3.getId());
+ evcList = evcClient.getAll();
+ assertNotNull(evcList);
+ assertEquals(evcList.size(),2);
+ Evc.dumpList(evcList);
+
+ evcClient.delete(evc_2.getId());
+ evcList = evcClient.getAll();
+ assertNotNull(evcList);
+ assertEquals(evcList.size(),1);
+ Evc.dumpList(evcList);
+
+ evcClient.delete(evc_1.getId());
+ evcList = evcClient.getAll();
+ assertNotNull(evcList);
+ assertEquals(evcList.size(),0);
+ Evc.dumpList(evcList);
+ }
+
+ @Test
+ public void testTestGet() throws Exception {
+ EvcClient evcClient = new EvcClient();
+ Evc evc = evcClient.testGet();
+ evc.dump();;
+ }
+
+ @Test
+ public void testPing() throws Exception {
+
+ EvcClient evcClient = new EvcClient();
+ String resp = evcClient.ping();
+ Dbg.p(resp);
+ }
+}
diff --git a/evc/evcbase/src/test/java/com/cablelabs/vcpe/evc/evcbase/repository/EvcRepositoryTest.java b/evc/evcbase/src/test/java/com/cablelabs/vcpe/evc/evcbase/repository/EvcRepositoryTest.java
new file mode 100644
index 0000000..402d20b
--- /dev/null
+++ b/evc/evcbase/src/test/java/com/cablelabs/vcpe/evc/evcbase/repository/EvcRepositoryTest.java
@@ -0,0 +1,120 @@
+package com.cablelabs.vcpe.evc.evcbase.repository;
+
+import com.cablelabs.vcpe.cos.cosbase.model.CoS;
+import com.cablelabs.vcpe.evc.evcbase.model.Evc;
+
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.*;
+
+/**
+ * Created by steve on 5/25/15.
+ */
+public class EvcRepositoryTest
+{
+
+ @Test
+ public void test() {
+
+ // First, create a couple of CoS's to reference
+ CoS gold = new CoS();
+ CoS silver = new CoS();
+ CoS bronze = new CoS();
+
+ // id CIR/MBS avail delay jitter frameloss
+ gold.setAllProps("gold", 100, 0.99, 17.43, 2.43, 0.01);
+ silver.setAllProps("silver", 50, 0.95, 27.43, 2.43, 0.02);
+ bronze.setAllProps("bronze", 25, 0.90, 37.43, 2.43, 0.03);
+
+ Evc evc_1 = new Evc();
+ Evc evc_2 = new Evc();
+ Evc evc_3 = new Evc();
+
+ List<String> uniIdList = new ArrayList<String>();
+ uniIdList.add("UNI-1");
+ uniIdList.add("UNI-2");
+
+ List<String> uniMacList = new ArrayList<String>();
+ uniMacList.add("11:11:11:11:11:11");
+ uniMacList.add("22:22:22:22:22:22");
+
+ List<String> uniIpList = new ArrayList<String>();
+ uniIpList.add("192.168.1.1");
+ uniIpList.add("192.168.1.2");
+
+ evc_1.setAllNonPerfProps("evc_1",
+ Evc.EvcType.POINT_TO_POINT, 2, uniIdList, uniMacList, uniIpList,
+ Evc.FrameDelivery.UNCONDITIONAL,
+ Evc.FrameDelivery.UNCONDITIONAL,
+ Evc.FrameDelivery.UNCONDITIONAL,
+ true, true, 1600, gold.getId());
+ evc_2.setAllNonPerfProps("evc_2",
+ Evc.EvcType.POINT_TO_POINT, 2, uniIdList, uniMacList, uniIpList,
+ Evc.FrameDelivery.UNCONDITIONAL,
+ Evc.FrameDelivery.UNCONDITIONAL,
+ Evc.FrameDelivery.UNCONDITIONAL,
+ true, true, 1500, silver.getId());
+ evc_3.setAllNonPerfProps("evc_3",
+ Evc.EvcType.POINT_TO_POINT, 2, uniIdList, uniMacList, uniIpList,
+ Evc.FrameDelivery.UNCONDITIONAL,
+ Evc.FrameDelivery.UNCONDITIONAL,
+ Evc.FrameDelivery.UNCONDITIONAL,
+ true, true, 1400, bronze.getId());
+
+ evc_1.dump();
+ evc_2.dump();
+ evc_3.dump();
+
+ EvcRespository repo = EvcRespositoryInMem.INSTANCE;
+
+ assertNotNull(repo.add(evc_1));
+ assertNotNull(repo.add(evc_2));
+ assertNotNull(repo.add(evc_3));
+ assertNull(repo.add(evc_3)); // duplicate
+ assertEquals(repo.count(), 3);
+
+ assertNotNull(repo.get(evc_1.getId()));
+ assertNotNull(repo.get(evc_2.getId()));
+ assertNotNull(repo.get(evc_3.getId()));
+
+ assertNotNull(repo.delete(evc_2.getId()));
+ assertNull(repo.delete(evc_2.getId()));
+ assertNull(repo.delete("not-in-repo"));
+ assertEquals(repo.count(), 2);
+
+ assertEquals(repo.get(evc_1.getId()).getEvcMaxSvcFrameSize(), 1600);
+ assertNotEquals(repo.get(evc_3.getId()).getEvcMaxSvcFrameSize(), 1600);
+
+ Evc evc_4 = new Evc();
+ evc_4.setAllNonPerfProps("evc_4",
+ Evc.EvcType.POINT_TO_POINT, 2, uniIdList, uniMacList, uniIpList,
+ Evc.FrameDelivery.UNCONDITIONAL,
+ Evc.FrameDelivery.UNCONDITIONAL,
+ Evc.FrameDelivery.UNCONDITIONAL,
+ true, true, 1200, bronze.getId());
+
+ assertNull(repo.update(evc_4)); // update non-existent cos
+ assertEquals(repo.count(), 3);
+ assertEquals(repo.get("evc_4").getEvcMaxSvcFrameSize(), 1200);
+
+ evc_4.setEvcMaxSvcFrameSize(1250);
+ assertNotNull(repo.update(evc_4)); // update existing evc, same object
+ assertEquals(repo.get(evc_4.getId()).getEvcMaxSvcFrameSize(), 1250);
+
+ evc_4.dump();
+
+ Evc evc_4_2 = new Evc();
+ evc_4_2.setAllNonPerfProps("evc_4",
+ Evc.EvcType.POINT_TO_POINT, 2, uniIdList, uniMacList, uniIpList,
+ Evc.FrameDelivery.UNCONDITIONAL,
+ Evc.FrameDelivery.UNCONDITIONAL,
+ Evc.FrameDelivery.UNCONDITIONAL,
+ true, true, 500, bronze.getId());
+
+ assertNotNull(repo.update(evc_4_2)); // update evc, new object
+ assertEquals(repo.get(evc_4_2.getId()).getEvcMaxSvcFrameSize(), 500);
+ }
+}
diff --git a/evc/evcbase/target/classes/com/cablelabs/vcpe/evc/evcbase/client/EvcClient$1.class b/evc/evcbase/target/classes/com/cablelabs/vcpe/evc/evcbase/client/EvcClient$1.class
new file mode 100644
index 0000000..dc9831c
--- /dev/null
+++ b/evc/evcbase/target/classes/com/cablelabs/vcpe/evc/evcbase/client/EvcClient$1.class
Binary files differ
diff --git a/evc/evcbase/target/classes/com/cablelabs/vcpe/evc/evcbase/client/EvcClient.class b/evc/evcbase/target/classes/com/cablelabs/vcpe/evc/evcbase/client/EvcClient.class
new file mode 100644
index 0000000..cd2b87f
--- /dev/null
+++ b/evc/evcbase/target/classes/com/cablelabs/vcpe/evc/evcbase/client/EvcClient.class
Binary files differ
diff --git a/evc/evcbase/target/classes/com/cablelabs/vcpe/evc/evcbase/model/Evc$EvcType.class b/evc/evcbase/target/classes/com/cablelabs/vcpe/evc/evcbase/model/Evc$EvcType.class
new file mode 100644
index 0000000..f08d7f9
--- /dev/null
+++ b/evc/evcbase/target/classes/com/cablelabs/vcpe/evc/evcbase/model/Evc$EvcType.class
Binary files differ
diff --git a/evc/evcbase/target/classes/com/cablelabs/vcpe/evc/evcbase/model/Evc$FrameDelivery.class b/evc/evcbase/target/classes/com/cablelabs/vcpe/evc/evcbase/model/Evc$FrameDelivery.class
new file mode 100644
index 0000000..d0622b1
--- /dev/null
+++ b/evc/evcbase/target/classes/com/cablelabs/vcpe/evc/evcbase/model/Evc$FrameDelivery.class
Binary files differ
diff --git a/evc/evcbase/target/classes/com/cablelabs/vcpe/evc/evcbase/model/Evc.class b/evc/evcbase/target/classes/com/cablelabs/vcpe/evc/evcbase/model/Evc.class
new file mode 100644
index 0000000..7f317d0
--- /dev/null
+++ b/evc/evcbase/target/classes/com/cablelabs/vcpe/evc/evcbase/model/Evc.class
Binary files differ
diff --git a/evc/evcbase/target/classes/com/cablelabs/vcpe/evc/evcbase/model/EvcPerformance.class b/evc/evcbase/target/classes/com/cablelabs/vcpe/evc/evcbase/model/EvcPerformance.class
new file mode 100644
index 0000000..c377b6e
--- /dev/null
+++ b/evc/evcbase/target/classes/com/cablelabs/vcpe/evc/evcbase/model/EvcPerformance.class
Binary files differ
diff --git a/evc/evcbase/target/classes/com/cablelabs/vcpe/evc/evcbase/repository/EvcRespository.class b/evc/evcbase/target/classes/com/cablelabs/vcpe/evc/evcbase/repository/EvcRespository.class
new file mode 100644
index 0000000..9aee4c8
--- /dev/null
+++ b/evc/evcbase/target/classes/com/cablelabs/vcpe/evc/evcbase/repository/EvcRespository.class
Binary files differ
diff --git a/evc/evcbase/target/classes/com/cablelabs/vcpe/evc/evcbase/repository/EvcRespositoryInMem.class b/evc/evcbase/target/classes/com/cablelabs/vcpe/evc/evcbase/repository/EvcRespositoryInMem.class
new file mode 100644
index 0000000..5fc5a14
--- /dev/null
+++ b/evc/evcbase/target/classes/com/cablelabs/vcpe/evc/evcbase/repository/EvcRespositoryInMem.class
Binary files differ
diff --git a/evc/evcbase/target/evcbase.jar b/evc/evcbase/target/evcbase.jar
new file mode 100644
index 0000000..f4f5b3a
--- /dev/null
+++ b/evc/evcbase/target/evcbase.jar
Binary files differ
diff --git a/evc/evcbase/target/maven-archiver/pom.properties b/evc/evcbase/target/maven-archiver/pom.properties
new file mode 100644
index 0000000..2831fc8
--- /dev/null
+++ b/evc/evcbase/target/maven-archiver/pom.properties
@@ -0,0 +1,5 @@
+#Generated by Maven
+#Thu Aug 06 14:01:19 PDT 2015
+version=1.0-SNAPSHOT
+groupId=com.cablelabs.vcpe
+artifactId=evcbase
diff --git a/evc/evcbase/target/test-classes/com/cablelabs/vcpe/evc/evcbase/client/EvcClientTest.class b/evc/evcbase/target/test-classes/com/cablelabs/vcpe/evc/evcbase/client/EvcClientTest.class
new file mode 100644
index 0000000..e7190fc
--- /dev/null
+++ b/evc/evcbase/target/test-classes/com/cablelabs/vcpe/evc/evcbase/client/EvcClientTest.class
Binary files differ
diff --git a/evc/evcbase/target/test-classes/com/cablelabs/vcpe/evc/evcbase/repository/EvcRepositoryTest.class b/evc/evcbase/target/test-classes/com/cablelabs/vcpe/evc/evcbase/repository/EvcRepositoryTest.class
new file mode 100644
index 0000000..c9cf627
--- /dev/null
+++ b/evc/evcbase/target/test-classes/com/cablelabs/vcpe/evc/evcbase/repository/EvcRepositoryTest.class
Binary files differ
diff --git a/evc/evcmgr/pom.xml b/evc/evcmgr/pom.xml
new file mode 100644
index 0000000..1a16633
--- /dev/null
+++ b/evc/evcmgr/pom.xml
@@ -0,0 +1,39 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <parent>
+ <groupId>com.cablelabs.vcpe</groupId>
+ <artifactId>evc</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ </parent>
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>com.cablelabs.vcpe</groupId>
+ <artifactId>evcmgr</artifactId>
+ <packaging>war</packaging>
+ <version>1.0-SNAPSHOT</version>
+
+ <build>
+ <finalName>evcmgr</finalName>
+ </build>
+
+ <dependencies>
+ <dependency>
+ <groupId>com.cablelabs.vcpe</groupId>
+ <artifactId>evcbase</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>com.cablelabs.vcpe</groupId>
+ <artifactId>cosbase</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>com.cablelabs.vcpe</groupId>
+ <artifactId>unibase</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ </dependency>
+ </dependencies>
+
+</project>
diff --git a/evc/evcmgr/src/main/java/com/cablelabs/vcpe/evc/evcmgr/CORSResponseFilter.java b/evc/evcmgr/src/main/java/com/cablelabs/vcpe/evc/evcmgr/CORSResponseFilter.java
new file mode 100644
index 0000000..c224252
--- /dev/null
+++ b/evc/evcmgr/src/main/java/com/cablelabs/vcpe/evc/evcmgr/CORSResponseFilter.java
@@ -0,0 +1,24 @@
+package com.cablelabs.vcpe.evc.evcmgr;
+
+import javax.ws.rs.container.ContainerRequestContext;
+import javax.ws.rs.container.ContainerResponseContext;
+import javax.ws.rs.container.ContainerResponseFilter;
+import javax.ws.rs.core.MultivaluedMap;
+import java.io.IOException;
+
+//
+// enable cross origin responses, otherwise we can't send rest requests from domain different than that of the server hosting our service
+//
+
+public class CORSResponseFilter implements ContainerResponseFilter {
+
+ public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
+ throws IOException {
+
+ MultivaluedMap<String, Object> headers = responseContext.getHeaders();
+ headers.add("Access-Control-Allow-Origin", "*");
+ headers.add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
+ headers.add("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, X-Codingpedia");
+ }
+
+}
diff --git a/evc/evcmgr/src/main/java/com/cablelabs/vcpe/evc/evcmgr/EvcJaxRsApplication.java b/evc/evcmgr/src/main/java/com/cablelabs/vcpe/evc/evcmgr/EvcJaxRsApplication.java
new file mode 100644
index 0000000..5d46297
--- /dev/null
+++ b/evc/evcmgr/src/main/java/com/cablelabs/vcpe/evc/evcmgr/EvcJaxRsApplication.java
@@ -0,0 +1,18 @@
+package com.cablelabs.vcpe.evc.evcmgr;
+
+import org.glassfish.jersey.server.ResourceConfig;
+
+//
+// In order to avoid CORS issues, register our CORS Response filter
+//
+
+public class EvcJaxRsApplication extends ResourceConfig {
+
+ /**
+ * Register JAX-RS application components.
+ */
+ public EvcJaxRsApplication() {
+ packages("com.cablelabs.vcpe.cos.cosmgr");
+ register(CORSResponseFilter.class);
+ }
+} \ No newline at end of file
diff --git a/evc/evcmgr/src/main/java/com/cablelabs/vcpe/evc/evcmgr/EvcService.java b/evc/evcmgr/src/main/java/com/cablelabs/vcpe/evc/evcmgr/EvcService.java
new file mode 100644
index 0000000..a9943fd
--- /dev/null
+++ b/evc/evcmgr/src/main/java/com/cablelabs/vcpe/evc/evcmgr/EvcService.java
@@ -0,0 +1,286 @@
+package com.cablelabs.vcpe.evc.evcmgr;
+
+import com.cablelabs.vcpe.common.Dbg;
+import com.cablelabs.vcpe.cos.cosbase.model.CoS;
+import com.cablelabs.vcpe.cos.cosbase.client.CoSClient;
+import com.cablelabs.vcpe.uni.unibase.client.EvcPathClient;
+import com.cablelabs.vcpe.uni.unibase.model.EvcPath;
+import com.cablelabs.vcpe.uni.unibase.model.Uni;
+import com.cablelabs.vcpe.uni.unibase.client.UniClient;
+import com.cablelabs.vcpe.evc.evcbase.model.Evc;
+import com.cablelabs.vcpe.evc.evcbase.repository.EvcRespositoryInMem;
+
+import javax.ws.rs.*;
+import javax.ws.rs.core.GenericEntity;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Root resource (exposed at "evc" path)
+ */
+
+//public class EvcService implements EvcServiceJAXRS {
+
+@Path("evc")
+public class EvcService {
+
+ // for proof of concept, evc ID will be unique via this counter. For projecution of course
+ // that does not scale, and does not survive restart, and another method will be needed
+ static private long evcIdCounter = 1;
+ static private long uniIdCounter = 1;
+
+
+ @POST
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Produces(MediaType.APPLICATION_JSON)
+ //--------------------------------------------------------
+ public Response create(Evc evc) throws Exception
+ //--------------------------------------------------------
+ {
+ if ( evc == null ||
+ evc.getUniMacList() == null ||
+ evc.getUniIdList() == null ||
+ evc.getUniMacList().size() != 2 ||
+ evc.getUniIdList().size() != 2 ||
+ evc.getUniIpList().size() != 2 )
+ {
+ return Response.status(Response.Status.BAD_REQUEST).build();
+ }
+
+ Dbg.p("\nADDING [" + evc.getId() + "] to evc repo");
+
+ // Need to get cos params based on incoming cos ID
+ CoSClient cosClient = new CoSClient();
+ CoS cos = cosClient.get(evc.getCosId());
+ if (cos == null) {
+ return Response.status(Response.Status.NOT_FOUND).build();
+ }
+
+ // set the evc Perf properties according to CoS
+ evc.setAllPerfProps( cos.getFrameDelay(),
+ cos.getFrameLoss(),
+ cos.getAvailbility());
+
+ Dbg.p("... EVC SVC: retrieved following cos info");
+ cos.dump(1);
+
+ // We need a unique EVC ID, using internal counter for the prototype
+ evc.setId("evc-"+ evcIdCounter++);
+
+ //
+ // Create the two unis in ODL
+ //
+
+ Uni.SvcSpeed svcSpeed = Uni.cirToSvcSpeed( cos.getCommitedInfoRate());
+ Uni.PhysMedium physMedium = Uni.svcSpeedToPhysMedium(svcSpeed ); // just for demo
+ // for production need to pull from host
+ Uni uni1 = new Uni();
+ uni1.setAllProps("uni-" + uniIdCounter++,
+ svcSpeed,
+ evc.getUniIpList().get(0),
+ evc.getUniMacList().get(0),
+ physMedium,
+ Uni.MacLayer.IEEE_802_3,
+ Uni.SyncMode.ENABLED,
+ Uni.Type.UNITYPE,
+ 1600);
+
+ Uni uni2 = new Uni();
+ uni2.setAllProps("uni-" + uniIdCounter++,
+ svcSpeed,
+ evc.getUniIpList().get(1),
+ evc.getUniMacList().get(1),
+ physMedium,
+ Uni.MacLayer.IEEE_802_3,
+ Uni.SyncMode.ENABLED,
+ Uni.Type.UNITYPE,
+ 1600);
+
+ // RESTCONF expecting PUT on create, so do an update instead of create
+ UniClient uniClient = new UniClient();
+ uniClient.update(uni1);
+ uniClient.update(uni2);
+
+ // Give ODL a chance to finish creating the UNIs before moving on
+ // NOTE: Should be fixed on ODL side eventually via synchronized message handling
+ try{
+ Thread.sleep(1000);
+ } catch(InterruptedException ex)
+ {Thread.currentThread().interrupt();
+ }
+
+ //
+ // Create the evc path in ODL
+ //
+
+ EvcPath evcPath = new EvcPath( evc.getId(), uni1, uni2,
+ svcSpeed, svcSpeed, cos.getId());
+ EvcPathClient evcPathClient = new EvcPathClient();
+ evcPathClient.update(evcPath);
+
+ //
+ // Finish up with the evc
+ //
+
+ // Set our UNI IDs for the EVC here
+ // eventually they will be generated and returned by ODL
+ evc.getUniIdList().set(0,uni1.getId());
+ evc.getUniIdList().set(1,uni2.getId());
+
+ EvcRespositoryInMem.INSTANCE.add(evc);
+ EvcRespositoryInMem.INSTANCE.dump(0);
+ return Response.ok().entity(evc).build();
+ }
+
+ @PUT
+ @Path("{evcId}")
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Produces(MediaType.APPLICATION_JSON)
+ //--------------------------------------------------------
+ public Response update(Evc evc)
+ //--------------------------------------------------------
+ {
+ Dbg.p("\nUPDATING [" + evc.getId()+"]");
+
+ // Need to get cos params based on incoming cos ID
+ CoSClient cosClient = new CoSClient();
+ CoS cos = cosClient.get(evc.getCosId());
+ if (cos == null) {
+ return Response.status(Response.Status.NOT_FOUND).build();
+ }
+
+ evc.setOneWayFrameDelay(cos.getFrameDelay());
+ evc.setOneWayFrameLossRatio(cos.getFrameLoss());
+ evc.setOneWayAvailability(cos.getAvailbility());
+
+ EvcRespositoryInMem.INSTANCE.update(evc);
+ EvcRespositoryInMem.INSTANCE.dump(0);
+ return Response.ok().entity(evc).build();
+ }
+
+ @GET
+ @Path("{evcId}")
+ @Produces(MediaType.APPLICATION_JSON)
+ //--------------------------------------------------------
+ public Response get( @PathParam("evcId") String evcId )
+ //--------------------------------------------------------
+ {
+ if ( evcId == null) {
+ return Response.status(Response.Status.BAD_REQUEST).build();
+ }
+ Dbg.p("\nRETRIEVING ["+evcId+"]");
+ Evc evc = EvcRespositoryInMem.INSTANCE.get(evcId);
+ if (evc == null) {
+ return Response.status(Response.Status.NOT_FOUND).build();
+ }
+ evc.dump(1);
+ return Response.ok().entity(evc).build();
+ }
+
+ @GET
+ @Path("list")
+ @Produces(MediaType.APPLICATION_JSON)
+ //--------------------------------------------------------
+ public Response evcList()
+ //--------------------------------------------------------
+
+ // get a list of all Evc objects
+ {
+ Dbg.p("\nEVC GET ALL:");
+ List evcList = EvcRespositoryInMem.INSTANCE.getAll();
+ if (evcList == null )
+ {
+ return Response.status(Response.Status.NOT_FOUND).build();
+ }
+ return Response.ok().entity(new GenericEntity<List<Evc>>(evcList) {}).build();
+ }
+
+ @DELETE
+ @Path("{evcId}")
+ //--------------------------------------------------------
+ public Response delete(@PathParam("evcId") String evcId)
+ throws Exception
+ //--------------------------------------------------------
+ {
+ if ( evcId == null) {
+ return Response.status(Response.Status.BAD_REQUEST).build();
+ }
+ Dbg.p("\nDELETE:" + evcId);
+
+ Evc evcToDel = EvcRespositoryInMem.INSTANCE.get(evcId);
+ List<String> uniIdList = evcToDel.getUniIdList();
+
+ // Delete EvcPath first (unis can exists independent of EVC, but not vica-versa)
+ EvcPathClient evcPathClient = new EvcPathClient();
+ evcPathClient.delete(evcToDel.getId());
+
+ // Give ODL a chance to finish deleting the evc Path
+ // NOTE: Should be fixed on ODL side eventually via synchronized message handling
+ try{
+ Thread.sleep(1000);
+ } catch(InterruptedException ex)
+ {Thread.currentThread().interrupt();
+ }
+
+ // Delete the UNI's in ODL
+ UniClient uniClient = new UniClient();
+ if ( uniIdList != null && uniIdList.size() > 0 )
+ uniClient.delete(uniIdList.get(0));
+ if ( uniIdList != null && uniIdList.size() > 1 )
+ uniClient.delete(uniIdList.get(1));
+
+ // OK, now we can delete the EVC itself
+ EvcRespositoryInMem.INSTANCE.delete(evcId);
+ EvcRespositoryInMem.INSTANCE.dump(0);
+ return Response.ok().build();
+ }
+
+ @GET
+ @Produces(MediaType.APPLICATION_JSON)
+ //--------------------------------------------------------
+ public Evc testGet()
+ //--------------------------------------------------------
+ // simple get to check out json format
+ {
+ List<String> uniList = new ArrayList<String>();
+ uniList.add("UNI-1");
+ uniList.add("UNI-2");
+
+ List<String> uniMacList = new ArrayList<String>();
+ uniMacList.add("11:00:11:11:11:11");
+ uniMacList.add("11:00:22:22:22:22");
+
+ List<String> uniIpList = new ArrayList<String>();
+ uniIpList.add("192.168.1.1");
+ uniIpList.add("192.168.1.2");
+
+
+ Evc evc = new Evc();
+ evc.setAllNonPerfProps("Eve", // id
+ Evc.EvcType.POINT_TO_POINT, // evcType
+ 2, // maxUnis
+ uniList, uniMacList, uniIpList,
+ Evc.FrameDelivery.UNCONDITIONAL, // unicastFrameDelivery
+ Evc.FrameDelivery.UNCONDITIONAL, // multicastFrameDelivery
+ Evc.FrameDelivery.UNCONDITIONAL, // broadcastFrameDelivery
+ true, // ceVLanIdPreservation
+ true, // ceVlanCosPreservation
+ 1600, // evcMaxSvcFrameSize
+ "gold"); // cosId
+ return evc;
+ }
+
+ @GET
+ @Produces(MediaType.TEXT_PLAIN)
+ //--------------------------------------------------------
+ public String ping()
+ //--------------------------------------------------------
+ // simple ping to check connectivity
+
+ {
+ Dbg.p("In Evc Service: ping test");
+ return "... pingEvc reponse";
+ }
+}
diff --git a/evc/evcmgr/src/main/webapp/WEB-INF/web.xml b/evc/evcmgr/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..dfb5cd5
--- /dev/null
+++ b/evc/evcmgr/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- This web.xml file is not required when using Servlet 3.0 container,
+ see implementation details http://jersey.java.net/nonav/documentation/latest/jax-rs.html -->
+<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
+ <servlet>
+ <servlet-name>Jersey Web Application</servlet-name>
+ <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
+ <init-param>
+ <param-name>jersey.config.server.provider.packages</param-name>
+ <param-value>com.cablelabs.vcpe.evc</param-value>
+ </init-param>
+ <init-param>
+ <param-name>javax.ws.rs.Application</param-name>
+ <param-value>com.cablelabs.vcpe.evc.evcmgr.EvcJaxRsApplication</param-value>
+ </init-param>
+ <load-on-startup>1</load-on-startup>
+ </servlet>
+ <servlet-mapping>
+ <servlet-name>Jersey Web Application</servlet-name>
+ <url-pattern>/webapi/*</url-pattern>
+ </servlet-mapping>
+</web-app>
diff --git a/evc/evcmgr/src/main/webapp/index.jsp b/evc/evcmgr/src/main/webapp/index.jsp
new file mode 100644
index 0000000..a064b45
--- /dev/null
+++ b/evc/evcmgr/src/main/webapp/index.jsp
@@ -0,0 +1,8 @@
+<html>
+<body>
+ <h2>Jersey RESTful Web Application!</h2>
+ <p><a href="webapi/myresource">Jersey resource</a>
+ <p>Visit <a href="http://jersey.java.net">Project Jersey website</a>
+ for more information on Jersey!
+</body>
+</html>
diff --git a/evc/evcmgr/target/classes/com/cablelabs/vcpe/evc/evcmgr/CORSResponseFilter.class b/evc/evcmgr/target/classes/com/cablelabs/vcpe/evc/evcmgr/CORSResponseFilter.class
new file mode 100644
index 0000000..380cd0d
--- /dev/null
+++ b/evc/evcmgr/target/classes/com/cablelabs/vcpe/evc/evcmgr/CORSResponseFilter.class
Binary files differ
diff --git a/evc/evcmgr/target/classes/com/cablelabs/vcpe/evc/evcmgr/EvcJaxRsApplication.class b/evc/evcmgr/target/classes/com/cablelabs/vcpe/evc/evcmgr/EvcJaxRsApplication.class
new file mode 100644
index 0000000..165390a
--- /dev/null
+++ b/evc/evcmgr/target/classes/com/cablelabs/vcpe/evc/evcmgr/EvcJaxRsApplication.class
Binary files differ
diff --git a/evc/evcmgr/target/classes/com/cablelabs/vcpe/evc/evcmgr/EvcService$1.class b/evc/evcmgr/target/classes/com/cablelabs/vcpe/evc/evcmgr/EvcService$1.class
new file mode 100644
index 0000000..9b07071
--- /dev/null
+++ b/evc/evcmgr/target/classes/com/cablelabs/vcpe/evc/evcmgr/EvcService$1.class
Binary files differ
diff --git a/evc/evcmgr/target/classes/com/cablelabs/vcpe/evc/evcmgr/EvcService.class b/evc/evcmgr/target/classes/com/cablelabs/vcpe/evc/evcmgr/EvcService.class
new file mode 100644
index 0000000..0d77695
--- /dev/null
+++ b/evc/evcmgr/target/classes/com/cablelabs/vcpe/evc/evcmgr/EvcService.class
Binary files differ
diff --git a/evc/evcmgr/target/evcmgr.war b/evc/evcmgr/target/evcmgr.war
new file mode 100644
index 0000000..5afd5ec
--- /dev/null
+++ b/evc/evcmgr/target/evcmgr.war
Binary files differ
diff --git a/evc/evcmgr/target/evcmgr/WEB-INF/classes/com/cablelabs/vcpe/evc/evcmgr/CORSResponseFilter.class b/evc/evcmgr/target/evcmgr/WEB-INF/classes/com/cablelabs/vcpe/evc/evcmgr/CORSResponseFilter.class
new file mode 100644
index 0000000..380cd0d
--- /dev/null
+++ b/evc/evcmgr/target/evcmgr/WEB-INF/classes/com/cablelabs/vcpe/evc/evcmgr/CORSResponseFilter.class
Binary files differ
diff --git a/evc/evcmgr/target/evcmgr/WEB-INF/classes/com/cablelabs/vcpe/evc/evcmgr/EvcJaxRsApplication.class b/evc/evcmgr/target/evcmgr/WEB-INF/classes/com/cablelabs/vcpe/evc/evcmgr/EvcJaxRsApplication.class
new file mode 100644
index 0000000..165390a
--- /dev/null
+++ b/evc/evcmgr/target/evcmgr/WEB-INF/classes/com/cablelabs/vcpe/evc/evcmgr/EvcJaxRsApplication.class
Binary files differ
diff --git a/evc/evcmgr/target/evcmgr/WEB-INF/classes/com/cablelabs/vcpe/evc/evcmgr/EvcService$1.class b/evc/evcmgr/target/evcmgr/WEB-INF/classes/com/cablelabs/vcpe/evc/evcmgr/EvcService$1.class
new file mode 100644
index 0000000..9b07071
--- /dev/null
+++ b/evc/evcmgr/target/evcmgr/WEB-INF/classes/com/cablelabs/vcpe/evc/evcmgr/EvcService$1.class
Binary files differ
diff --git a/evc/evcmgr/target/evcmgr/WEB-INF/classes/com/cablelabs/vcpe/evc/evcmgr/EvcService.class b/evc/evcmgr/target/evcmgr/WEB-INF/classes/com/cablelabs/vcpe/evc/evcmgr/EvcService.class
new file mode 100644
index 0000000..0d77695
--- /dev/null
+++ b/evc/evcmgr/target/evcmgr/WEB-INF/classes/com/cablelabs/vcpe/evc/evcmgr/EvcService.class
Binary files differ
diff --git a/evc/evcmgr/target/evcmgr/WEB-INF/lib/asm-all-repackaged-2.2.0-b14.jar b/evc/evcmgr/target/evcmgr/WEB-INF/lib/asm-all-repackaged-2.2.0-b14.jar
new file mode 100644
index 0000000..9c1f40d
--- /dev/null
+++ b/evc/evcmgr/target/evcmgr/WEB-INF/lib/asm-all-repackaged-2.2.0-b14.jar
Binary files differ
diff --git a/evc/evcmgr/target/evcmgr/WEB-INF/lib/cglib-2.2.0-b14.jar b/evc/evcmgr/target/evcmgr/WEB-INF/lib/cglib-2.2.0-b14.jar
new file mode 100644
index 0000000..7d6963b
--- /dev/null
+++ b/evc/evcmgr/target/evcmgr/WEB-INF/lib/cglib-2.2.0-b14.jar
Binary files differ
diff --git a/evc/evcmgr/target/evcmgr/WEB-INF/lib/common-1.0-SNAPSHOT.jar b/evc/evcmgr/target/evcmgr/WEB-INF/lib/common-1.0-SNAPSHOT.jar
new file mode 100644
index 0000000..267b07a
--- /dev/null
+++ b/evc/evcmgr/target/evcmgr/WEB-INF/lib/common-1.0-SNAPSHOT.jar
Binary files differ
diff --git a/evc/evcmgr/target/evcmgr/WEB-INF/lib/cosbase-1.0-SNAPSHOT.jar b/evc/evcmgr/target/evcmgr/WEB-INF/lib/cosbase-1.0-SNAPSHOT.jar
new file mode 100644
index 0000000..d991659
--- /dev/null
+++ b/evc/evcmgr/target/evcmgr/WEB-INF/lib/cosbase-1.0-SNAPSHOT.jar
Binary files differ
diff --git a/evc/evcmgr/target/evcmgr/WEB-INF/lib/evcbase-1.0-SNAPSHOT.jar b/evc/evcmgr/target/evcmgr/WEB-INF/lib/evcbase-1.0-SNAPSHOT.jar
new file mode 100644
index 0000000..f4f5b3a
--- /dev/null
+++ b/evc/evcmgr/target/evcmgr/WEB-INF/lib/evcbase-1.0-SNAPSHOT.jar
Binary files differ
diff --git a/evc/evcmgr/target/evcmgr/WEB-INF/lib/guava-14.0.1.jar b/evc/evcmgr/target/evcmgr/WEB-INF/lib/guava-14.0.1.jar
new file mode 100644
index 0000000..3a3d925
--- /dev/null
+++ b/evc/evcmgr/target/evcmgr/WEB-INF/lib/guava-14.0.1.jar
Binary files differ
diff --git a/evc/evcmgr/target/evcmgr/WEB-INF/lib/hk2-api-2.2.0-b14.jar b/evc/evcmgr/target/evcmgr/WEB-INF/lib/hk2-api-2.2.0-b14.jar
new file mode 100644
index 0000000..acec5bc
--- /dev/null
+++ b/evc/evcmgr/target/evcmgr/WEB-INF/lib/hk2-api-2.2.0-b14.jar
Binary files differ
diff --git a/evc/evcmgr/target/evcmgr/WEB-INF/lib/hk2-locator-2.2.0-b14.jar b/evc/evcmgr/target/evcmgr/WEB-INF/lib/hk2-locator-2.2.0-b14.jar
new file mode 100644
index 0000000..fb2687f
--- /dev/null
+++ b/evc/evcmgr/target/evcmgr/WEB-INF/lib/hk2-locator-2.2.0-b14.jar
Binary files differ
diff --git a/evc/evcmgr/target/evcmgr/WEB-INF/lib/hk2-utils-2.2.0-b14.jar b/evc/evcmgr/target/evcmgr/WEB-INF/lib/hk2-utils-2.2.0-b14.jar
new file mode 100644
index 0000000..2c8df43
--- /dev/null
+++ b/evc/evcmgr/target/evcmgr/WEB-INF/lib/hk2-utils-2.2.0-b14.jar
Binary files differ
diff --git a/evc/evcmgr/target/evcmgr/WEB-INF/lib/javax.annotation-api-1.2.jar b/evc/evcmgr/target/evcmgr/WEB-INF/lib/javax.annotation-api-1.2.jar
new file mode 100644
index 0000000..9ab39ff
--- /dev/null
+++ b/evc/evcmgr/target/evcmgr/WEB-INF/lib/javax.annotation-api-1.2.jar
Binary files differ
diff --git a/evc/evcmgr/target/evcmgr/WEB-INF/lib/javax.inject-2.2.0-b14.jar b/evc/evcmgr/target/evcmgr/WEB-INF/lib/javax.inject-2.2.0-b14.jar
new file mode 100644
index 0000000..21463e7
--- /dev/null
+++ b/evc/evcmgr/target/evcmgr/WEB-INF/lib/javax.inject-2.2.0-b14.jar
Binary files differ
diff --git a/evc/evcmgr/target/evcmgr/WEB-INF/lib/javax.ws.rs-api-2.0.jar b/evc/evcmgr/target/evcmgr/WEB-INF/lib/javax.ws.rs-api-2.0.jar
new file mode 100644
index 0000000..b7d364b
--- /dev/null
+++ b/evc/evcmgr/target/evcmgr/WEB-INF/lib/javax.ws.rs-api-2.0.jar
Binary files differ
diff --git a/evc/evcmgr/target/evcmgr/WEB-INF/lib/jersey-client-2.2.jar b/evc/evcmgr/target/evcmgr/WEB-INF/lib/jersey-client-2.2.jar
new file mode 100644
index 0000000..cab47b0
--- /dev/null
+++ b/evc/evcmgr/target/evcmgr/WEB-INF/lib/jersey-client-2.2.jar
Binary files differ
diff --git a/evc/evcmgr/target/evcmgr/WEB-INF/lib/jersey-common-2.2.jar b/evc/evcmgr/target/evcmgr/WEB-INF/lib/jersey-common-2.2.jar
new file mode 100644
index 0000000..55d27ed
--- /dev/null
+++ b/evc/evcmgr/target/evcmgr/WEB-INF/lib/jersey-common-2.2.jar
Binary files differ
diff --git a/evc/evcmgr/target/evcmgr/WEB-INF/lib/jersey-container-servlet-core-2.2.jar b/evc/evcmgr/target/evcmgr/WEB-INF/lib/jersey-container-servlet-core-2.2.jar
new file mode 100644
index 0000000..e03b5f9
--- /dev/null
+++ b/evc/evcmgr/target/evcmgr/WEB-INF/lib/jersey-container-servlet-core-2.2.jar
Binary files differ
diff --git a/evc/evcmgr/target/evcmgr/WEB-INF/lib/jersey-media-moxy-2.2.jar b/evc/evcmgr/target/evcmgr/WEB-INF/lib/jersey-media-moxy-2.2.jar
new file mode 100644
index 0000000..786290a
--- /dev/null
+++ b/evc/evcmgr/target/evcmgr/WEB-INF/lib/jersey-media-moxy-2.2.jar
Binary files differ
diff --git a/evc/evcmgr/target/evcmgr/WEB-INF/lib/jersey-server-2.2.jar b/evc/evcmgr/target/evcmgr/WEB-INF/lib/jersey-server-2.2.jar
new file mode 100644
index 0000000..37b3410
--- /dev/null
+++ b/evc/evcmgr/target/evcmgr/WEB-INF/lib/jersey-server-2.2.jar
Binary files differ
diff --git a/evc/evcmgr/target/evcmgr/WEB-INF/lib/org.eclipse.persistence.antlr-2.5.0.jar b/evc/evcmgr/target/evcmgr/WEB-INF/lib/org.eclipse.persistence.antlr-2.5.0.jar
new file mode 100644
index 0000000..cff0ef8
--- /dev/null
+++ b/evc/evcmgr/target/evcmgr/WEB-INF/lib/org.eclipse.persistence.antlr-2.5.0.jar
Binary files differ
diff --git a/evc/evcmgr/target/evcmgr/WEB-INF/lib/org.eclipse.persistence.asm-2.5.0.jar b/evc/evcmgr/target/evcmgr/WEB-INF/lib/org.eclipse.persistence.asm-2.5.0.jar
new file mode 100644
index 0000000..832e18e
--- /dev/null
+++ b/evc/evcmgr/target/evcmgr/WEB-INF/lib/org.eclipse.persistence.asm-2.5.0.jar
Binary files differ
diff --git a/evc/evcmgr/target/evcmgr/WEB-INF/lib/org.eclipse.persistence.core-2.5.0.jar b/evc/evcmgr/target/evcmgr/WEB-INF/lib/org.eclipse.persistence.core-2.5.0.jar
new file mode 100644
index 0000000..01bb838
--- /dev/null
+++ b/evc/evcmgr/target/evcmgr/WEB-INF/lib/org.eclipse.persistence.core-2.5.0.jar
Binary files differ
diff --git a/evc/evcmgr/target/evcmgr/WEB-INF/lib/org.eclipse.persistence.moxy-2.5.0.jar b/evc/evcmgr/target/evcmgr/WEB-INF/lib/org.eclipse.persistence.moxy-2.5.0.jar
new file mode 100644
index 0000000..29a1057
--- /dev/null
+++ b/evc/evcmgr/target/evcmgr/WEB-INF/lib/org.eclipse.persistence.moxy-2.5.0.jar
Binary files differ
diff --git a/evc/evcmgr/target/evcmgr/WEB-INF/lib/osgi-resource-locator-1.0.1.jar b/evc/evcmgr/target/evcmgr/WEB-INF/lib/osgi-resource-locator-1.0.1.jar
new file mode 100644
index 0000000..bd6aa17
--- /dev/null
+++ b/evc/evcmgr/target/evcmgr/WEB-INF/lib/osgi-resource-locator-1.0.1.jar
Binary files differ
diff --git a/evc/evcmgr/target/evcmgr/WEB-INF/lib/unibase-1.0-SNAPSHOT.jar b/evc/evcmgr/target/evcmgr/WEB-INF/lib/unibase-1.0-SNAPSHOT.jar
new file mode 100644
index 0000000..46cc4d4
--- /dev/null
+++ b/evc/evcmgr/target/evcmgr/WEB-INF/lib/unibase-1.0-SNAPSHOT.jar
Binary files differ
diff --git a/evc/evcmgr/target/evcmgr/WEB-INF/lib/validation-api-1.1.0.Final.jar b/evc/evcmgr/target/evcmgr/WEB-INF/lib/validation-api-1.1.0.Final.jar
new file mode 100644
index 0000000..de85403
--- /dev/null
+++ b/evc/evcmgr/target/evcmgr/WEB-INF/lib/validation-api-1.1.0.Final.jar
Binary files differ
diff --git a/evc/evcmgr/target/evcmgr/WEB-INF/web.xml b/evc/evcmgr/target/evcmgr/WEB-INF/web.xml
new file mode 100644
index 0000000..dfb5cd5
--- /dev/null
+++ b/evc/evcmgr/target/evcmgr/WEB-INF/web.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- This web.xml file is not required when using Servlet 3.0 container,
+ see implementation details http://jersey.java.net/nonav/documentation/latest/jax-rs.html -->
+<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
+ <servlet>
+ <servlet-name>Jersey Web Application</servlet-name>
+ <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
+ <init-param>
+ <param-name>jersey.config.server.provider.packages</param-name>
+ <param-value>com.cablelabs.vcpe.evc</param-value>
+ </init-param>
+ <init-param>
+ <param-name>javax.ws.rs.Application</param-name>
+ <param-value>com.cablelabs.vcpe.evc.evcmgr.EvcJaxRsApplication</param-value>
+ </init-param>
+ <load-on-startup>1</load-on-startup>
+ </servlet>
+ <servlet-mapping>
+ <servlet-name>Jersey Web Application</servlet-name>
+ <url-pattern>/webapi/*</url-pattern>
+ </servlet-mapping>
+</web-app>
diff --git a/evc/evcmgr/target/evcmgr/index.jsp b/evc/evcmgr/target/evcmgr/index.jsp
new file mode 100644
index 0000000..a064b45
--- /dev/null
+++ b/evc/evcmgr/target/evcmgr/index.jsp
@@ -0,0 +1,8 @@
+<html>
+<body>
+ <h2>Jersey RESTful Web Application!</h2>
+ <p><a href="webapi/myresource">Jersey resource</a>
+ <p>Visit <a href="http://jersey.java.net">Project Jersey website</a>
+ for more information on Jersey!
+</body>
+</html>
diff --git a/evc/evcmgr/target/maven-archiver/pom.properties b/evc/evcmgr/target/maven-archiver/pom.properties
new file mode 100644
index 0000000..26a731f
--- /dev/null
+++ b/evc/evcmgr/target/maven-archiver/pom.properties
@@ -0,0 +1,5 @@
+#Generated by Maven
+#Thu Aug 06 14:01:19 PDT 2015
+version=1.0-SNAPSHOT
+groupId=com.cablelabs.vcpe
+artifactId=evcmgr
diff --git a/evc/pom.xml b/evc/pom.xml
new file mode 100644
index 0000000..0f73c1e
--- /dev/null
+++ b/evc/pom.xml
@@ -0,0 +1,24 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <parent>
+ <groupId>com.cablelabs.vcpe</groupId>
+ <artifactId>vcpe-services</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ </parent>
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>com.cablelabs.vcpe</groupId>
+ <artifactId>evc</artifactId>
+ <packaging>pom</packaging>
+ <version>1.0-SNAPSHOT</version>
+
+ <modules>
+ <module>evcbase</module>
+ <module>evcmgr</module>
+ </modules>
+
+ <dependencies></dependencies>
+
+</project>
diff --git a/model/MEF-Classes.png b/model/MEF-Classes.png
new file mode 100644
index 0000000..2e726c8
--- /dev/null
+++ b/model/MEF-Classes.png
Binary files differ
diff --git a/model/MEF-Ref-Diagrams.png b/model/MEF-Ref-Diagrams.png
new file mode 100644
index 0000000..8e278cc
--- /dev/null
+++ b/model/MEF-Ref-Diagrams.png
Binary files differ
diff --git a/model/README.md b/model/README.md
new file mode 100644
index 0000000..1e4596f
--- /dev/null
+++ b/model/README.md
@@ -0,0 +1,14 @@
+1. Download and install the modeling edition of eclipse
+ - https://eclipse.org/downloads/packages/eclipse-modeling-tools/lunasr2
+2. Upon first starting eclipse, goto the help menu, and select “Install Modeling Components”, check Papyrus and hit “Finish”
+ - Papyrus will download and install, and restart eclipse
+3. After the Papyrus download, goto the help Menu and select “Install Papyrus Additional Components”, and select “”Diagram Generation” and “Papyrus Layers” and hit Finish
+ - These plugins will be installed, then restart eclipse
+4. After these components are installed, create a Papyrus perspective by clicking on the “+” sigh in the perspective bar near the upper right (there will already be a Java Perspective created”)
+ - Select “Papyrus” and hit “OK”
+5. Assuming that your eclipse working is ~/workspace:
+ - make a copy of the the folder “cl-mef-uml”, and (it contents) from the attached zip file in ~/workspace (so that you end up with a ~/workspace/cl-mef_uml” directory”
+6. Activate the Papyrus perspective in eclipse, and goto the menu “File/New/Papyrus Project”
+ - give the new project the name “cl-mef-uml” and the files that you placed into your workspace directory will automatically be imported into the new project.
+7. In the “Model” pane on the left, expand the “>Model” tree to see all of the the model components
+ - To view the detailed UML class digram click on “Diagram Data Model - Foundational Components” and the UML diagrams will become visible in the main pane.
diff --git a/model/cl-mef-uml/.project b/model/cl-mef-uml/.project
new file mode 100644
index 0000000..cd4477b
--- /dev/null
+++ b/model/cl-mef-uml/.project
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>cl-mef-uml</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ </buildSpec>
+ <natures>
+ </natures>
+</projectDescription>
diff --git a/model/cl-mef-uml/model.di b/model/cl-mef-uml/model.di
new file mode 100644
index 0000000..bf9abab
--- /dev/null
+++ b/model/cl-mef-uml/model.di
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI"/>
diff --git a/model/cl-mef-uml/model.notation b/model/cl-mef-uml/model.notation
new file mode 100644
index 0000000..e79af4b
--- /dev/null
+++ b/model/cl-mef-uml/model.notation
@@ -0,0 +1,1501 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:css="http://www.eclipse.org/papyrus/infra/gmfdiag/css" xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.2/notation" xmlns:style="http://www.eclipse.org/papyrus/infra/viewpoints/policy/style" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML">
+ <notation:Diagram xmi:id="_tptY8AidEeWgbbgaC4xhOQ" type="PapyrusUMLClassDiagram" name="MEF Classes" measurementUnit="Pixel">
+ <children xmi:type="notation:Shape" xmi:id="_8OWuIAidEeWgbbgaC4xhOQ" type="2008">
+ <children xmi:type="notation:DecorationNode" xmi:id="_8OXVMAidEeWgbbgaC4xhOQ" type="5029"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_8OXVMQidEeWgbbgaC4xhOQ" type="7017">
+ <children xmi:type="notation:Shape" xmi:id="_DppbAAieEeWgbbgaC4xhOQ" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_8JT2EQidEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_DppbAQieEeWgbbgaC4xhOQ"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_ESqi0AieEeWgbbgaC4xhOQ" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_8JT2EgidEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ESqi0QieEeWgbbgaC4xhOQ"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_FAw-8AieEeWgbbgaC4xhOQ" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_8JT2EwidEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_FAw-8QieEeWgbbgaC4xhOQ"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_FhWjgAieEeWgbbgaC4xhOQ" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_8JT2FAidEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_FhWjgQieEeWgbbgaC4xhOQ"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_8OXVMgidEeWgbbgaC4xhOQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_8OXVMwidEeWgbbgaC4xhOQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_8OXVNAidEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_8OXVNQidEeWgbbgaC4xhOQ"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_8OXVNgidEeWgbbgaC4xhOQ" type="7018">
+ <children xmi:type="notation:Shape" xmi:id="_GGX8IAieEeWgbbgaC4xhOQ" type="3013">
+ <element xmi:type="uml:Operation" href="model.uml#_8JT2FQidEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_GGX8IQieEeWgbbgaC4xhOQ"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_Go2-IAieEeWgbbgaC4xhOQ" type="3013">
+ <element xmi:type="uml:Operation" href="model.uml#_8JT2FgidEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Go2-IQieEeWgbbgaC4xhOQ"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_8OXVNwidEeWgbbgaC4xhOQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_8OXVOAidEeWgbbgaC4xhOQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_8OXVOQidEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_8OXVOgidEeWgbbgaC4xhOQ"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_8OXVOwidEeWgbbgaC4xhOQ" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_8OXVPAidEeWgbbgaC4xhOQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_8OXVPQidEeWgbbgaC4xhOQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_8OXVPgidEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_8OXVPwidEeWgbbgaC4xhOQ"/>
+ </children>
+ <element xmi:type="uml:Class" href="model.uml#_8JT2EAidEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_8OWuIQidEeWgbbgaC4xhOQ" x="1587" y="197" width="191" height="208"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_bDy70AifEeWgbbgaC4xhOQ" type="2006">
+ <children xmi:type="notation:DecorationNode" xmi:id="_bDy70gifEeWgbbgaC4xhOQ" type="5023"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_bDy70wifEeWgbbgaC4xhOQ" type="7015">
+ <children xmi:type="notation:Shape" xmi:id="_iAJC4AifEeWgbbgaC4xhOQ" type="3017">
+ <element xmi:type="uml:EnumerationLiteral" href="model.uml#_bDyUwQifEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_iAJC4QifEeWgbbgaC4xhOQ"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_iALfIAifEeWgbbgaC4xhOQ" type="3017">
+ <element xmi:type="uml:EnumerationLiteral" href="model.uml#_bDyUwgifEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_iALfIQifEeWgbbgaC4xhOQ"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_iANUUAifEeWgbbgaC4xhOQ" type="3017">
+ <element xmi:type="uml:EnumerationLiteral" href="model.uml#_bDyUwwifEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_iANUUQifEeWgbbgaC4xhOQ"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_bDy71AifEeWgbbgaC4xhOQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_bDy71QifEeWgbbgaC4xhOQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_bDy71gifEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_bDy71wifEeWgbbgaC4xhOQ"/>
+ </children>
+ <element xmi:type="uml:Enumeration" href="model.uml#_bDyUwAifEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_bDy70QifEeWgbbgaC4xhOQ" x="1201" y="-132"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_lXjqoAifEeWgbbgaC4xhOQ" type="2006">
+ <children xmi:type="notation:DecorationNode" xmi:id="_lXkRsAifEeWgbbgaC4xhOQ" type="5023"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_lXkRsQifEeWgbbgaC4xhOQ" type="7015">
+ <children xmi:type="notation:Shape" xmi:id="_nIZWIAifEeWgbbgaC4xhOQ" type="3017">
+ <element xmi:type="uml:EnumerationLiteral" href="model.uml#_lXjDkQifEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nIZWIQifEeWgbbgaC4xhOQ"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_nIbLUAifEeWgbbgaC4xhOQ" type="3017">
+ <element xmi:type="uml:EnumerationLiteral" href="model.uml#_lXjDkgifEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nIbLUQifEeWgbbgaC4xhOQ"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_nIdAgAifEeWgbbgaC4xhOQ" type="3017">
+ <element xmi:type="uml:EnumerationLiteral" href="model.uml#_lXjDkwifEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nIdAgQifEeWgbbgaC4xhOQ"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_lXkRsgifEeWgbbgaC4xhOQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_lXkRswifEeWgbbgaC4xhOQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_lXkRtAifEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_lXkRtQifEeWgbbgaC4xhOQ"/>
+ </children>
+ <element xmi:type="uml:Enumeration" href="model.uml#_lXjDkAifEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_lXjqoQifEeWgbbgaC4xhOQ" x="1202" y="-29"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_sWFjAAifEeWgbbgaC4xhOQ" type="2008">
+ <children xmi:type="notation:DecorationNode" xmi:id="_sWFjAgifEeWgbbgaC4xhOQ" type="5029"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_sWFjAwifEeWgbbgaC4xhOQ" type="7017">
+ <children xmi:type="notation:Shape" xmi:id="_vWv3oAifEeWgbbgaC4xhOQ" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_sWE78QifEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_vWv3oQifEeWgbbgaC4xhOQ"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_vWyT4AifEeWgbbgaC4xhOQ" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_sWE78gifEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_vWyT4QifEeWgbbgaC4xhOQ"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_vW0JEAifEeWgbbgaC4xhOQ" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_sWE78wifEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_vW0JEQifEeWgbbgaC4xhOQ"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_vW1XMAifEeWgbbgaC4xhOQ" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_sWE79AifEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_vW1XMQifEeWgbbgaC4xhOQ"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_vW3MYAifEeWgbbgaC4xhOQ" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_sWE79QifEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_vW3MYQifEeWgbbgaC4xhOQ"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_vW5BkAifEeWgbbgaC4xhOQ" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_sWE79gifEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_vW5BkQifEeWgbbgaC4xhOQ"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_vW62wAifEeWgbbgaC4xhOQ" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_sWE79wifEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_vW62wQifEeWgbbgaC4xhOQ"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_vW8r8AifEeWgbbgaC4xhOQ" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_sWE7-AifEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_vW8r8QifEeWgbbgaC4xhOQ"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_sWFjBAifEeWgbbgaC4xhOQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_sWFjBQifEeWgbbgaC4xhOQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_sWFjBgifEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_sWFjBwifEeWgbbgaC4xhOQ"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_sWFjCAifEeWgbbgaC4xhOQ" type="7018">
+ <children xmi:type="notation:Shape" xmi:id="_wOYqQAifEeWgbbgaC4xhOQ" type="3013">
+ <element xmi:type="uml:Operation" href="model.uml#_sWE7-QifEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_wOYqQQifEeWgbbgaC4xhOQ"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_wObGgAifEeWgbbgaC4xhOQ" type="3013">
+ <element xmi:type="uml:Operation" href="model.uml#_sWE7-gifEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_wObGgQifEeWgbbgaC4xhOQ"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_sWFjCQifEeWgbbgaC4xhOQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_sWFjCgifEeWgbbgaC4xhOQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_sWFjCwifEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_sWFjDAifEeWgbbgaC4xhOQ"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_sWFjDQifEeWgbbgaC4xhOQ" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_sWFjDgifEeWgbbgaC4xhOQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_sWFjDwifEeWgbbgaC4xhOQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_sWFjEAifEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_sWFjEQifEeWgbbgaC4xhOQ"/>
+ </children>
+ <element xmi:type="uml:Class" href="model.uml#_sWE78AifEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_sWFjAQifEeWgbbgaC4xhOQ" x="667" y="-131" width="277"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_6ejSgAifEeWgbbgaC4xhOQ" type="2008" fillColor="8905185">
+ <children xmi:type="notation:DecorationNode" xmi:id="_6ejSggifEeWgbbgaC4xhOQ" type="5029"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_6ejSgwifEeWgbbgaC4xhOQ" type="7017">
+ <children xmi:type="notation:Shape" xmi:id="__q2_UAifEeWgbbgaC4xhOQ" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_6eiEYQifEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="__q2_UQifEeWgbbgaC4xhOQ"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="__q5bkAifEeWgbbgaC4xhOQ" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_6eiEYgifEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="__q5bkQifEeWgbbgaC4xhOQ"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="__q7QwAifEeWgbbgaC4xhOQ" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_6eiEYwifEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="__q7QwQifEeWgbbgaC4xhOQ"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="__q-7IAifEeWgbbgaC4xhOQ" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_6eiEZwifEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="__q-7IQifEeWgbbgaC4xhOQ"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="__rAwUAifEeWgbbgaC4xhOQ" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_6eiEaAifEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="__rAwUQifEeWgbbgaC4xhOQ"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="__rClgAifEeWgbbgaC4xhOQ" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_6eiEaQifEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="__rClgQifEeWgbbgaC4xhOQ"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="__rEasAifEeWgbbgaC4xhOQ" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_6eiEagifEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="__rEasQifEeWgbbgaC4xhOQ"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="__rGP4AifEeWgbbgaC4xhOQ" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_6eiEbgifEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="__rGP4QifEeWgbbgaC4xhOQ"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="__rIFEAifEeWgbbgaC4xhOQ" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_6eiEcAifEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="__rIFEQifEeWgbbgaC4xhOQ"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_6ejShAifEeWgbbgaC4xhOQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_6ejShQifEeWgbbgaC4xhOQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_6ejShgifEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6ejShwifEeWgbbgaC4xhOQ"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_6ej5kAifEeWgbbgaC4xhOQ" type="7018">
+ <children xmi:type="notation:Shape" xmi:id="_jMKfMAihEeWgbbgaC4xhOQ" type="3013">
+ <element xmi:type="uml:Operation" href="model.uml#_jMIC8AihEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_jMKfMQihEeWgbbgaC4xhOQ"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_k4FOcAihEeWgbbgaC4xhOQ" type="3013">
+ <element xmi:type="uml:Operation" href="model.uml#_k4EAUAihEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_k4FOcQihEeWgbbgaC4xhOQ"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_6ej5kQifEeWgbbgaC4xhOQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_6ej5kgifEeWgbbgaC4xhOQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_6ej5kwifEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6ej5lAifEeWgbbgaC4xhOQ"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_6ej5lQifEeWgbbgaC4xhOQ" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_6ej5lgifEeWgbbgaC4xhOQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_6ej5lwifEeWgbbgaC4xhOQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_6ej5mAifEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6ej5mQifEeWgbbgaC4xhOQ"/>
+ </children>
+ <element xmi:type="uml:Class" href="model.uml#_6eiEYAifEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6ejSgQifEeWgbbgaC4xhOQ" x="1003" y="-129" width="194" height="236"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_PhLlgAilEeWgbbgaC4xhOQ" type="2009">
+ <children xmi:type="notation:DecorationNode" xmi:id="_PhLlggilEeWgbbgaC4xhOQ" type="5032"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_PhLlgwilEeWgbbgaC4xhOQ" type="7039">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_PhLlhAilEeWgbbgaC4xhOQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_PhLlhQilEeWgbbgaC4xhOQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_PhLlhgilEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_PhLlhwilEeWgbbgaC4xhOQ"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_PhLliAilEeWgbbgaC4xhOQ" type="7040">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_PhLliQilEeWgbbgaC4xhOQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_PhLligilEeWgbbgaC4xhOQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_PhLliwilEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_PhLljAilEeWgbbgaC4xhOQ"/>
+ </children>
+ <element xmi:type="uml:PrimitiveType" href="model.uml#_PhJwUAilEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_PhLlgQilEeWgbbgaC4xhOQ" x="1780" y="-341" width="190" height="34"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_6ExcYAimEeWgbbgaC4xhOQ" type="2008" fillColor="8905185">
+ <children xmi:type="notation:DecorationNode" xmi:id="_6ExcYgimEeWgbbgaC4xhOQ" type="5029"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_6ExcYwimEeWgbbgaC4xhOQ" type="7017">
+ <children xmi:type="notation:Shape" xmi:id="__rTVIAioEeWgbbgaC4xhOQ" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#__rQ44AioEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="__rTVIQioEeWgbbgaC4xhOQ"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_nrV-8AoPEeWNdNIyeR54mg" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_nrUw0AoPEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_nrV-8QoPEeWNdNIyeR54mg"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_sRAigAoPEeWNdNIyeR54mg" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_sQ_UYAoPEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_sRAigQoPEeWNdNIyeR54mg"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_0pP_0AoPEeWNdNIyeR54mg" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_0pOxsAoPEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_0pP_0QoPEeWNdNIyeR54mg"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_R7oUwAoQEeWNdNIyeR54mg" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_R7mfkAoQEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_R7oUwQoQEeWNdNIyeR54mg"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_-aYtQAoQEeWNdNIyeR54mg" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_-aXfIAoQEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_-aYtQQoQEeWNdNIyeR54mg"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_KTYUgAoREeWNdNIyeR54mg" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_KTXGYAoREeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_KTYUgQoREeWNdNIyeR54mg"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_SdU3IAoREeWNdNIyeR54mg" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_SdTpAAoREeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_SdU3IQoREeWNdNIyeR54mg"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_ffwLoAoREeWNdNIyeR54mg" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_ffuWcAoREeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ffwLoQoREeWNdNIyeR54mg"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_bqgi8AoSEeWNdNIyeR54mg" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_bqfU0AoSEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_bqgi8QoSEeWNdNIyeR54mg"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_lcmIEAoSEeWNdNIyeR54mg" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_lclhAAoSEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_lcmIEQoSEeWNdNIyeR54mg"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_sCqdIAoSEeWNdNIyeR54mg" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_sCoA4AoSEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_sCqdIQoSEeWNdNIyeR54mg"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_wKOIYAoSEeWNdNIyeR54mg" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_wKM6QAoSEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_wKOIYQoSEeWNdNIyeR54mg"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_ITufAAoTEeWNdNIyeR54mg" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_ITtQ4AoTEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ITufAQoTEeWNdNIyeR54mg"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_igwMkAoTEeWNdNIyeR54mg" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_iguXYAoTEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_igwMkQoTEeWNdNIyeR54mg"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_9ZdUYAoTEeWNdNIyeR54mg" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_9ZcGQAoTEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_9ZdUYQoTEeWNdNIyeR54mg"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_Cqd7AAoUEeWNdNIyeR54mg" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_CqZCgAoUEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Cqd7AQoUEeWNdNIyeR54mg"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_Mr6KwAoUEeWNdNIyeR54mg" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_Mr48oAoUEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Mr6KwQoUEeWNdNIyeR54mg"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_SDfTcAoUEeWNdNIyeR54mg" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_SDeFUAoUEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_SDfTcQoUEeWNdNIyeR54mg"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_rbp1kAoUEeWNdNIyeR54mg" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_rbpOgAoUEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_rbp1kQoUEeWNdNIyeR54mg"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_WyCPwAogEeWNdNIyeR54mg" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_WyBBoAogEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_WyCPwQogEeWNdNIyeR54mg"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_LCPLUAohEeWNdNIyeR54mg" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_LCN9MAohEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_LCPLUQohEeWNdNIyeR54mg"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_6ExcZAimEeWgbbgaC4xhOQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_6ExcZQimEeWgbbgaC4xhOQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_6ExcZgimEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6ExcZwimEeWgbbgaC4xhOQ"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_6EyDcAimEeWgbbgaC4xhOQ" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_6EyDcQimEeWgbbgaC4xhOQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_6EyDcgimEeWgbbgaC4xhOQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_6EyDcwimEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6EyDdAimEeWgbbgaC4xhOQ"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_6EyDdQimEeWgbbgaC4xhOQ" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_6EyDdgimEeWgbbgaC4xhOQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_6EyDdwimEeWgbbgaC4xhOQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_6EyDeAimEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6EyDeQimEeWgbbgaC4xhOQ"/>
+ </children>
+ <element xmi:type="uml:Class" href="model.uml#_6EwOQAimEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6ExcYQimEeWgbbgaC4xhOQ" x="1105" y="801" width="268" height="421"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_7r1O4AioEeWgbbgaC4xhOQ" type="2006">
+ <children xmi:type="notation:DecorationNode" xmi:id="_7r1O4gioEeWgbbgaC4xhOQ" type="5023"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_7r1O4wioEeWgbbgaC4xhOQ" type="7015">
+ <children xmi:type="notation:Shape" xmi:id="_TZdPkAoOEeWNdNIyeR54mg" type="3017">
+ <element xmi:type="uml:EnumerationLiteral" href="model.uml#_TY4AwAoOEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_TZdPkQoOEeWNdNIyeR54mg"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_a3iKsAoOEeWNdNIyeR54mg" type="3017">
+ <element xmi:type="uml:EnumerationLiteral" href="model.uml#_a3fHYAoOEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_a3iKsQoOEeWNdNIyeR54mg"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_f9c7oAoOEeWNdNIyeR54mg" type="3017">
+ <element xmi:type="uml:EnumerationLiteral" href="model.uml#_f9bGcAoOEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_f9c7oQoOEeWNdNIyeR54mg"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_lDuR4AoOEeWNdNIyeR54mg" type="3017">
+ <element xmi:type="uml:EnumerationLiteral" href="model.uml#_lDtDwAoOEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_lDuR4QoOEeWNdNIyeR54mg"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_7r1O5AioEeWgbbgaC4xhOQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_7r1O5QioEeWgbbgaC4xhOQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_7r1O5gioEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_7r1O5wioEeWgbbgaC4xhOQ"/>
+ </children>
+ <element xmi:type="uml:Enumeration" href="model.uml#_7r0AwAioEeWgbbgaC4xhOQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_7r1O4QioEeWgbbgaC4xhOQ" x="1383" y="842" width="104" height="102"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_EZ_UsAoQEeWNdNIyeR54mg" type="2006">
+ <children xmi:type="notation:DecorationNode" xmi:id="_EZ_UsQoQEeWNdNIyeR54mg" type="5023"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_EZ_UsgoQEeWNdNIyeR54mg" type="7015">
+ <children xmi:type="notation:Shape" xmi:id="_EZ_UswoQEeWNdNIyeR54mg" type="3017">
+ <element xmi:type="uml:EnumerationLiteral" href="model.uml#_EZ-togoQEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_EZ_UtAoQEeWNdNIyeR54mg"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_EZ_UtQoQEeWNdNIyeR54mg" type="3017">
+ <element xmi:type="uml:EnumerationLiteral" href="model.uml#_EZ-towoQEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_EZ_UtgoQEeWNdNIyeR54mg"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_EZ_UtwoQEeWNdNIyeR54mg" type="3017">
+ <element xmi:type="uml:EnumerationLiteral" href="model.uml#_EZ-tpAoQEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_EZ_UuAoQEeWNdNIyeR54mg"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_EZ_UuwoQEeWNdNIyeR54mg"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_EZ_UvAoQEeWNdNIyeR54mg"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_EZ_UvQoQEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_EZ_UvgoQEeWNdNIyeR54mg"/>
+ </children>
+ <element xmi:type="uml:Enumeration" href="model.uml#_EZ-toAoQEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_EZ_UwgoQEeWNdNIyeR54mg" x="1490" y="841" width="104" height="102"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_BJFvMAoREeWNdNIyeR54mg" type="2006">
+ <children xmi:type="notation:DecorationNode" xmi:id="_BJFvMgoREeWNdNIyeR54mg" type="5023"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_BJFvMwoREeWNdNIyeR54mg" type="7015">
+ <children xmi:type="notation:Shape" xmi:id="_C39r0AoREeWNdNIyeR54mg" type="3017">
+ <element xmi:type="uml:EnumerationLiteral" href="model.uml#_C36BcAoREeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_C39r0QoREeWNdNIyeR54mg"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_BJFvNAoREeWNdNIyeR54mg"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_BJFvNQoREeWNdNIyeR54mg"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_BJFvNgoREeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_BJFvNwoREeWNdNIyeR54mg"/>
+ </children>
+ <element xmi:type="uml:Enumeration" href="model.uml#_BJD6AAoREeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_BJFvMQoREeWNdNIyeR54mg" x="1381" y="948" height="57"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_Nmz-sAoSEeWNdNIyeR54mg" type="2010">
+ <children xmi:type="notation:DecorationNode" xmi:id="_Nm0lwAoSEeWNdNIyeR54mg" type="5035"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_Nm0lwQoSEeWNdNIyeR54mg" type="7020">
+ <children xmi:type="notation:Shape" xmi:id="_R84AAAoSEeWNdNIyeR54mg" type="3018">
+ <element xmi:type="uml:Property" href="model.uml#_R81jwAoSEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_R84AAQoSEeWNdNIyeR54mg"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_WFuEsAoSEeWNdNIyeR54mg" type="3018">
+ <element xmi:type="uml:Property" href="model.uml#_WFs2kAoSEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_WFuEsQoSEeWNdNIyeR54mg"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_Nm0lwgoSEeWNdNIyeR54mg"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_Nm0lwwoSEeWNdNIyeR54mg"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_Nm0lxAoSEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Nm0lxQoSEeWNdNIyeR54mg"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_Nm0lxgoSEeWNdNIyeR54mg" type="7021">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_Nm0lxwoSEeWNdNIyeR54mg"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_Nm0lyAoSEeWNdNIyeR54mg"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_Nm0lyQoSEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Nm0lygoSEeWNdNIyeR54mg"/>
+ </children>
+ <element xmi:type="uml:DataType" href="model.uml#_NmywkAoSEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Nmz-sQoSEeWNdNIyeR54mg" x="1377" y="1011"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_PFMLwAoTEeWNdNIyeR54mg" type="2010">
+ <children xmi:type="notation:DecorationNode" xmi:id="_PFMLwgoTEeWNdNIyeR54mg" type="5035"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_PFMLwwoTEeWNdNIyeR54mg" type="7020">
+ <children xmi:type="notation:Shape" xmi:id="_RpcRMAoTEeWNdNIyeR54mg" type="3018">
+ <element xmi:type="uml:Property" href="model.uml#_RpbDEAoTEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_RpcRMQoTEeWNdNIyeR54mg"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_VXug0AoTEeWNdNIyeR54mg" type="3018">
+ <element xmi:type="uml:Property" href="model.uml#_VXtSsAoTEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_VXug0QoTEeWNdNIyeR54mg"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_bP7DQAoTEeWNdNIyeR54mg" type="3018">
+ <element xmi:type="uml:Property" href="model.uml#_bP51IAoTEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_bP7DQQoTEeWNdNIyeR54mg"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_PFMLxAoTEeWNdNIyeR54mg"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_PFMLxQoTEeWNdNIyeR54mg"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_PFMLxgoTEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_PFMLxwoTEeWNdNIyeR54mg"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_PFMy0AoTEeWNdNIyeR54mg" type="7021">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_PFMy0QoTEeWNdNIyeR54mg"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_PFMy0goTEeWNdNIyeR54mg"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_PFMy0woTEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_PFMy1AoTEeWNdNIyeR54mg"/>
+ </children>
+ <element xmi:type="uml:DataType" href="model.uml#_PFK9oAoTEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_PFMLwQoTEeWNdNIyeR54mg" x="1376" y="1115" width="207" height="109"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_0_0I4AoTEeWNdNIyeR54mg" type="2006">
+ <children xmi:type="notation:DecorationNode" xmi:id="_0_0v8AoTEeWNdNIyeR54mg" type="5023"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_0_0v8QoTEeWNdNIyeR54mg" type="7015">
+ <children xmi:type="notation:Shape" xmi:id="_2_1f4AoTEeWNdNIyeR54mg" type="3017">
+ <element xmi:type="uml:EnumerationLiteral" href="model.uml#_2_0RwAoTEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_2_1f4QoTEeWNdNIyeR54mg"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_0_0v8goTEeWNdNIyeR54mg"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_0_0v8woTEeWNdNIyeR54mg"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_0_0v9AoTEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_0_0v9QoTEeWNdNIyeR54mg"/>
+ </children>
+ <element xmi:type="uml:Enumeration" href="model.uml#_0_y6wAoTEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_0_0I4QoTEeWNdNIyeR54mg" x="1485" y="946" height="58"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_LO3ukAogEeWNdNIyeR54mg" type="2006">
+ <children xmi:type="notation:DecorationNode" xmi:id="_LO3ukgogEeWNdNIyeR54mg" type="5023"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_LO3ukwogEeWNdNIyeR54mg" type="7015">
+ <children xmi:type="notation:Shape" xmi:id="_QHax4AogEeWNdNIyeR54mg" type="3017">
+ <element xmi:type="uml:EnumerationLiteral" href="model.uml#_QHY8sAogEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_QHax4QogEeWNdNIyeR54mg"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_QqNV4AogEeWNdNIyeR54mg" type="3017">
+ <element xmi:type="uml:EnumerationLiteral" href="model.uml#_QqMHwAogEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_QqNV4QogEeWNdNIyeR54mg"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_USedEAogEeWNdNIyeR54mg" type="3017">
+ <element xmi:type="uml:EnumerationLiteral" href="model.uml#_USdO8AogEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_USedEQogEeWNdNIyeR54mg"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_LO3ulAogEeWNdNIyeR54mg"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_LO3ulQogEeWNdNIyeR54mg"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_LO3ulgogEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_LO3ulwogEeWNdNIyeR54mg"/>
+ </children>
+ <element xmi:type="uml:Enumeration" href="model.uml#_LO2gcAogEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_LO3ukQogEeWNdNIyeR54mg" x="1598" y="842" height="102"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_ybPncAogEeWNdNIyeR54mg" type="2010">
+ <children xmi:type="notation:DecorationNode" xmi:id="_ybPncgogEeWNdNIyeR54mg" type="5035"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_ybPncwogEeWNdNIyeR54mg" type="7020">
+ <children xmi:type="notation:Shape" xmi:id="_8jzy4AogEeWNdNIyeR54mg" type="3018">
+ <element xmi:type="uml:Property" href="model.uml#_8jxWoAogEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_8jzy4QogEeWNdNIyeR54mg"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_CDLloAohEeWNdNIyeR54mg" type="3018">
+ <element xmi:type="uml:Property" href="model.uml#_CDK-kAohEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_CDLloQohEeWNdNIyeR54mg"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_HPB_cAohEeWNdNIyeR54mg" type="3018">
+ <element xmi:type="uml:Property" href="model.uml#_HPAxUAohEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_HPB_cQohEeWNdNIyeR54mg"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_ybPndAogEeWNdNIyeR54mg"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_ybPndQogEeWNdNIyeR54mg"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_ybPndgogEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ybPndwogEeWNdNIyeR54mg"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_ybPneAogEeWNdNIyeR54mg" type="7021">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_ybPneQogEeWNdNIyeR54mg"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_ybPnegogEeWNdNIyeR54mg"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_ybPnewogEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ybPnfAogEeWNdNIyeR54mg"/>
+ </children>
+ <element xmi:type="uml:DataType" href="model.uml#_ybOZUAogEeWNdNIyeR54mg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ybPncQogEeWNdNIyeR54mg" x="1513" y="1009" width="166" height="103"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_rc5pYAotEeWkNoOTovCSlw" type="2008" fillColor="8905185">
+ <children xmi:type="notation:DecorationNode" xmi:id="_rc5pYgotEeWkNoOTovCSlw" type="5029"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_rc5pYwotEeWkNoOTovCSlw" type="7017">
+ <children xmi:type="notation:Shape" xmi:id="_Q7OsEAouEeWkNoOTovCSlw" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_Q7M24AouEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Q7OsEQouEeWkNoOTovCSlw"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_3rwWcAouEeWkNoOTovCSlw" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_3ruhQAouEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_3rwWcQouEeWkNoOTovCSlw"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_CcEeYAovEeWkNoOTovCSlw" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_Cb9JoAovEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_CcEeYQovEeWkNoOTovCSlw"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_-7GckAovEeWkNoOTovCSlw" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_-7FOcAovEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_-7GckQovEeWkNoOTovCSlw"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_GfoIgAoxEeWkNoOTovCSlw" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_Gfm6YAoxEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_GfoIgQoxEeWkNoOTovCSlw"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_KVj4QAoxEeWkNoOTovCSlw" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_KViqIAoxEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_KVj4QQoxEeWkNoOTovCSlw"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_XbsWIAozEeWkNoOTovCSlw" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_XbrIAAozEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XbsWIQozEeWkNoOTovCSlw"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_f0tPgAozEeWkNoOTovCSlw" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_f0qzQAozEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_f0tPgQozEeWkNoOTovCSlw"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_mvRN4AozEeWkNoOTovCSlw" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_mvOxoAozEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_mvRN4QozEeWkNoOTovCSlw"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_q0yRwAozEeWkNoOTovCSlw" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_q0xDoAozEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_q0yRwQozEeWkNoOTovCSlw"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_hYNNIAo0EeWkNoOTovCSlw" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_hYKw4Ao0EeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_hYNNIQo0EeWkNoOTovCSlw"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_op4rAAo0EeWkNoOTovCSlw" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_op3c4Ao0EeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_op4rAQo0EeWkNoOTovCSlw"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_uGrq4Ao0EeWkNoOTovCSlw" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_uGpOoAo0EeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_uGrq4Qo0EeWkNoOTovCSlw"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_uL3s4Ao0EeWkNoOTovCSlw" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_uL1QoAo0EeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_uL3s4Qo0EeWkNoOTovCSlw"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_rc5pZAotEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_rc5pZQotEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_rc5pZgotEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rc5pZwotEeWkNoOTovCSlw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_rc5paAotEeWkNoOTovCSlw" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_rc5paQotEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_rc5pagotEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_rc5pawotEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rc5pbAotEeWkNoOTovCSlw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_rc5pbQotEeWkNoOTovCSlw" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_rc5pbgotEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_rc5pbwotEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_rc5pcAotEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rc5pcQotEeWkNoOTovCSlw"/>
+ </children>
+ <element xmi:type="uml:Class" href="model.uml#_rc30MAotEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rc5pYQotEeWkNoOTovCSlw" x="1111" y="400" height="296"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_LY1voAowEeWkNoOTovCSlw" type="2006">
+ <children xmi:type="notation:DecorationNode" xmi:id="_LY1vogowEeWkNoOTovCSlw" type="5023"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_LY1vowowEeWkNoOTovCSlw" type="7015">
+ <children xmi:type="notation:Shape" xmi:id="_UEkwsAowEeWkNoOTovCSlw" type="3017">
+ <element xmi:type="uml:EnumerationLiteral" href="model.uml#_UEeDAAowEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_UEkwsQowEeWkNoOTovCSlw"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_WBNcgAowEeWkNoOTovCSlw" type="3017">
+ <element xmi:type="uml:EnumerationLiteral" href="model.uml#_WBMOYAowEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_WBNcgQowEeWkNoOTovCSlw"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_XB6EgAowEeWkNoOTovCSlw" type="3017">
+ <element xmi:type="uml:EnumerationLiteral" href="model.uml#_XB42YAowEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_XB6EgQowEeWkNoOTovCSlw"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_Y_oVcAowEeWkNoOTovCSlw" type="3017">
+ <element xmi:type="uml:EnumerationLiteral" href="model.uml#_Y_nHUAowEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Y_oVcQowEeWkNoOTovCSlw"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_f3x5AAowEeWkNoOTovCSlw" type="3017">
+ <element xmi:type="uml:EnumerationLiteral" href="model.uml#_f3wq4AowEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_f3x5AQowEeWkNoOTovCSlw"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_LY1vpAowEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_LY1vpQowEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_LY1vpgowEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_LY1vpwowEeWkNoOTovCSlw"/>
+ </children>
+ <element xmi:type="uml:Enumeration" href="model.uml#_LYz6cAowEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_LY1voQowEeWkNoOTovCSlw" x="1336" y="399"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_BrE0YAoxEeWkNoOTovCSlw" type="2006">
+ <children xmi:type="notation:DecorationNode" xmi:id="_BrE0YgoxEeWkNoOTovCSlw" type="5023"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_BrFbcAoxEeWkNoOTovCSlw" type="7015">
+ <children xmi:type="notation:Shape" xmi:id="_CySUEAoxEeWkNoOTovCSlw" type="3017">
+ <element xmi:type="uml:EnumerationLiteral" href="model.uml#_CyRF8AoxEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_CySUEQoxEeWkNoOTovCSlw"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_DhgxkAoxEeWkNoOTovCSlw" type="3017">
+ <element xmi:type="uml:EnumerationLiteral" href="model.uml#_DhfjcAoxEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_DhgxkQoxEeWkNoOTovCSlw"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_BrFbcQoxEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_BrFbcgoxEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_BrFbcwoxEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_BrFbdAoxEeWkNoOTovCSlw"/>
+ </children>
+ <element xmi:type="uml:Enumeration" href="model.uml#_BrDmQAoxEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_BrE0YQoxEeWkNoOTovCSlw" x="1335" y="528" height="72"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_6CfP8ArAEeWkNoOTovCSlw" type="2008" fillColor="8905185">
+ <children xmi:type="notation:DecorationNode" xmi:id="_6CfP8grAEeWkNoOTovCSlw" type="5029"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_6CfP8wrAEeWkNoOTovCSlw" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_6CfP9ArAEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_6CfP9QrAEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_6CfP9grAEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6CfP9wrAEeWkNoOTovCSlw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_6CfP-ArAEeWkNoOTovCSlw" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_6CfP-QrAEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_6CfP-grAEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_6CfP-wrAEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6CfP_ArAEeWkNoOTovCSlw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_6CfP_QrAEeWkNoOTovCSlw" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_6CfP_grAEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_6CfP_wrAEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_6CfQAArAEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6CfQAQrAEeWkNoOTovCSlw"/>
+ </children>
+ <element xmi:type="uml:Class" href="model.uml#_6CdawArAEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6CfP8QrAEeWkNoOTovCSlw" x="787" y="150" width="175" height="69"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_EP6GMArBEeWkNoOTovCSlw" type="2008">
+ <children xmi:type="notation:DecorationNode" xmi:id="_EP6GMgrBEeWkNoOTovCSlw" type="5029"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_EP6GMwrBEeWkNoOTovCSlw" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_EP6GNArBEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_EP6GNQrBEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_EP6GNgrBEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_EP6GNwrBEeWkNoOTovCSlw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_EP6GOArBEeWkNoOTovCSlw" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_EP6GOQrBEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_EP6GOgrBEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_EP6GOwrBEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_EP6GPArBEeWkNoOTovCSlw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_EP6GPQrBEeWkNoOTovCSlw" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_EP6GPgrBEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_EP6GPwrBEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_EP6GQArBEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_EP6GQQrBEeWkNoOTovCSlw"/>
+ </children>
+ <element xmi:type="uml:Class" href="model.uml#_EP4RAArBEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_EP6GMQrBEeWkNoOTovCSlw" x="810" y="402" height="82"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_OAtR4ArBEeWkNoOTovCSlw" type="2008" fillColor="8905185">
+ <children xmi:type="notation:DecorationNode" xmi:id="_OAtR4grBEeWkNoOTovCSlw" type="5029"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_OAtR4wrBEeWkNoOTovCSlw" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_OAtR5ArBEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_OAtR5QrBEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_OAtR5grBEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_OAtR5wrBEeWkNoOTovCSlw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_OAtR6ArBEeWkNoOTovCSlw" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_OAtR6QrBEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_OAtR6grBEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_OAtR6wrBEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_OAtR7ArBEeWkNoOTovCSlw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_OAt48ArBEeWkNoOTovCSlw" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_OAt48QrBEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_OAt48grBEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_OAt48wrBEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_OAt49ArBEeWkNoOTovCSlw"/>
+ </children>
+ <element xmi:type="uml:Class" href="model.uml#_OArcsArBEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_OAtR4QrBEeWkNoOTovCSlw" x="859" y="684" height="78"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_U3fjggrBEeWkNoOTovCSlw" type="2008" fillColor="8905185">
+ <children xmi:type="notation:DecorationNode" xmi:id="_U3fjgwrBEeWkNoOTovCSlw" type="5029"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_U3fjhArBEeWkNoOTovCSlw" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_U3fjhQrBEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_U3fjhgrBEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_U3fjhwrBEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_U3fjiArBEeWkNoOTovCSlw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_U3fjiQrBEeWkNoOTovCSlw" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_U3fjigrBEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_U3fjiwrBEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_U3fjjArBEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_U3fjjQrBEeWkNoOTovCSlw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_U3fjjgrBEeWkNoOTovCSlw" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_U3fjjwrBEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_U3fjkArBEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_U3fjkQrBEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_U3fjkgrBEeWkNoOTovCSlw"/>
+ </children>
+ <element xmi:type="uml:Class" href="model.uml#_U3fjgArBEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_U3fjlgrBEeWkNoOTovCSlw" x="634" y="682" height="78"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_qjcSkArBEeWkNoOTovCSlw" type="2008" fillColor="8905185">
+ <children xmi:type="notation:DecorationNode" xmi:id="_qjcSkgrBEeWkNoOTovCSlw" type="5029"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_qjcSkwrBEeWkNoOTovCSlw" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_qjcSlArBEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_qjcSlQrBEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_qjcSlgrBEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_qjcSlwrBEeWkNoOTovCSlw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_qjcSmArBEeWkNoOTovCSlw" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_qjcSmQrBEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_qjcSmgrBEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_qjcSmwrBEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_qjcSnArBEeWkNoOTovCSlw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_qjcSnQrBEeWkNoOTovCSlw" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_qjcSngrBEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_qjcSnwrBEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_qjcSoArBEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_qjcSoQrBEeWkNoOTovCSlw"/>
+ </children>
+ <element xmi:type="uml:Class" href="model.uml#_qjadYArBEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_qjcSkQrBEeWkNoOTovCSlw" x="677" y="800" height="74"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_1_-8cArDEeWkNoOTovCSlw" type="2008">
+ <children xmi:type="notation:DecorationNode" xmi:id="_1_-8cgrDEeWkNoOTovCSlw" type="5029"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_1_-8cwrDEeWkNoOTovCSlw" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_1_-8dArDEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_1_-8dQrDEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_1_-8dgrDEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_1_-8dwrDEeWkNoOTovCSlw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_1_-8eArDEeWkNoOTovCSlw" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_1_-8eQrDEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_1_-8egrDEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_1_-8ewrDEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_1_-8fArDEeWkNoOTovCSlw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_1_-8fQrDEeWkNoOTovCSlw" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_1_-8fgrDEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_1_-8fwrDEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_1_-8gArDEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_1_-8gQrDEeWkNoOTovCSlw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_vw-zACD9EeWFusc4sUZ9zQ" type="compartment_shape_display">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_vw-zASD9EeWFusc4sUZ9zQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_vw-zAiD9EeWFusc4sUZ9zQ"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_2d3hwCD9EeWFusc4sUZ9zQ" type="3032">
+ <element xsi:nil="true"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_2d3hwSD9EeWFusc4sUZ9zQ" x="45" y="56"/>
+ </children>
+ <element xmi:type="uml:Class" href="model.uml#_1_9HQArDEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_1_-8cQrDEeWkNoOTovCSlw" x="1045" y="-313" height="57"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_E2OksArUEeWkNoOTovCSlw" type="2008">
+ <children xmi:type="notation:DecorationNode" xmi:id="_E2OksgrUEeWkNoOTovCSlw" type="5029"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_E2OkswrUEeWkNoOTovCSlw" type="7017">
+ <children xmi:type="notation:Shape" xmi:id="_VC2kUArUEeWkNoOTovCSlw" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_VC0vIArUEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_VC2kUQrUEeWkNoOTovCSlw"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_VbcDcArUEeWkNoOTovCSlw" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_VbbcYArUEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_VbcDcQrUEeWkNoOTovCSlw"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_Vu-qgArUEeWkNoOTovCSlw" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_Vu-DcArUEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Vu-qgQrUEeWkNoOTovCSlw"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_WGDGsArUEeWkNoOTovCSlw" type="3012">
+ <element xmi:type="uml:Property" href="model.uml#_WGCfoArUEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_WGDGsQrUEeWkNoOTovCSlw"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_E2OktArUEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_E2OktQrUEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_E2OktgrUEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_E2OktwrUEeWkNoOTovCSlw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_E2OkuArUEeWkNoOTovCSlw" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_E2OkuQrUEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_E2OkugrUEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_E2OkuwrUEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_E2OkvArUEeWkNoOTovCSlw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_E2OkvQrUEeWkNoOTovCSlw" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_E2OkvgrUEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_E2OkvwrUEeWkNoOTovCSlw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_E2OkwArUEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_E2OkwQrUEeWkNoOTovCSlw"/>
+ </children>
+ <element xmi:type="uml:Class" href="model.uml#_E2MvgArUEeWkNoOTovCSlw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_E2OksQrUEeWkNoOTovCSlw" x="1593" y="471" width="175" height="159"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_scOoQCD-EeWFusc4sUZ9zQ" type="2008">
+ <children xmi:type="notation:DecorationNode" xmi:id="_scPPUCD-EeWFusc4sUZ9zQ" type="5029"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_scPPUSD-EeWFusc4sUZ9zQ" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_scPPUiD-EeWFusc4sUZ9zQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_scPPUyD-EeWFusc4sUZ9zQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_scPPVCD-EeWFusc4sUZ9zQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_scPPVSD-EeWFusc4sUZ9zQ"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_scPPViD-EeWFusc4sUZ9zQ" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_scPPVyD-EeWFusc4sUZ9zQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_scPPWCD-EeWFusc4sUZ9zQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_scPPWSD-EeWFusc4sUZ9zQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_scPPWiD-EeWFusc4sUZ9zQ"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_scPPWyD-EeWFusc4sUZ9zQ" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_scPPXCD-EeWFusc4sUZ9zQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_scPPXSD-EeWFusc4sUZ9zQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_scPPXiD-EeWFusc4sUZ9zQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_scPPXyD-EeWFusc4sUZ9zQ"/>
+ </children>
+ <element xmi:type="uml:Class" href="model.uml#_scKW0CD-EeWFusc4sUZ9zQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_scOoQSD-EeWFusc4sUZ9zQ" x="1119" y="255" width="155" height="74"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_wZ6JUCD_EeWFusc4sUZ9zQ" type="2008">
+ <children xmi:type="notation:DecorationNode" xmi:id="_wZ6JUiD_EeWFusc4sUZ9zQ" type="5029"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_wZ6JUyD_EeWFusc4sUZ9zQ" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_wZ6JVCD_EeWFusc4sUZ9zQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_wZ6JVSD_EeWFusc4sUZ9zQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_wZ6JViD_EeWFusc4sUZ9zQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_wZ6JVyD_EeWFusc4sUZ9zQ"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_wZ6JWCD_EeWFusc4sUZ9zQ" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_wZ6JWSD_EeWFusc4sUZ9zQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_wZ6JWiD_EeWFusc4sUZ9zQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_wZ6JWyD_EeWFusc4sUZ9zQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_wZ6JXCD_EeWFusc4sUZ9zQ"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_wZ6JXSD_EeWFusc4sUZ9zQ" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_wZ6JXiD_EeWFusc4sUZ9zQ"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_wZ6JXyD_EeWFusc4sUZ9zQ"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_wZ6JYCD_EeWFusc4sUZ9zQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_wZ6JYSD_EeWFusc4sUZ9zQ"/>
+ </children>
+ <element xmi:type="uml:Class" href="model.uml#_wZ4UICD_EeWFusc4sUZ9zQ"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_wZ6JUSD_EeWFusc4sUZ9zQ" x="789" y="259" width="166" height="76"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_aytSwCPxEeW21PC6xbr-bA" type="2008">
+ <children xmi:type="notation:DecorationNode" xmi:id="_ayt50CPxEeW21PC6xbr-bA" type="5029"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_ayt50SPxEeW21PC6xbr-bA" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_ayt50iPxEeW21PC6xbr-bA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_ayt50yPxEeW21PC6xbr-bA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_ayt51CPxEeW21PC6xbr-bA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ayt51SPxEeW21PC6xbr-bA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_ayt51iPxEeW21PC6xbr-bA" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_ayt51yPxEeW21PC6xbr-bA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_ayt52CPxEeW21PC6xbr-bA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_ayt52SPxEeW21PC6xbr-bA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ayt52iPxEeW21PC6xbr-bA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_ayug4CPxEeW21PC6xbr-bA" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_ayug4SPxEeW21PC6xbr-bA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_ayug4iPxEeW21PC6xbr-bA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_ayug4yPxEeW21PC6xbr-bA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ayug5CPxEeW21PC6xbr-bA"/>
+ </children>
+ <element xmi:type="uml:Class" href="model.uml#_ayCkYCPxEeW21PC6xbr-bA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_aytSwSPxEeW21PC6xbr-bA" x="1192" y="-356" height="46"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_cgJE8SPxEeW21PC6xbr-bA" type="2008">
+ <children xmi:type="notation:DecorationNode" xmi:id="_cgJE8iPxEeW21PC6xbr-bA" type="5029"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_cgJE8yPxEeW21PC6xbr-bA" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_cgJE9CPxEeW21PC6xbr-bA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_cgJE9SPxEeW21PC6xbr-bA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_cgJE9iPxEeW21PC6xbr-bA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_cgJE9yPxEeW21PC6xbr-bA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_cgJE-CPxEeW21PC6xbr-bA" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_cgJE-SPxEeW21PC6xbr-bA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_cgJE-iPxEeW21PC6xbr-bA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_cgJE-yPxEeW21PC6xbr-bA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_cgJE_CPxEeW21PC6xbr-bA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_cgJE_SPxEeW21PC6xbr-bA" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_cgJE_iPxEeW21PC6xbr-bA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_cgJE_yPxEeW21PC6xbr-bA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_cgJFACPxEeW21PC6xbr-bA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_cgJFASPxEeW21PC6xbr-bA"/>
+ </children>
+ <element xmi:type="uml:Class" href="model.uml#_cgJE8CPxEeW21PC6xbr-bA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_cgJFBSPxEeW21PC6xbr-bA" x="1188" y="-301" height="46"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_f_LXoCPxEeW21PC6xbr-bA" type="2008">
+ <children xmi:type="notation:DecorationNode" xmi:id="_f_LXoSPxEeW21PC6xbr-bA" type="5029"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_f_LXoiPxEeW21PC6xbr-bA" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_f_LXoyPxEeW21PC6xbr-bA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_f_LXpCPxEeW21PC6xbr-bA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_f_LXpSPxEeW21PC6xbr-bA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_f_LXpiPxEeW21PC6xbr-bA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_f_LXpyPxEeW21PC6xbr-bA" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_f_LXqCPxEeW21PC6xbr-bA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_f_LXqSPxEeW21PC6xbr-bA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_f_LXqiPxEeW21PC6xbr-bA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_f_LXqyPxEeW21PC6xbr-bA"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_f_LXrCPxEeW21PC6xbr-bA" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_f_LXrSPxEeW21PC6xbr-bA"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_f_LXriPxEeW21PC6xbr-bA"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_f_LXryPxEeW21PC6xbr-bA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_f_LXsCPxEeW21PC6xbr-bA"/>
+ </children>
+ <element xmi:type="uml:Class" href="model.uml#_f_KwkCPxEeW21PC6xbr-bA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_f_LXtCPxEeW21PC6xbr-bA" x="1191" y="-246" height="46"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_OoCygC-_EeWtJpOtnfchGg" type="2008" fillColor="10265827">
+ <children xmi:type="notation:DecorationNode" xmi:id="_OoDZkC-_EeWtJpOtnfchGg" type="5029"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_OoDZkS-_EeWtJpOtnfchGg" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_OoDZki-_EeWtJpOtnfchGg"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_OoDZky-_EeWtJpOtnfchGg"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_OoDZlC-_EeWtJpOtnfchGg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_OoDZlS-_EeWtJpOtnfchGg"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_OoDZli-_EeWtJpOtnfchGg" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_OoDZly-_EeWtJpOtnfchGg"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_OoDZmC-_EeWtJpOtnfchGg"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_OoDZmS-_EeWtJpOtnfchGg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_OoDZmi-_EeWtJpOtnfchGg"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_OoEAoC-_EeWtJpOtnfchGg" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_OoEAoS-_EeWtJpOtnfchGg"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_OoEAoi-_EeWtJpOtnfchGg"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_OoEAoy-_EeWtJpOtnfchGg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_OoEApC-_EeWtJpOtnfchGg"/>
+ </children>
+ <element xmi:type="uml:Class" href="model.uml#_OnjDQC-_EeWtJpOtnfchGg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_OoCygS-_EeWtJpOtnfchGg" x="988" y="342" height="65"/>
+ </children>
+ <styles xmi:type="notation:StringValueStyle" xmi:id="_tptY8QidEeWgbbgaC4xhOQ" name="diagram_compatibility_version" stringValue="1.0.0"/>
+ <styles xmi:type="notation:DiagramStyle" xmi:id="_tptY8gidEeWgbbgaC4xhOQ"/>
+ <styles xmi:type="style:PapyrusViewStyle" xmi:id="_tptY8widEeWgbbgaC4xhOQ">
+ <owner xmi:type="uml:Model" href="model.uml#_tpbsIAidEeWgbbgaC4xhOQ"/>
+ </styles>
+ <element xmi:type="uml:Model" href="model.uml#_tpbsIAidEeWgbbgaC4xhOQ"/>
+ <edges xmi:type="notation:Connector" xmi:id="_NPhBsAihEeWgbbgaC4xhOQ" type="4001" source="_6ejSgAifEeWgbbgaC4xhOQ" target="_sWFjAAifEeWgbbgaC4xhOQ">
+ <children xmi:type="notation:DecorationNode" xmi:id="_NPhBswihEeWgbbgaC4xhOQ" type="6001">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_NPhBtAihEeWgbbgaC4xhOQ" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_NPhBtQihEeWgbbgaC4xhOQ" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_NPhBtgihEeWgbbgaC4xhOQ" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_NPhBtwihEeWgbbgaC4xhOQ" type="6003">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_NPhBuAihEeWgbbgaC4xhOQ" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_NPhBuQihEeWgbbgaC4xhOQ" type="6005">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_NPhBugihEeWgbbgaC4xhOQ" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_NPhBuwihEeWgbbgaC4xhOQ" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_NPhBvAihEeWgbbgaC4xhOQ" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_NPhowAihEeWgbbgaC4xhOQ" type="6034">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_NPhowQihEeWgbbgaC4xhOQ" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_NPhBsQihEeWgbbgaC4xhOQ"/>
+ <element xmi:type="uml:Association" href="model.uml#_NPfMgwihEeWgbbgaC4xhOQ"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_NPhBsgihEeWgbbgaC4xhOQ" points="[-97, -10, 210, 21]$[-269, -80, 38, -49]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_UeNdAAihEeWgbbgaC4xhOQ" id="(0.0,0.3983050847457627)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_NPqysAihEeWgbbgaC4xhOQ" id="(1.0,0.4155844155844156)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_j6XFwArBEeWkNoOTovCSlw" type="4002" source="_U3fjggrBEeWkNoOTovCSlw" target="_EP6GMArBEeWkNoOTovCSlw">
+ <children xmi:type="notation:DecorationNode" xmi:id="_j6XFwwrBEeWkNoOTovCSlw" type="6007">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_j6XFxArBEeWkNoOTovCSlw" y="40"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_j6XFwQrBEeWkNoOTovCSlw"/>
+ <element xmi:type="uml:Generalization" href="model.uml#_j6V3oArBEeWkNoOTovCSlw"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_j6XFwgrBEeWkNoOTovCSlw" points="[18, -39, -68, 87]$[42, -167, -44, -41]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_2TtcACEEEeWFusc4sUZ9zQ" id="(0.6484018264840182,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_2TuDECEEEeWFusc4sUZ9zQ" id="(0.3,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_lVqmIArBEeWkNoOTovCSlw" type="4002" source="_OAtR4ArBEeWkNoOTovCSlw" target="_EP6GMArBEeWkNoOTovCSlw">
+ <children xmi:type="notation:DecorationNode" xmi:id="_lVqmIwrBEeWkNoOTovCSlw" type="6007">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_lVqmJArBEeWkNoOTovCSlw" y="40"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_lVqmIQrBEeWkNoOTovCSlw"/>
+ <element xmi:type="uml:Generalization" href="model.uml#_lVpYAArBEeWkNoOTovCSlw"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_lVqmIgrBEeWkNoOTovCSlw" points="[-7, -8, 52, 69]$[-49, -58, 10, 19]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_lVtCYArBEeWkNoOTovCSlw" id="(0.5179039301310043,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_lVtCYQrBEeWkNoOTovCSlw" id="(0.58,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_m6YhMArBEeWkNoOTovCSlw" type="4001" source="_OAtR4ArBEeWkNoOTovCSlw" target="_6ExcYAimEeWgbbgaC4xhOQ">
+ <children xmi:type="notation:DecorationNode" xmi:id="_m6YhMwrBEeWkNoOTovCSlw" type="6001">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_m6YhNArBEeWkNoOTovCSlw" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_m6YhNQrBEeWkNoOTovCSlw" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_m6YhNgrBEeWkNoOTovCSlw" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_m6YhNwrBEeWkNoOTovCSlw" type="6003">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_m6YhOArBEeWkNoOTovCSlw" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_m6YhOQrBEeWkNoOTovCSlw" type="6005">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_m6YhOgrBEeWkNoOTovCSlw" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_m6ZIQArBEeWkNoOTovCSlw" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_m6ZIQQrBEeWkNoOTovCSlw" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_m6ZIQgrBEeWkNoOTovCSlw" type="6034">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_m6ZIQwrBEeWkNoOTovCSlw" x="65" y="-61"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_m6YhMQrBEeWkNoOTovCSlw"/>
+ <element xmi:type="uml:Association" href="model.uml#_m6WE8wrBEeWkNoOTovCSlw"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_m6YhMgrBEeWkNoOTovCSlw" points="[0, 1, -142, -187]$[142, 188, 0, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_m6en0ArBEeWkNoOTovCSlw" id="(0.7449781659388647,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_m6en0QrBEeWkNoOTovCSlw" id="(0.0,0.07363420427553444)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_xVAF8ArBEeWkNoOTovCSlw" type="4001" source="_U3fjggrBEeWkNoOTovCSlw" target="_qjcSkArBEeWkNoOTovCSlw">
+ <children xmi:type="notation:DecorationNode" xmi:id="_xVAF8wrBEeWkNoOTovCSlw" type="6001">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_xVAtAArBEeWkNoOTovCSlw" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_xVAtAQrBEeWkNoOTovCSlw" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_xVAtAgrBEeWkNoOTovCSlw" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_xVAtAwrBEeWkNoOTovCSlw" type="6003">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_xVAtBArBEeWkNoOTovCSlw" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_xVAtBQrBEeWkNoOTovCSlw" type="6005">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_xVAtBgrBEeWkNoOTovCSlw" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_xVAtBwrBEeWkNoOTovCSlw" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_xVAtCArBEeWkNoOTovCSlw" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_xVAtCQrBEeWkNoOTovCSlw" type="6034">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_xVAtCgrBEeWkNoOTovCSlw" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_xVAF8QrBEeWkNoOTovCSlw"/>
+ <element xmi:type="uml:Association" href="model.uml#_xU-QwwrBEeWkNoOTovCSlw"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_xVAF8grBEeWkNoOTovCSlw" points="[-50, -6, 121, -5]$[-221, -6, -50, -5]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_c5B78CEFEeWFusc4sUZ9zQ" id="(0.5132420091324201,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_c5B78SEFEeWFusc4sUZ9zQ" id="(0.4155688622754491,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_AXzkgArHEeWkNoOTovCSlw" type="4001" source="_rc5pYAotEeWkNoOTovCSlw" target="_6ExcYAimEeWgbbgaC4xhOQ">
+ <children xmi:type="notation:DecorationNode" xmi:id="_AX0LkArHEeWkNoOTovCSlw" type="6001">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_AX0LkQrHEeWkNoOTovCSlw" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_AX0LkgrHEeWkNoOTovCSlw" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_AX0LkwrHEeWkNoOTovCSlw" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_AX0LlArHEeWkNoOTovCSlw" type="6003">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_AX0LlQrHEeWkNoOTovCSlw" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_AX0LlgrHEeWkNoOTovCSlw" type="6005">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_AX0LlwrHEeWkNoOTovCSlw" x="-31" y="-52"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_AX0LmArHEeWkNoOTovCSlw" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_AX0LmQrHEeWkNoOTovCSlw" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_AX0LmgrHEeWkNoOTovCSlw" type="6034">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_AX0LmwrHEeWkNoOTovCSlw" x="-31" y="-92"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_AXzkgQrHEeWkNoOTovCSlw"/>
+ <element xmi:type="uml:Association" href="model.uml#_AXxIQArHEeWkNoOTovCSlw"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_AXzkggrHEeWkNoOTovCSlw" points="[0, 0, -43, -105]$[0, 99, -43, -6]$[0, 105, -43, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_AX5EEArHEeWkNoOTovCSlw" id="(0.49159663865546216,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_AX5EEQrHEeWkNoOTovCSlw" id="(0.6194029850746269,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_ixWUoArUEeWkNoOTovCSlw" type="4001" source="_E2OksArUEeWkNoOTovCSlw" target="_8OWuIAidEeWgbbgaC4xhOQ">
+ <children xmi:type="notation:DecorationNode" xmi:id="_ixWUowrUEeWkNoOTovCSlw" type="6001">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ixWUpArUEeWkNoOTovCSlw" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_ixWUpQrUEeWkNoOTovCSlw" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ixWUpgrUEeWkNoOTovCSlw" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_ixWUpwrUEeWkNoOTovCSlw" type="6003">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ixWUqArUEeWkNoOTovCSlw" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_ixWUqQrUEeWkNoOTovCSlw" type="6005">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ixW7sArUEeWkNoOTovCSlw" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_ixW7sQrUEeWkNoOTovCSlw" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ixW7sgrUEeWkNoOTovCSlw" x="-2" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_ixW7swrUEeWkNoOTovCSlw" type="6034">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ixW7tArUEeWkNoOTovCSlw" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_ixWUoQrUEeWkNoOTovCSlw"/>
+ <element xmi:type="uml:Association" href="model.uml#_ixUfcArUEeWkNoOTovCSlw"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_ixWUogrUEeWkNoOTovCSlw" points="[3, -8, 0, 113]$[-22, -81, -25, 40]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_ixamEArUEeWkNoOTovCSlw" id="(0.33714285714285713,0.09433962264150944)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_ixbNIArUEeWkNoOTovCSlw" id="(0.3089005235602094,0.9471153846153846)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_ldg_8ArUEeWkNoOTovCSlw" type="4001" source="_E2OksArUEeWkNoOTovCSlw" target="_8OWuIAidEeWgbbgaC4xhOQ">
+ <children xmi:type="notation:DecorationNode" xmi:id="_ldg_8wrUEeWkNoOTovCSlw" type="6001">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ldg_9ArUEeWkNoOTovCSlw" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_ldg_9QrUEeWkNoOTovCSlw" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ldg_9grUEeWkNoOTovCSlw" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_ldg_9wrUEeWkNoOTovCSlw" type="6003">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ldg_-ArUEeWkNoOTovCSlw" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_ldg_-QrUEeWkNoOTovCSlw" type="6005">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ldg_-grUEeWkNoOTovCSlw" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_ldhnAArUEeWkNoOTovCSlw" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ldhnAQrUEeWkNoOTovCSlw" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_ldhnAgrUEeWkNoOTovCSlw" type="6034">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ldhnAwrUEeWkNoOTovCSlw" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_ldg_8QrUEeWkNoOTovCSlw"/>
+ <element xmi:type="uml:Association" href="model.uml#_ldfKwArUEeWkNoOTovCSlw"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_ldg_8grUEeWkNoOTovCSlw" points="[-5, -13, 0, 80]$[-3, -86, 2, 7]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_ldl4cArUEeWkNoOTovCSlw" id="(0.7714285714285715,0.11320754716981132)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_ldl4cQrUEeWkNoOTovCSlw" id="(0.7801047120418848,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_2eCg4CD9EeWFusc4sUZ9zQ" type="4022" source="_2d3hwCD9EeWFusc4sUZ9zQ" target="_6ejSgAifEeWgbbgaC4xhOQ">
+ <styles xmi:type="notation:FontStyle" xmi:id="_2eCg4SD9EeWFusc4sUZ9zQ"/>
+ <element xsi:nil="true"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_2eCg4iD9EeWFusc4sUZ9zQ" points="[9, 1, -1095, -206]$[1007, 188, -97, -19]"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_2KsRoCD-EeWFusc4sUZ9zQ" type="4001" source="_6ejSgAifEeWgbbgaC4xhOQ" target="_scOoQCD-EeWFusc4sUZ9zQ">
+ <children xmi:type="notation:DecorationNode" xmi:id="_2KsRoyD-EeWFusc4sUZ9zQ" type="6001">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_2KsRpCD-EeWFusc4sUZ9zQ" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_2Ks4sCD-EeWFusc4sUZ9zQ" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_2Ks4sSD-EeWFusc4sUZ9zQ" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_2Ks4siD-EeWFusc4sUZ9zQ" type="6003">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_2Ks4syD-EeWFusc4sUZ9zQ" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_2Ks4tCD-EeWFusc4sUZ9zQ" type="6005">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_2Ks4tSD-EeWFusc4sUZ9zQ" x="85" y="86"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_2Ks4tiD-EeWFusc4sUZ9zQ" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_2Ks4tyD-EeWFusc4sUZ9zQ" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_2Ks4uCD-EeWFusc4sUZ9zQ" type="6034">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_2Ks4uSD-EeWFusc4sUZ9zQ" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_2KsRoSD-EeWFusc4sUZ9zQ"/>
+ <element xmi:type="uml:Association" href="model.uml#_2Kp1YCD-EeWFusc4sUZ9zQ"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_2KsRoiD-EeWFusc4sUZ9zQ" points="[3, 35, -12, -109]$[14, 107, -1, -37]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_2K0NcCD-EeWFusc4sUZ9zQ" id="(0.5,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_6VNKQCD-EeWFusc4sUZ9zQ" id="(0.4967741935483871,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_8xwFMCD-EeWFusc4sUZ9zQ" type="4001" source="_scOoQCD-EeWFusc4sUZ9zQ" target="_rc5pYAotEeWkNoOTovCSlw">
+ <children xmi:type="notation:DecorationNode" xmi:id="_8xwsQCD-EeWFusc4sUZ9zQ" type="6001">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_8xwsQSD-EeWFusc4sUZ9zQ" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_8xwsQiD-EeWFusc4sUZ9zQ" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_8xwsQyD-EeWFusc4sUZ9zQ" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_8xwsRCD-EeWFusc4sUZ9zQ" type="6003">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_8xwsRSD-EeWFusc4sUZ9zQ" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_8xwsRiD-EeWFusc4sUZ9zQ" type="6005">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_8xwsRyD-EeWFusc4sUZ9zQ" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_8xwsSCD-EeWFusc4sUZ9zQ" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_8xxTUCD-EeWFusc4sUZ9zQ" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_8xxTUSD-EeWFusc4sUZ9zQ" type="6034">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_8xxTUiD-EeWFusc4sUZ9zQ" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_8xwFMSD-EeWFusc4sUZ9zQ"/>
+ <element xmi:type="uml:Association" href="model.uml#_8xto8CD-EeWFusc4sUZ9zQ"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_8xwFMiD-EeWFusc4sUZ9zQ" points="[7, 16, -71, -156]$[82, 132, 4, -40]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_8x3Z8CD-EeWFusc4sUZ9zQ" id="(0.5741935483870968,0.8648648648648649)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_8x3Z8SD-EeWFusc4sUZ9zQ" id="(0.40336134453781514,0.016891891891891893)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_gUioQCD_EeWFusc4sUZ9zQ" type="4001" source="_6ejSgAifEeWgbbgaC4xhOQ" target="_6CfP8ArAEeWkNoOTovCSlw">
+ <children xmi:type="notation:DecorationNode" xmi:id="_gUjPUCD_EeWFusc4sUZ9zQ" type="6001">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_gUjPUSD_EeWFusc4sUZ9zQ" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_gUjPUiD_EeWFusc4sUZ9zQ" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_gUjPUyD_EeWFusc4sUZ9zQ" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_gUjPVCD_EeWFusc4sUZ9zQ" type="6003">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_gUjPVSD_EeWFusc4sUZ9zQ" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_gUjPViD_EeWFusc4sUZ9zQ" type="6005">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_gUjPVyD_EeWFusc4sUZ9zQ" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_gUjPWCD_EeWFusc4sUZ9zQ" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_gUjPWSD_EeWFusc4sUZ9zQ" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_gUj2YCD_EeWFusc4sUZ9zQ" type="6034">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_gUj2YSD_EeWFusc4sUZ9zQ" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_gUioQSD_EeWFusc4sUZ9zQ"/>
+ <element xmi:type="uml:Association" href="model.uml#_gUgMACD_EeWFusc4sUZ9zQ"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_gUioQiD_EeWFusc4sUZ9zQ" points="[0, 0, 136, -43]$[-100, 43, 36, 0]$[-105, 43, 31, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_gUp9ACD_EeWFusc4sUZ9zQ" id="(0.32989690721649484,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_lv1MQCD_EeWFusc4sUZ9zQ" id="(0.8253012048192772,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_VaOdgCEEEeWFusc4sUZ9zQ" type="4001" source="_6CfP8ArAEeWkNoOTovCSlw" target="_wZ6JUCD_EeWFusc4sUZ9zQ">
+ <children xmi:type="notation:DecorationNode" xmi:id="_VaOdgyEEEeWFusc4sUZ9zQ" type="6001">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_VaOdhCEEEeWFusc4sUZ9zQ" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_VaOdhSEEEeWFusc4sUZ9zQ" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_VaPEkCEEEeWFusc4sUZ9zQ" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_VaPEkSEEEeWFusc4sUZ9zQ" type="6003">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_VaPEkiEEEeWFusc4sUZ9zQ" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_VaPEkyEEEeWFusc4sUZ9zQ" type="6005">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_VaPElCEEEeWFusc4sUZ9zQ" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_VaPElSEEEeWFusc4sUZ9zQ" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_VaPEliEEEeWFusc4sUZ9zQ" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_VaPElyEEEeWFusc4sUZ9zQ" type="6034">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_VaPEmCEEEeWFusc4sUZ9zQ" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_VaOdgSEEEeWFusc4sUZ9zQ"/>
+ <element xmi:type="uml:Association" href="model.uml#_VaMBQCEEEeWFusc4sUZ9zQ"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_VaOdgiEEEeWFusc4sUZ9zQ" points="[0, 0, 22, -37]$[-22, 37, 0, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_VaVLMCEEEeWFusc4sUZ9zQ" id="(0.43373493975903615,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_VaVLMSEEEeWFusc4sUZ9zQ" id="(0.47,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_eeSfACEEEeWFusc4sUZ9zQ" type="4001" source="_scOoQCD-EeWFusc4sUZ9zQ" target="_wZ6JUCD_EeWFusc4sUZ9zQ">
+ <children xmi:type="notation:DecorationNode" xmi:id="_eeSfAyEEEeWFusc4sUZ9zQ" type="6001">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_eeSfBCEEEeWFusc4sUZ9zQ" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_eeSfBSEEEeWFusc4sUZ9zQ" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_eeSfBiEEEeWFusc4sUZ9zQ" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_eeSfByEEEeWFusc4sUZ9zQ" type="6003">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_eeSfCCEEEeWFusc4sUZ9zQ" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_eeSfCSEEEeWFusc4sUZ9zQ" type="6005">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_eeSfCiEEEeWFusc4sUZ9zQ" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_eeTGECEEEeWFusc4sUZ9zQ" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_eeTGESEEEeWFusc4sUZ9zQ" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_eeTGEiEEEeWFusc4sUZ9zQ" type="6034">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_eeTGEyEEEeWFusc4sUZ9zQ" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_eeSfASEEEeWFusc4sUZ9zQ"/>
+ <element xmi:type="uml:Association" href="model.uml#_eeQCwCEEEeWFusc4sUZ9zQ"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_eeSfAiEEEeWFusc4sUZ9zQ" points="[-16, -4, 184, 3]$[-150, -4, 50, 3]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_eeZMsCEEEeWFusc4sUZ9zQ" id="(0.012903225806451613,0.581081081081081)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_s_qdwCEEEeWFusc4sUZ9zQ" id="(1.0,0.4868421052631579)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_FF8hQCEFEeWFusc4sUZ9zQ" type="4001" source="_wZ6JUCD_EeWFusc4sUZ9zQ" target="_EP6GMArBEeWkNoOTovCSlw">
+ <children xmi:type="notation:DecorationNode" xmi:id="_FF8hQyEFEeWFusc4sUZ9zQ" type="6001">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_FF8hRCEFEeWFusc4sUZ9zQ" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_FF8hRSEFEeWFusc4sUZ9zQ" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_FF8hRiEFEeWFusc4sUZ9zQ" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_FF8hRyEFEeWFusc4sUZ9zQ" type="6003">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_FF8hSCEFEeWFusc4sUZ9zQ" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_FF9IUCEFEeWFusc4sUZ9zQ" type="6005">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_FF9IUSEFEeWFusc4sUZ9zQ" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_FF9IUiEFEeWFusc4sUZ9zQ" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_FF9IUyEFEeWFusc4sUZ9zQ" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_FF9IVCEFEeWFusc4sUZ9zQ" type="6034">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_FF9IVSEFEeWFusc4sUZ9zQ" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_FF8hQSEFEeWFusc4sUZ9zQ"/>
+ <element xmi:type="uml:Association" href="model.uml#_FF6FACEFEeWFusc4sUZ9zQ"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_FF8hQiEFEeWFusc4sUZ9zQ" points="[-5, 38, 8, -85]$[-14, 105, -1, -18]"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_FGDO8CEFEeWFusc4sUZ9zQ" id="(0.49,0.21951219512195122)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_mHCtwCPxEeW21PC6xbr-bA" type="4002" source="_aytSwCPxEeW21PC6xbr-bA" target="_1_-8cArDEeWkNoOTovCSlw">
+ <children xmi:type="notation:DecorationNode" xmi:id="_mHCtwyPxEeW21PC6xbr-bA" type="6007">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_mHCtxCPxEeW21PC6xbr-bA" y="40"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_mHCtwSPxEeW21PC6xbr-bA"/>
+ <element xmi:type="uml:Generalization" href="model.uml#_mG6x8CPxEeW21PC6xbr-bA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_mHCtwiPxEeW21PC6xbr-bA" points="[-63, -20, 128, 40]$[-191, -78, 0, -18]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_mlpVUCPxEeW21PC6xbr-bA" id="(0.0,0.3130434782608696)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_mHHmQCPxEeW21PC6xbr-bA" id="(1.0,0.2982456140350877)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_oomEgCPxEeW21PC6xbr-bA" type="4002" source="_cgJE8SPxEeW21PC6xbr-bA" target="_1_-8cArDEeWkNoOTovCSlw">
+ <children xmi:type="notation:DecorationNode" xmi:id="_oomrkCPxEeW21PC6xbr-bA" type="6007">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_oomrkSPxEeW21PC6xbr-bA" y="40"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_oomEgSPxEeW21PC6xbr-bA"/>
+ <element xmi:type="uml:Generalization" href="model.uml#_ooldcCPxEeW21PC6xbr-bA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_oomEgiPxEeW21PC6xbr-bA" points="[-62, -6, 233, 25]$[-294, -3, 1, 28]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_r74aMCPxEeW21PC6xbr-bA" id="(0.0,0.3695652173913043)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_oopu4CPxEeW21PC6xbr-bA" id="(1.0,0.5087719298245614)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_qWuaQCPxEeW21PC6xbr-bA" type="4002" source="_f_LXoCPxEeW21PC6xbr-bA" target="_1_-8cArDEeWkNoOTovCSlw">
+ <children xmi:type="notation:DecorationNode" xmi:id="_qWvBUCPxEeW21PC6xbr-bA" type="6007">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_qWvBUSPxEeW21PC6xbr-bA" y="40"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_qWuaQSPxEeW21PC6xbr-bA"/>
+ <element xmi:type="uml:Generalization" href="model.uml#_qWtMICPxEeW21PC6xbr-bA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_qWuaQiPxEeW21PC6xbr-bA" points="[-62, -9, 433, 65]$[-432, -65, 63, 9]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_sfA8cCPxEeW21PC6xbr-bA" id="(0.0,0.13043478260869565)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_sfA8cSPxEeW21PC6xbr-bA" id="(1.0,0.7192982456140351)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_NXbHcCPzEeW21PC6xbr-bA" type="4001" source="_6ejSgAifEeWgbbgaC4xhOQ" target="_E2OksArUEeWkNoOTovCSlw">
+ <children xmi:type="notation:DecorationNode" xmi:id="_NXbugCPzEeW21PC6xbr-bA" type="6001">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_NXbugSPzEeW21PC6xbr-bA" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_NXbugiPzEeW21PC6xbr-bA" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_NXbugyPzEeW21PC6xbr-bA" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_NXbuhCPzEeW21PC6xbr-bA" type="6003">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_NXbuhSPzEeW21PC6xbr-bA" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_NXbuhiPzEeW21PC6xbr-bA" type="6005">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_NXbuhyPzEeW21PC6xbr-bA" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_NXbuiCPzEeW21PC6xbr-bA" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_NXbuiSPzEeW21PC6xbr-bA" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_NXcVkCPzEeW21PC6xbr-bA" type="6034">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_NXcVkSPzEeW21PC6xbr-bA" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_NXbHcSPzEeW21PC6xbr-bA"/>
+ <element xmi:type="uml:Association" href="model.uml#_NXYrMCPzEeW21PC6xbr-bA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_NXbHciPzEeW21PC6xbr-bA" points="[48, 35, -695, -507]$[743, 485, 0, -57]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_NXmtoCPzEeW21PC6xbr-bA" id="(0.9206185567010309,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_NXmtoSPzEeW21PC6xbr-bA" id="(0.0,0.1169811320754717)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_Os5FkCPzEeW21PC6xbr-bA" type="4001" source="_rc5pYAotEeWkNoOTovCSlw" target="_E2OksArUEeWkNoOTovCSlw">
+ <children xmi:type="notation:DecorationNode" xmi:id="_Os5FkyPzEeW21PC6xbr-bA" type="6001">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Os5soCPzEeW21PC6xbr-bA" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_Os5soSPzEeW21PC6xbr-bA" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Os5soiPzEeW21PC6xbr-bA" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_Os5soyPzEeW21PC6xbr-bA" type="6003">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Os5spCPzEeW21PC6xbr-bA" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_Os5spSPzEeW21PC6xbr-bA" type="6005">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Os5spiPzEeW21PC6xbr-bA" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_Os5spyPzEeW21PC6xbr-bA" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Os5sqCPzEeW21PC6xbr-bA" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_Os5sqSPzEeW21PC6xbr-bA" type="6034">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Os5sqiPzEeW21PC6xbr-bA" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_Os5FkSPzEeW21PC6xbr-bA"/>
+ <element xmi:type="uml:Association" href="model.uml#_Os2pUyPzEeW21PC6xbr-bA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Os5FkiPzEeW21PC6xbr-bA" points="[28, -5, -477, 85]$[506, -21, 1, 69]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_OtBocCPzEeW21PC6xbr-bA" id="(1.0,0.9054054054054054)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_OtBocSPzEeW21PC6xbr-bA" id="(0.0,0.5144654088050314)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_chCK4CPzEeW21PC6xbr-bA" type="4001" source="_6ExcYAimEeWgbbgaC4xhOQ" target="_E2OksArUEeWkNoOTovCSlw">
+ <children xmi:type="notation:DecorationNode" xmi:id="_chCx8CPzEeW21PC6xbr-bA" type="6001">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_chCx8SPzEeW21PC6xbr-bA" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_chCx8iPzEeW21PC6xbr-bA" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_chCx8yPzEeW21PC6xbr-bA" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_chCx9CPzEeW21PC6xbr-bA" type="6003">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_chCx9SPzEeW21PC6xbr-bA" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_chCx9iPzEeW21PC6xbr-bA" type="6005">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_chCx9yPzEeW21PC6xbr-bA" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_chCx-CPzEeW21PC6xbr-bA" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_chCx-SPzEeW21PC6xbr-bA" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_chCx-iPzEeW21PC6xbr-bA" type="6034">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_chCx-yPzEeW21PC6xbr-bA" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_chCK4SPzEeW21PC6xbr-bA"/>
+ <element xmi:type="uml:Association" href="model.uml#_cg_uoCPzEeW21PC6xbr-bA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_chCK4iPzEeW21PC6xbr-bA" points="[13, -10, -286, 220]$[300, -213, 1, 17]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_chJfoCPzEeW21PC6xbr-bA" id="(1.0,0.00332541567695962)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_chJfoSPzEeW21PC6xbr-bA" id="(0.0,0.9371069182389937)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_ZV1gkCP7EeWgfeI19M_f4A" type="4001" source="_6ExcYAimEeWgbbgaC4xhOQ" target="_rc5pYAotEeWkNoOTovCSlw">
+ <children xmi:type="notation:DecorationNode" xmi:id="_ZV2HoCP7EeWgfeI19M_f4A" type="6001">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ZV2HoSP7EeWgfeI19M_f4A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_ZV2HoiP7EeWgfeI19M_f4A" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ZV2HoyP7EeWgfeI19M_f4A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_ZV2usCP7EeWgfeI19M_f4A" type="6003">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ZV2usSP7EeWgfeI19M_f4A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_ZV2usiP7EeWgfeI19M_f4A" type="6005">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ZV2usyP7EeWgfeI19M_f4A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_ZV2utCP7EeWgfeI19M_f4A" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ZV2utSP7EeWgfeI19M_f4A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_ZV2utiP7EeWgfeI19M_f4A" type="6034">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_ZV2utyP7EeWgfeI19M_f4A" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_ZV1gkSP7EeWgfeI19M_f4A"/>
+ <element xmi:type="uml:Association" href="model.uml#_ZVY0oCP7EeWgfeI19M_f4A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_ZV1gkiP7EeWgfeI19M_f4A" points="[-5, -60, 16, 185]$[-21, -191, 0, 54]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_ZWAfsCP7EeWgfeI19M_f4A" id="(0.7126865671641791,0.004750593824228029)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_ZWAfsSP7EeWgfeI19M_f4A" id="(0.7941176470588235,0.8547297297297297)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_bT6oMC-_EeWtJpOtnfchGg" type="4001" source="_scOoQCD-EeWFusc4sUZ9zQ" target="_OoCygC-_EeWtJpOtnfchGg">
+ <children xmi:type="notation:DecorationNode" xmi:id="_bT7PQC-_EeWtJpOtnfchGg" type="6001">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_bT7PQS-_EeWtJpOtnfchGg" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_bT7PQi-_EeWtJpOtnfchGg" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_bT7PQy-_EeWtJpOtnfchGg" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_bT7PRC-_EeWtJpOtnfchGg" type="6003">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_bT7PRS-_EeWtJpOtnfchGg" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_bT7PRi-_EeWtJpOtnfchGg" type="6005">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_bT7PRy-_EeWtJpOtnfchGg" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_bT72UC-_EeWtJpOtnfchGg" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_bT72US-_EeWtJpOtnfchGg" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_bT72Ui-_EeWtJpOtnfchGg" type="6034">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_bT72Uy-_EeWtJpOtnfchGg" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_bT6oMS-_EeWtJpOtnfchGg"/>
+ <element xmi:type="uml:Association" href="model.uml#_bT3k4C-_EeWtJpOtnfchGg"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_bT6oMi-_EeWtJpOtnfchGg" points="[-70, 37, 88, -45]$[-155, 50, 3, -32]"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_gV-z4C-_EeWtJpOtnfchGg" type="4001" source="_wZ6JUCD_EeWFusc4sUZ9zQ" target="_OoCygC-_EeWtJpOtnfchGg">
+ <children xmi:type="notation:DecorationNode" xmi:id="_gV-z4y-_EeWtJpOtnfchGg" type="6001">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_gV-z5C-_EeWtJpOtnfchGg" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_gV-z5S-_EeWtJpOtnfchGg" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_gV-z5i-_EeWtJpOtnfchGg" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_gV-z5y-_EeWtJpOtnfchGg" type="6003">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_gV-z6C-_EeWtJpOtnfchGg" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_gV_a8C-_EeWtJpOtnfchGg" type="6005">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_gV_a8S-_EeWtJpOtnfchGg" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_gV_a8i-_EeWtJpOtnfchGg" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_gV_a8y-_EeWtJpOtnfchGg" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_gV_a9C-_EeWtJpOtnfchGg" type="6034">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_gV_a9S-_EeWtJpOtnfchGg" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_gV-z4S-_EeWtJpOtnfchGg"/>
+ <element xmi:type="uml:Association" href="model.uml#_gV7wkC-_EeWtJpOtnfchGg"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_gV-z4i-_EeWtJpOtnfchGg" points="[78, 38, -88, -39]$[116, 71, -50, -6]"/>
+ </edges>
+ </notation:Diagram>
+ <css:ModelStyleSheets xmi:id="_wt0qMAidEeWgbbgaC4xhOQ"/>
+</xmi:XMI>
diff --git a/model/cl-mef-uml/model.uml b/model/cl-mef-uml/model.uml
new file mode 100644
index 0000000..8477c40
--- /dev/null
+++ b/model/cl-mef-uml/model.uml
@@ -0,0 +1,557 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_tpbsIAidEeWgbbgaC4xhOQ" name="model">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_vNORcAoOEeWNdNIyeR54mg">
+ <body></body>
+ </ownedComment>
+ <packagedElement xmi:type="uml:Interaction" xmi:id="_tp0tsAidEeWgbbgaC4xhOQ" name="Interaction1"/>
+ <packagedElement xmi:type="uml:Class" xmi:id="_8JT2EAidEeWgbbgaC4xhOQ" name="BandWidthProfile">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_8JT2EQidEeWgbbgaC4xhOQ" name="committedInfoRate" visibility="private">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_8JT2EgidEeWgbbgaC4xhOQ" name="committedBurtSize" visibility="private">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_8JT2EwidEeWgbbgaC4xhOQ" name="excessInfoRate" visibility="private">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_8JT2FAidEeWgbbgaC4xhOQ" name="excessBurstSize" visibility="private">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer"/>
+ </ownedAttribute>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_8JT2FQidEeWgbbgaC4xhOQ" name="gettersForAllAttributes"/>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_8JT2FgidEeWgbbgaC4xhOQ" name="settersForAllAttributes"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Enumeration" xmi:id="_bDyUwAifEeWgbbgaC4xhOQ" name="EvcType">
+ <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_bDyUwQifEeWgbbgaC4xhOQ" name="POINT_TO_POINT"/>
+ <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_bDyUwgifEeWgbbgaC4xhOQ" name="MULTIPOINT_TO_MULTIPOINT"/>
+ <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_bDyUwwifEeWgbbgaC4xhOQ" name="ROOTED_MULTIPOINT"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Enumeration" xmi:id="_lXjDkAifEeWgbbgaC4xhOQ" name="FrameDelivery">
+ <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_lXjDkQifEeWgbbgaC4xhOQ" name="DISCARD"/>
+ <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_lXjDkgifEeWgbbgaC4xhOQ" name="UNCONDITIONAL"/>
+ <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_lXjDkwifEeWgbbgaC4xhOQ" name="CONDITIONAL"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_sWE78AifEeWgbbgaC4xhOQ" name="EvcPerformance">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_sWE78QifEeWgbbgaC4xhOQ" name="oneWayFrameDelay" visibility="private">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_sWE78gifEeWgbbgaC4xhOQ" name="oneWayFrameDelayRange" visibility="private">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_sWE78wifEeWgbbgaC4xhOQ" name="oneWayMeanFrameDelay" visibility="private">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_sWE79AifEeWgbbgaC4xhOQ" name="oneWayInterFrameDelayVariation" visibility="private">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_sWE79QifEeWgbbgaC4xhOQ" name="oneWayFrameLossRatio" visibility="private">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Real"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_sWE79gifEeWgbbgaC4xhOQ" name="oneWayAvailability" visibility="private">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Real"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_sWE79wifEeWgbbgaC4xhOQ" name="oneWayResilHighLossIntervals" visibility="private">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_sWE7-AifEeWgbbgaC4xhOQ" name="oneWayResilConsecHighLossIntervals" visibility="private">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer"/>
+ </ownedAttribute>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_sWE7-QifEeWgbbgaC4xhOQ" name="gettersForAllAttributes"/>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_sWE7-gifEeWgbbgaC4xhOQ" name="settersForAllAttributes"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_NPfMgwihEeWgbbgaC4xhOQ" memberEnd="_NPfMhAihEeWgbbgaC4xhOQ _NPfMgAihEeWgbbgaC4xhOQ">
+ <name xsi:nil="true"/>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_NPfMhAihEeWgbbgaC4xhOQ" type="_6eiEYAifEeWgbbgaC4xhOQ" association="_NPfMgwihEeWgbbgaC4xhOQ">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_NPfMhQihEeWgbbgaC4xhOQ" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_NPfMhgihEeWgbbgaC4xhOQ" value="1"/>
+ </ownedEnd>
+ </packagedElement>
+ <packagedElement xmi:type="uml:PrimitiveType" xmi:id="_PhJwUAilEeWgbbgaC4xhOQ" name="UUID"/>
+ <packagedElement xmi:type="uml:Enumeration" xmi:id="_7r0AwAioEeWgbbgaC4xhOQ" name="PhysicalLayer">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_3Sw1MAoOEeWNdNIyeR54mg">
+ <body></body>
+ </ownedComment>
+ <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_TY4AwAoOEeWNdNIyeR54mg" name="100BASE_T"/>
+ <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_a3fHYAoOEeWNdNIyeR54mg" name="1000BASE_T"/>
+ <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_f9bGcAoOEeWNdNIyeR54mg" name="10GBASE_T"/>
+ <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_lDtDwAoOEeWNdNIyeR54mg" name="40GBASE_FR"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Enumeration" xmi:id="_EZ-toAoQEeWNdNIyeR54mg" name="UniResiliency" visibility="public">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_EZ-toQoQEeWNdNIyeR54mg">
+ <body></body>
+ </ownedComment>
+ <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_EZ-togoQEeWNdNIyeR54mg" name="NONE"/>
+ <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_EZ-towoQEeWNdNIyeR54mg" name="2_LINK"/>
+ <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_EZ-tpAoQEeWNdNIyeR54mg" name="OTHER"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Enumeration" xmi:id="_BJD6AAoREeWNdNIyeR54mg" name="FrameFormat">
+ <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_C36BcAoREeWNdNIyeR54mg" name="IEEE_802_3"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:DataType" xmi:id="_NmywkAoSEeWNdNIyeR54mg" name="CeVlanEvcPair">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_R81jwAoSEeWNdNIyeR54mg" name="ceVLanId">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_WFs2kAoSEeWNdNIyeR54mg" name="EvcId" type="_PhJwUAilEeWgbbgaC4xhOQ"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:DataType" xmi:id="_PFK9oAoTEeWNdNIyeR54mg" name="Envelope">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_RpbDEAoTEeWNdNIyeR54mg" name="envId">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_VXtSsAoTEeWNdNIyeR54mg" name="CFo">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_bP51IAoTEeWNdNIyeR54mg" name="numBWProfileFlows">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Enumeration" xmi:id="_0_y6wAoTEeWNdNIyeR54mg" name="BWProfilePerUni">
+ <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_2_0RwAoTEeWNdNIyeR54mg" name="NO"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Enumeration" xmi:id="_LO2gcAogEeWNdNIyeR54mg" name="L2cpAddressSet">
+ <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_QHY8sAogEeWNdNIyeR54mg" name="CTB"/>
+ <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_QqMHwAogEeWNdNIyeR54mg" name="CTB_2"/>
+ <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_USdO8AogEeWNdNIyeR54mg" name="CTA"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:DataType" xmi:id="_ybOZUAogEeWNdNIyeR54mg" name="L2cp3Peering">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_8jxWoAogEeWNdNIyeR54mg" name="DestAddr">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_CDK-kAohEeWNdNIyeR54mg" name="ProtocolIdentifier" type="_PhJwUAilEeWgbbgaC4xhOQ"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_HPAxUAohEeWNdNIyeR54mg" name="LinkIdentifer" type="_PhJwUAilEeWgbbgaC4xhOQ"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_rc30MAotEeWkNoOTovCSlw" name="EvcEndPoint (EVC/UNI Attributes)">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_Q7M24AouEeWkNoOTovCSlw" name="uniEvcId" visibility="private">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_3ruhQAouEeWkNoOTovCSlw" name="dataSvcFrameCosId" visibility="private" type="_PhJwUAilEeWgbbgaC4xhOQ"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_Cb9JoAovEeWkNoOTovCSlw" name="l2cpSvcFrameCosId" visibility="private" type="_PhJwUAilEeWgbbgaC4xhOQ"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_-7FOcAovEeWkNoOTovCSlw" name="soamSvcFrameCosId" type="_PhJwUAilEeWgbbgaC4xhOQ"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_Gfm6YAoxEeWkNoOTovCSlw" name="svcFrameColorIdType" type="_LYz6cAowEeWkNoOTovCSlw">
+ <qualifier xmi:type="uml:Property" xmi:id="_dI-T8AoxEeWkNoOTovCSlw" name="svcFrameColorIdType" type="_LYz6cAowEeWkNoOTovCSlw"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_KViqIAoxEeWkNoOTovCSlw" name="svcFrameColorId" type="_PhJwUAilEeWgbbgaC4xhOQ"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_XbrIAAozEeWkNoOTovCSlw" name="egressDataSvcFrameCosId" type="_PhJwUAilEeWgbbgaC4xhOQ"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_f0qzQAozEeWkNoOTovCSlw" name="egressL2cpSvcFrameCosId" type="_PhJwUAilEeWgbbgaC4xhOQ"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_mvOxoAozEeWkNoOTovCSlw" name="egressSoamSvcFrameCosId" type="_PhJwUAilEeWgbbgaC4xhOQ"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_q0xDoAozEeWkNoOTovCSlw" name="ingressBWProfilePerCos" type="_PhJwUAilEeWgbbgaC4xhOQ">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_f4dRoAo0EeWkNoOTovCSlw"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_f4d4sAo0EeWkNoOTovCSlw" value="*"/>
+ <qualifier xmi:type="uml:Property" xmi:id="_hCQyUAo0EeWkNoOTovCSlw" name="ingressBWProfilePerCos" type="_PhJwUAilEeWgbbgaC4xhOQ">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_hCQyUQo0EeWkNoOTovCSlw"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_hCQyUgo0EeWkNoOTovCSlw" value="*"/>
+ </qualifier>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_hYKw4Ao0EeWkNoOTovCSlw" name="egressBWProfilePerCos_1" type="_PhJwUAilEeWgbbgaC4xhOQ">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_hYKw4Qo0EeWkNoOTovCSlw"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_hYKw4go0EeWkNoOTovCSlw" value="*"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_op3c4Ao0EeWkNoOTovCSlw" name="limitSrcMacAddr">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_uGpOoAo0EeWkNoOTovCSlw" name="testMeg">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_uL1QoAo0EeWkNoOTovCSlw" name="subMegMip">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_AXwhMArHEeWkNoOTovCSlw" type="_6EwOQAimEeWgbbgaC4xhOQ" association="_AXxIQArHEeWkNoOTovCSlw">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_AXwhMQrHEeWkNoOTovCSlw" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_AXwhMgrHEeWkNoOTovCSlw" value="1"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_Os2pUCPzEeW21PC6xbr-bA" type="_E2MvgArUEeWkNoOTovCSlw" association="_Os2pUyPzEeW21PC6xbr-bA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Os2pUSPzEeW21PC6xbr-bA" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Os2pUiPzEeW21PC6xbr-bA" value="1"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Enumeration" xmi:id="_LYz6cAowEeWkNoOTovCSlw" name="FrameColorIdType">
+ <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_UEeDAAowEeWkNoOTovCSlw" name="NONE"/>
+ <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_WBMOYAowEeWkNoOTovCSlw" name="EVC"/>
+ <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_XB42YAowEeWkNoOTovCSlw" name="CE_VLAN_COS"/>
+ <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_Y_nHUAowEeWkNoOTovCSlw" name="CE_VLAN_TAG_DEI"/>
+ <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_f3wq4AowEeWkNoOTovCSlw" name="IP"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Enumeration" xmi:id="_BrDmQAoxEeWkNoOTovCSlw" name="Color">
+ <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_CyRF8AoxEeWkNoOTovCSlw" name="YELLOW"/>
+ <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_DhfjcAoxEeWkNoOTovCSlw" name="GREEN"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_edTTgAo6EeWkNoOTovCSlw" name="SvcMgr">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_9yx2sAo8EeWkNoOTovCSlw" association="_9yydwAo8EeWkNoOTovCSlw">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_9yx2sQo8EeWkNoOTovCSlw" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_9yx2sgo8EeWkNoOTovCSlw" value="1"/>
+ </ownedAttribute>
+ <nestedClassifier xmi:type="uml:Class" xmi:id="_1_9HQArDEeWkNoOTovCSlw" name="MEFSvc">
+ <nestedClassifier xmi:type="uml:Class" xmi:id="_6eiEYAifEeWgbbgaC4xhOQ" name="Evc (EVC Service Attributes)">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_6eiEYQifEeWgbbgaC4xhOQ" name="id" visibility="private" type="_PhJwUAilEeWgbbgaC4xhOQ"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_6eiEYgifEeWgbbgaC4xhOQ" name="evcType" visibility="private">
+ <type xmi:type="uml:Enumeration" href="../cl-mef-services/model.uml#_BfnRwAZAEeWQ3sI_qJW7pQ"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_6eiEYwifEeWgbbgaC4xhOQ" name="maxUnils" visibility="private">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_6eiEZwifEeWgbbgaC4xhOQ" name="unicastFrameDelivery" visibility="private">
+ <type xmi:type="uml:Enumeration" href="../cl-mef-services/model.uml#_9YqOAAZAEeWQ3sI_qJW7pQ"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_6eiEaAifEeWgbbgaC4xhOQ" name="multicastFrameDelivery" visibility="private">
+ <type xmi:type="uml:Enumeration" href="../cl-mef-services/model.uml#_9YqOAAZAEeWQ3sI_qJW7pQ"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_6eiEaQifEeWgbbgaC4xhOQ" name="broadcastFrameDelivery" visibility="private">
+ <type xmi:type="uml:Enumeration" href="../cl-mef-services/model.uml#_9YqOAAZAEeWQ3sI_qJW7pQ"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_6eiEagifEeWgbbgaC4xhOQ" name="ceVLanIdPreservation" visibility="private">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ <qualifier xmi:type="uml:Property" xmi:id="_6eiEawifEeWgbbgaC4xhOQ" name="ceVLanIdPreservation" visibility="private">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ </qualifier>
+ <qualifier xmi:type="uml:Property" xmi:id="_6eiEbAifEeWgbbgaC4xhOQ" name="CopyOf_ceVLanIdPreservation_1" visibility="private">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ <qualifier xmi:type="uml:Property" xmi:id="_6eiEbQifEeWgbbgaC4xhOQ" name="ceVLanIdPreservation" visibility="private">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ </qualifier>
+ </qualifier>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_6eiEbgifEeWgbbgaC4xhOQ" name="ceVlanCosPreservation" visibility="private">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ <qualifier xmi:type="uml:Property" xmi:id="_6eiEbwifEeWgbbgaC4xhOQ" name="ceVLanIdPreservation" visibility="private">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ </qualifier>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_6eiEcAifEeWgbbgaC4xhOQ" name="evcMaxSvcFrameSize" visibility="private">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer"/>
+ <qualifier xmi:type="uml:Property" xmi:id="_6eiEcQifEeWgbbgaC4xhOQ" name="ceVLanIdPreservation" visibility="private">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ </qualifier>
+ <qualifier xmi:type="uml:Property" xmi:id="_6eiEcgifEeWgbbgaC4xhOQ" name="ceVlanCosPreservation" visibility="private">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ <qualifier xmi:type="uml:Property" xmi:id="_6eiEcwifEeWgbbgaC4xhOQ" name="ceVLanIdPreservation" visibility="private">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ </qualifier>
+ </qualifier>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_NPfMgAihEeWgbbgaC4xhOQ" type="_sWE78AifEeWgbbgaC4xhOQ" association="_NPfMgwihEeWgbbgaC4xhOQ">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_NPfMgQihEeWgbbgaC4xhOQ" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_NPfMggihEeWgbbgaC4xhOQ" value="1"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_2KpOUCD-EeWFusc4sUZ9zQ" type="_scKW0CD-EeWFusc4sUZ9zQ" association="_2Kp1YCD-EeWFusc4sUZ9zQ">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_2KpOUSD-EeWFusc4sUZ9zQ" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_2KpOUiD-EeWFusc4sUZ9zQ" value="*"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_gUfk8CD_EeWFusc4sUZ9zQ" type="_6CdawArAEeWkNoOTovCSlw" association="_gUgMACD_EeWFusc4sUZ9zQ">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_gUfk8SD_EeWFusc4sUZ9zQ" value="2"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_gUfk8iD_EeWFusc4sUZ9zQ" value="*"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_NXXdECPzEeW21PC6xbr-bA" type="_E2MvgArUEeWkNoOTovCSlw" association="_NXYrMCPzEeW21PC6xbr-bA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_NXXdESPzEeW21PC6xbr-bA" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_NXXdEiPzEeW21PC6xbr-bA" value="1"/>
+ </ownedAttribute>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_jMIC8AihEeWgbbgaC4xhOQ" name="gettersForAllAttributes"/>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_k4EAUAihEeWgbbgaC4xhOQ" name="settersForAllAttributes"/>
+ </nestedClassifier>
+ </nestedClassifier>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_g0hCgAo6EeWkNoOTovCSlw" name="EvcMgr">
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_gv3ZwAo_EeWkNoOTovCSlw" name="create"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_iYvOUAo6EeWkNoOTovCSlw" name="UniMgr">
+ <nestedClassifier xmi:type="uml:Class" xmi:id="_6EwOQAimEeWgbbgaC4xhOQ" name="Uni (per UNI Attributes)">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="__rQ44AioEeWgbbgaC4xhOQ" name="id" visibility="private" type="_PhJwUAilEeWgbbgaC4xhOQ"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_nrUw0AoPEeWNdNIyeR54mg" name="numLinks" visibility="private">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_sQ_UYAoPEeWNdNIyeR54mg" name="linkPhysLayers" visibility="private" type="_7r0AwAioEeWgbbgaC4xhOQ">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yicEUAoPEeWNdNIyeR54mg" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yicrYAoPEeWNdNIyeR54mg" value="*"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_0pOxsAoPEeWNdNIyeR54mg" name="linkSynchModes" visibility="private">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_7x6roAoPEeWNdNIyeR54mg" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_7x7SsAoPEeWNdNIyeR54mg" value="*"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_R7mfkAoQEeWNdNIyeR54mg" name="resiliency" visibility="private" type="_EZ-toAoQEeWNdNIyeR54mg"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_-aXfIAoQEeWNdNIyeR54mg" name="serviceFrameFormat" visibility="private" type="_BJD6AAoREeWNdNIyeR54mg"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_KTXGYAoREeWNdNIyeR54mg" name="maxServiceFrameSize" visibility="private">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_SdTpAAoREeWNdNIyeR54mg" name="serviceMultiplexing" visibility="private">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_ffuWcAoREeWNdNIyeR54mg" name="ceVlanId" visibility="private">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_bqfU0AoSEeWNdNIyeR54mg" name="ceVlandPerEvcMap" visibility="private" type="_NmywkAoSEeWNdNIyeR54mg">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_iNGtQAoSEeWNdNIyeR54mg"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_iNGtQQoSEeWNdNIyeR54mg" value="*"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_lclhAAoSEeWNdNIyeR54mg" name="maxEvcs" visibility="private">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_sCoA4AoSEeWNdNIyeR54mg" name="bundling" visibility="private">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_wKM6QAoSEeWNdNIyeR54mg" name="allToOneBundling" visibility="private">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_ITtQ4AoTEeWNdNIyeR54mg" name="tokenShare" visibility="private">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_iguXYAoTEeWNdNIyeR54mg" name="envelopes" visibility="private" type="_PFK9oAoTEeWNdNIyeR54mg">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_oBxlIAoTEeWNdNIyeR54mg"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_oByMMAoTEeWNdNIyeR54mg" value="*"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_9ZcGQAoTEeWNdNIyeR54mg" name="ingressBWProfilePerUni" visibility="private" type="_0_y6wAoTEeWNdNIyeR54mg">
+ <qualifier xmi:type="uml:Property" xmi:id="_CM2K4AoUEeWNdNIyeR54mg" name="ingressBWProfilePerUni" visibility="private" type="_0_y6wAoTEeWNdNIyeR54mg"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_CqZCgAoUEeWNdNIyeR54mg" name="egressBWProfilePerUni" visibility="private" type="_0_y6wAoTEeWNdNIyeR54mg"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_Mr48oAoUEeWNdNIyeR54mg" name="linkOAM" visibility="private">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_SDeFUAoUEeWNdNIyeR54mg" name="uniMEG" visibility="private">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_rbpOgAoUEeWNdNIyeR54mg" name="eLMI" visibility="private">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_WyBBoAogEeWNdNIyeR54mg" name="l2cpAddrSet" visibility="private" type="_LO2gcAogEeWNdNIyeR54mg"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_LCN9MAohEeWNdNIyeR54mg" name="l2cp3Peering" type="_ybOZUAogEeWNdNIyeR54mg"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_cg_HkCPzEeW21PC6xbr-bA" type="_E2MvgArUEeWkNoOTovCSlw" association="_cg_uoCPzEeW21PC6xbr-bA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_cg_HkSPzEeW21PC6xbr-bA" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_cg_HkiPzEeW21PC6xbr-bA" value="1"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_ZVUjMCP7EeWgfeI19M_f4A" type="_rc30MAotEeWkNoOTovCSlw" association="_ZVY0oCP7EeWgfeI19M_f4A">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_ZVUjMSP7EeWgfeI19M_f4A"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_ZVUjMiP7EeWgfeI19M_f4A" value="*"/>
+ </ownedAttribute>
+ </nestedClassifier>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_j0FK8Ao6EeWkNoOTovCSlw" name="SEvcMgr"/>
+ <packagedElement xmi:type="uml:Association" xmi:id="_9yydwAo8EeWkNoOTovCSlw" memberEnd="_9yydwQo8EeWkNoOTovCSlw _9yx2sAo8EeWkNoOTovCSlw">
+ <name xsi:nil="true"/>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_9yydwQo8EeWkNoOTovCSlw" type="_edTTgAo6EeWkNoOTovCSlw" association="_9yydwAo8EeWkNoOTovCSlw">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_9yydwgo8EeWkNoOTovCSlw" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_9yydwwo8EeWkNoOTovCSlw" value="1"/>
+ </ownedEnd>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Interaction" xmi:id="_IvDhkAo-EeWkNoOTovCSlw" name="Interaction2">
+ <lifeline xmi:type="uml:Lifeline" xmi:id="_NFGUwAo-EeWkNoOTovCSlw" name="Lifeline" represents="_3qCE4Ao-EeWkNoOTovCSlw"/>
+ <lifeline xmi:type="uml:Lifeline" xmi:id="_QVsGUAo_EeWkNoOTovCSlw" name="Lifeline0" represents="_7fsu4Ao-EeWkNoOTovCSlw" coveredBy="_9hG-QApEEeWkNoOTovCSlw _9hHlUQpEEeWkNoOTovCSlw _9hHlUApEEeWkNoOTovCSlw"/>
+ <fragment xmi:type="uml:ExecutionOccurrenceSpecification" xmi:id="_9hG-QApEEeWkNoOTovCSlw" name="ActionExecSpecStart" covered="_QVsGUAo_EeWkNoOTovCSlw" execution="_9hHlUApEEeWkNoOTovCSlw"/>
+ <fragment xmi:type="uml:ActionExecutionSpecification" xmi:id="_9hHlUApEEeWkNoOTovCSlw" name="ActionExecSpec" covered="_QVsGUAo_EeWkNoOTovCSlw" finish="_9hHlUQpEEeWkNoOTovCSlw" start="_9hG-QApEEeWkNoOTovCSlw"/>
+ <fragment xmi:type="uml:ExecutionOccurrenceSpecification" xmi:id="_9hHlUQpEEeWkNoOTovCSlw" name="ActionExecSpecFinish" covered="_QVsGUAo_EeWkNoOTovCSlw" execution="_9hHlUApEEeWkNoOTovCSlw"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_glo8MAo-EeWkNoOTovCSlw" name="System">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_jejqEAo-EeWkNoOTovCSlw" name="CosMgr" type="_sVP98Ao-EeWkNoOTovCSlw"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_3qCE4Ao-EeWkNoOTovCSlw" name="SvcMgr" type="_edTTgAo6EeWkNoOTovCSlw"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_7fsu4Ao-EeWkNoOTovCSlw" name="EvcMgr" type="_g0hCgAo6EeWkNoOTovCSlw"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_-z2nQAo-EeWkNoOTovCSlw" name="UniMgr" type="_iYvOUAo6EeWkNoOTovCSlw"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_DQVZoAo_EeWkNoOTovCSlw" name="ConnectionMgr" type="_j0FK8Ao6EeWkNoOTovCSlw"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_sVP98Ao-EeWkNoOTovCSlw" name="CoSMgr">
+ <nestedClassifier xmi:type="uml:Class" xmi:id="_E2MvgArUEeWkNoOTovCSlw" name="CoS">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_VC0vIArUEeWkNoOTovCSlw" name="availability">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Real"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_VbbcYArUEeWkNoOTovCSlw" name="frameDelay">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_Vu-DcArUEeWkNoOTovCSlw" name="jitter">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Real"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_WGCfoArUEeWkNoOTovCSlw" name="frameLoss">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Real"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_ixSDMArUEeWkNoOTovCSlw" type="_8JT2EAidEeWgbbgaC4xhOQ" association="_ixUfcArUEeWkNoOTovCSlw">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_ixSDMQrUEeWkNoOTovCSlw" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_ixSDMgrUEeWkNoOTovCSlw" value="1"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_ldejsArUEeWkNoOTovCSlw" type="_8JT2EAidEeWgbbgaC4xhOQ" association="_ldfKwArUEeWkNoOTovCSlw">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_ldejsQrUEeWkNoOTovCSlw" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_ldejsgrUEeWkNoOTovCSlw" value="1"/>
+ </ownedAttribute>
+ </nestedClassifier>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Signal" xmi:id="_54hG8ApEEeWkNoOTovCSlw" name="create"/>
+ <packagedElement xmi:type="uml:Class" xmi:id="_EP4RAArBEeWkNoOTovCSlw" name="OvcEndPoint"/>
+ <packagedElement xmi:type="uml:Class" xmi:id="_OArcsArBEeWkNoOTovCSlw" name="OvcUniEndEP (OVC Per UNI Service Attributes)">
+ <generalization xmi:type="uml:Generalization" xmi:id="_lVpYAArBEeWkNoOTovCSlw" general="_EP4RAArBEeWkNoOTovCSlw"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_m6WE8ArBEeWkNoOTovCSlw" type="_6EwOQAimEeWgbbgaC4xhOQ" association="_m6WE8wrBEeWkNoOTovCSlw">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_m6WE8QrBEeWkNoOTovCSlw" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_m6WE8grBEeWkNoOTovCSlw" value="1"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_U3fjgArBEeWkNoOTovCSlw" name="OvcEnniEndEP (OVC EP Per ENNI Attributes)">
+ <generalization xmi:type="uml:Generalization" xmi:id="_U3fjgQrBEeWkNoOTovCSlw" general="_EP4RAArBEeWkNoOTovCSlw"/>
+ <generalization xmi:type="uml:Generalization" xmi:id="_j6V3oArBEeWkNoOTovCSlw" general="_EP4RAArBEeWkNoOTovCSlw"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_xU-QwArBEeWkNoOTovCSlw" type="_qjadYArBEeWkNoOTovCSlw" association="_xU-QwwrBEeWkNoOTovCSlw">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_xU-QwQrBEeWkNoOTovCSlw" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_xU-QwgrBEeWkNoOTovCSlw" value="1"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_m6WE8wrBEeWkNoOTovCSlw" memberEnd="_m6WE9ArBEeWkNoOTovCSlw _m6WE8ArBEeWkNoOTovCSlw">
+ <name xsi:nil="true"/>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_m6WE9ArBEeWkNoOTovCSlw" type="_OArcsArBEeWkNoOTovCSlw" association="_m6WE8wrBEeWkNoOTovCSlw">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_m6WE9QrBEeWkNoOTovCSlw" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_m6WE9grBEeWkNoOTovCSlw" value="1"/>
+ </ownedEnd>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_xU-QwwrBEeWkNoOTovCSlw" memberEnd="_xU-QxArBEeWkNoOTovCSlw _xU-QwArBEeWkNoOTovCSlw">
+ <name xsi:nil="true"/>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_xU-QxArBEeWkNoOTovCSlw" type="_U3fjgArBEeWkNoOTovCSlw" association="_xU-QwwrBEeWkNoOTovCSlw">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_xU-QxQrBEeWkNoOTovCSlw" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_xU-QxgrBEeWkNoOTovCSlw" value="1"/>
+ </ownedEnd>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_AXxIQArHEeWkNoOTovCSlw" memberEnd="_AXxIQQrHEeWkNoOTovCSlw _AXwhMArHEeWkNoOTovCSlw">
+ <name xsi:nil="true"/>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_AXxIQQrHEeWkNoOTovCSlw" type="_rc30MAotEeWkNoOTovCSlw" association="_AXxIQArHEeWkNoOTovCSlw">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_AXxIQgrHEeWkNoOTovCSlw"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_AXxIQwrHEeWkNoOTovCSlw" value="*"/>
+ </ownedEnd>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_Q3wd4ArJEeWkNoOTovCSlw" name="OvcMgr">
+ <nestedClassifier xmi:type="uml:Class" xmi:id="_6CdawArAEeWkNoOTovCSlw" name="Ovc (OVC Service Attributes)">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_VaLaMCEEEeWFusc4sUZ9zQ" type="_wZ4UICD_EeWFusc4sUZ9zQ" association="_VaMBQCEEEeWFusc4sUZ9zQ">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_VaLaMSEEEeWFusc4sUZ9zQ" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_VaLaMiEEEeWFusc4sUZ9zQ" value="*"/>
+ </ownedAttribute>
+ </nestedClassifier>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_8d0T0ArJEeWkNoOTovCSlw" name="EnniMgr">
+ <nestedClassifier xmi:type="uml:Class" xmi:id="_qjadYArBEeWkNoOTovCSlw" name="evc Enni (ENNI Service Atributes)"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_ixUfcArUEeWkNoOTovCSlw" memberEnd="_ixUfcQrUEeWkNoOTovCSlw _ixSDMArUEeWkNoOTovCSlw">
+ <name xsi:nil="true"/>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_ixUfcQrUEeWkNoOTovCSlw" name="ingress" type="_E2MvgArUEeWkNoOTovCSlw" association="_ixUfcArUEeWkNoOTovCSlw">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_ixUfcgrUEeWkNoOTovCSlw" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_ixUfcwrUEeWkNoOTovCSlw" value="1"/>
+ </ownedEnd>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_ldfKwArUEeWkNoOTovCSlw" memberEnd="_ldfKwQrUEeWkNoOTovCSlw _ldejsArUEeWkNoOTovCSlw">
+ <name xsi:nil="true"/>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_ldfKwQrUEeWkNoOTovCSlw" name="egress" type="_E2MvgArUEeWkNoOTovCSlw" association="_ldfKwArUEeWkNoOTovCSlw">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_ldfKwgrUEeWkNoOTovCSlw" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_ldfKwwrUEeWkNoOTovCSlw" value="1"/>
+ </ownedEnd>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_scKW0CD-EeWFusc4sUZ9zQ" name="EvcPath">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_8xtB4CD-EeWFusc4sUZ9zQ" type="_rc30MAotEeWkNoOTovCSlw" association="_8xto8CD-EeWFusc4sUZ9zQ">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_8xtB4SD-EeWFusc4sUZ9zQ" value="2"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_8xtB4iD-EeWFusc4sUZ9zQ" value="2"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_eePbsCEEEeWFusc4sUZ9zQ" type="_wZ4UICD_EeWFusc4sUZ9zQ" association="_eeQCwCEEEeWFusc4sUZ9zQ">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_eePbsSEEEeWFusc4sUZ9zQ"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_eePbsiEEEeWFusc4sUZ9zQ" value="*"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_bT290C-_EeWtJpOtnfchGg" type="_OnjDQC-_EeWtJpOtnfchGg" association="_bT3k4C-_EeWtJpOtnfchGg">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_bT290S-_EeWtJpOtnfchGg"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_bT290i-_EeWtJpOtnfchGg" value="*"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_2Kp1YCD-EeWFusc4sUZ9zQ" memberEnd="_2Kp1YSD-EeWFusc4sUZ9zQ _2KpOUCD-EeWFusc4sUZ9zQ">
+ <name xsi:nil="true"/>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_2Kp1YSD-EeWFusc4sUZ9zQ" type="_6eiEYAifEeWgbbgaC4xhOQ" association="_2Kp1YCD-EeWFusc4sUZ9zQ">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_2Kp1YiD-EeWFusc4sUZ9zQ" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_2Kp1YyD-EeWFusc4sUZ9zQ" value="1"/>
+ </ownedEnd>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_8xto8CD-EeWFusc4sUZ9zQ" memberEnd="_8xto8SD-EeWFusc4sUZ9zQ _8xtB4CD-EeWFusc4sUZ9zQ">
+ <name xsi:nil="true"/>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_8xto8SD-EeWFusc4sUZ9zQ" type="_scKW0CD-EeWFusc4sUZ9zQ" association="_8xto8CD-EeWFusc4sUZ9zQ">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_8xto8iD-EeWFusc4sUZ9zQ" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_8xto8yD-EeWFusc4sUZ9zQ" value="1"/>
+ </ownedEnd>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_gUgMACD_EeWFusc4sUZ9zQ" memberEnd="_gUgMASD_EeWFusc4sUZ9zQ _gUfk8CD_EeWFusc4sUZ9zQ">
+ <name xsi:nil="true"/>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_gUgMASD_EeWFusc4sUZ9zQ" type="_6eiEYAifEeWgbbgaC4xhOQ" association="_gUgMACD_EeWFusc4sUZ9zQ">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_gUgMAiD_EeWFusc4sUZ9zQ" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_gUgMAyD_EeWFusc4sUZ9zQ" value="1"/>
+ </ownedEnd>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_wZ4UICD_EeWFusc4sUZ9zQ" name="OvcPath">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_FF424CEFEeWFusc4sUZ9zQ" type="_EP4RAArBEeWkNoOTovCSlw" association="_FF6FACEFEeWFusc4sUZ9zQ">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_FF424SEFEeWFusc4sUZ9zQ" value="2"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_FF424iEFEeWFusc4sUZ9zQ" value="2"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_gV6icC-_EeWtJpOtnfchGg" type="_OnjDQC-_EeWtJpOtnfchGg" association="_gV7wkC-_EeWtJpOtnfchGg">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_gV6icS-_EeWtJpOtnfchGg"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_gV6ici-_EeWtJpOtnfchGg" value="*"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_VaMBQCEEEeWFusc4sUZ9zQ" memberEnd="_VaMBQSEEEeWFusc4sUZ9zQ _VaLaMCEEEeWFusc4sUZ9zQ">
+ <name xsi:nil="true"/>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_VaMBQSEEEeWFusc4sUZ9zQ" type="_6CdawArAEeWkNoOTovCSlw" association="_VaMBQCEEEeWFusc4sUZ9zQ">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_VaMBQiEEEeWFusc4sUZ9zQ" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_VaMBQyEEEeWFusc4sUZ9zQ" value="1"/>
+ </ownedEnd>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_eeQCwCEEEeWFusc4sUZ9zQ" memberEnd="_eeQCwSEEEeWFusc4sUZ9zQ _eePbsCEEEeWFusc4sUZ9zQ">
+ <name xsi:nil="true"/>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_eeQCwSEEEeWFusc4sUZ9zQ" type="_scKW0CD-EeWFusc4sUZ9zQ" association="_eeQCwCEEEeWFusc4sUZ9zQ">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_eeQCwiEEEeWFusc4sUZ9zQ" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_eeQCwyEEEeWFusc4sUZ9zQ" value="1"/>
+ </ownedEnd>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_FF6FACEFEeWFusc4sUZ9zQ" memberEnd="_FF6FASEFEeWFusc4sUZ9zQ _FF424CEFEeWFusc4sUZ9zQ">
+ <name xsi:nil="true"/>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_FF6FASEFEeWFusc4sUZ9zQ" type="_wZ4UICD_EeWFusc4sUZ9zQ" association="_FF6FACEFEeWFusc4sUZ9zQ">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_FF6FAiEFEeWFusc4sUZ9zQ" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_FF6FAyEFEeWFusc4sUZ9zQ" value="1"/>
+ </ownedEnd>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_ayCkYCPxEeW21PC6xbr-bA" name="ELine">
+ <generalization xmi:type="uml:Generalization" xmi:id="_mG6x8CPxEeW21PC6xbr-bA" general="_1_9HQArDEeWkNoOTovCSlw"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_cgJE8CPxEeW21PC6xbr-bA" name="ELAN">
+ <generalization xmi:type="uml:Generalization" xmi:id="_ooldcCPxEeW21PC6xbr-bA" general="_1_9HQArDEeWkNoOTovCSlw"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_f_KwkCPxEeW21PC6xbr-bA" name="ETree">
+ <generalization xmi:type="uml:Generalization" xmi:id="_qWtMICPxEeW21PC6xbr-bA" general="_1_9HQArDEeWkNoOTovCSlw"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_NXYrMCPzEeW21PC6xbr-bA" memberEnd="_NXYrMSPzEeW21PC6xbr-bA _NXXdECPzEeW21PC6xbr-bA">
+ <name xsi:nil="true"/>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_NXYrMSPzEeW21PC6xbr-bA" type="_6eiEYAifEeWgbbgaC4xhOQ" association="_NXYrMCPzEeW21PC6xbr-bA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_NXYrMiPzEeW21PC6xbr-bA" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_NXYrMyPzEeW21PC6xbr-bA" value="1"/>
+ </ownedEnd>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_Os2pUyPzEeW21PC6xbr-bA" memberEnd="_Os2pVCPzEeW21PC6xbr-bA _Os2pUCPzEeW21PC6xbr-bA">
+ <name xsi:nil="true"/>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_Os2pVCPzEeW21PC6xbr-bA" type="_rc30MAotEeWkNoOTovCSlw" association="_Os2pUyPzEeW21PC6xbr-bA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Os2pVSPzEeW21PC6xbr-bA" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Os2pViPzEeW21PC6xbr-bA" value="1"/>
+ </ownedEnd>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_cg_uoCPzEeW21PC6xbr-bA" memberEnd="_cg_uoSPzEeW21PC6xbr-bA _cg_HkCPzEeW21PC6xbr-bA">
+ <name xsi:nil="true"/>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_cg_uoSPzEeW21PC6xbr-bA" type="_6EwOQAimEeWgbbgaC4xhOQ" association="_cg_uoCPzEeW21PC6xbr-bA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_cg_uoiPzEeW21PC6xbr-bA" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_cg_uoyPzEeW21PC6xbr-bA" value="1"/>
+ </ownedEnd>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_ZVY0oCP7EeWgfeI19M_f4A" visibility="protected" memberEnd="_ZVY0oSP7EeWgfeI19M_f4A _ZVUjMCP7EeWgfeI19M_f4A">
+ <name xsi:nil="true"/>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_ZVY0oSP7EeWgfeI19M_f4A" type="_6EwOQAimEeWgbbgaC4xhOQ" association="_ZVY0oCP7EeWgfeI19M_f4A">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_ZVY0oiP7EeWgfeI19M_f4A" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_ZVY0oyP7EeWgfeI19M_f4A" value="1"/>
+ </ownedEnd>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_OnjDQC-_EeWtJpOtnfchGg" name="NWElement"/>
+ <packagedElement xmi:type="uml:Association" xmi:id="_bT3k4C-_EeWtJpOtnfchGg" memberEnd="_bT3k4S-_EeWtJpOtnfchGg _bT290C-_EeWtJpOtnfchGg">
+ <name xsi:nil="true"/>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_bT3k4S-_EeWtJpOtnfchGg" type="_scKW0CD-EeWFusc4sUZ9zQ" association="_bT3k4C-_EeWtJpOtnfchGg">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_bT3k4i-_EeWtJpOtnfchGg" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_bT3k4y-_EeWtJpOtnfchGg" value="1"/>
+ </ownedEnd>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_gV7wkC-_EeWtJpOtnfchGg" memberEnd="_gV7wkS-_EeWtJpOtnfchGg _gV6icC-_EeWtJpOtnfchGg">
+ <name xsi:nil="true"/>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_gV7wkS-_EeWtJpOtnfchGg" type="_wZ4UICD_EeWFusc4sUZ9zQ" association="_gV7wkC-_EeWtJpOtnfchGg">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_gV7wki-_EeWtJpOtnfchGg" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_gV7wky-_EeWtJpOtnfchGg" value="1"/>
+ </ownedEnd>
+ </packagedElement>
+ <profileApplication xmi:type="uml:ProfileApplication" xmi:id="_a15EkAoREeWNdNIyeR54mg">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_a2I8MAoREeWNdNIyeR54mg" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <references xmi:type="ecore:EPackage" href="pathmap://PAPYRUS_ACTIONLANGUAGE_PROFILE/ActionLanguage-Profile.profile.uml#_sYse0YZLEeKyw49uR6nx3g"/>
+ </eAnnotations>
+ <appliedProfile xmi:type="uml:Profile" href="pathmap://PAPYRUS_ACTIONLANGUAGE_PROFILE/ActionLanguage-Profile.profile.uml#ActionLanguage"/>
+ </profileApplication>
+</uml:Model>
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..c916a54
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,94 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>com.cablelabs.vcpe</groupId>
+ <artifactId>vcpe-services</artifactId>
+ <packaging>pom</packaging>
+ <version>1.0-SNAPSHOT</version>
+
+ <modules>
+ <module>common</module>
+ <module>cos</module>
+ <module>uni</module>
+ <module>evc</module>
+ <module>svc</module>
+ </modules>
+
+ <!-- plugins common to all modules in this project -->
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>2.5.1</version>
+ <inherited>true</inherited>
+ <configuration>
+ <source>1.7</source>
+ <target>1.7</target>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <version>2.18.1</version>
+ <configuration>
+ <parallel>methods</parallel>
+ <threadCount>10</threadCount>
+ <excludes>
+ <exclude>**/*IntegrationTest*</exclude>
+ </excludes>
+ <skipTests>true</skipTests>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+ <!-- Dependencies common to all modules in this project -->
+
+ <dependencyManagement>
+ <dependencies>
+ <dependency>
+ <groupId>org.glassfish.jersey</groupId>
+ <artifactId>jersey-bom</artifactId>
+ <version>${jersey.version}</version>
+ <type>pom</type>
+ <scope>import</scope>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+
+
+ <dependencies>
+ <dependency>
+ <groupId>com.cablelabs.vcpe</groupId>
+ <artifactId>common</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.glassfish.jersey.containers</groupId>
+ <artifactId>jersey-container-servlet-core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.glassfish.jersey.media</groupId>
+ <artifactId>jersey-media-moxy</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.12</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+ <!-- Properties common to all modules in this project -->
+
+ <properties>
+ <jersey.version>2.2</jersey.version>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ </properties>
+
+
+</project>
diff --git a/svc/pom.xml b/svc/pom.xml
new file mode 100644
index 0000000..6e8f4de
--- /dev/null
+++ b/svc/pom.xml
@@ -0,0 +1,30 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <parent>
+ <groupId>com.cablelabs.vcpe</groupId>
+ <artifactId>vcpe-services</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ </parent>
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>com.cablelabs.vcpe</groupId>
+ <artifactId>svc</artifactId>
+ <packaging>pom</packaging>
+ <version>1.0-SNAPSHOT</version>
+
+ <modules>
+ <module>svcbase</module>
+ <module>svcmgr</module>
+ </modules>
+
+ <dependencies>
+ <dependency>
+ <groupId>com.cablelabs.vcpe</groupId>
+ <artifactId>cosbase</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ </dependency>
+ </dependencies>
+
+</project>
diff --git a/svc/svcbase/pom.xml b/svc/svcbase/pom.xml
new file mode 100644
index 0000000..40982d6
--- /dev/null
+++ b/svc/svcbase/pom.xml
@@ -0,0 +1,29 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <parent>
+ <groupId>com.cablelabs.vcpe</groupId>
+ <artifactId>svc</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ </parent>
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>com.cablelabs.vcpe</groupId>
+ <artifactId>svcbase</artifactId>
+ <packaging>jar</packaging>
+ <version>1.0-SNAPSHOT</version>
+
+ <build>
+ <finalName>svcbase</finalName>
+ </build>
+
+ <dependencies>
+ <dependency>
+ <groupId>com.cablelabs.vcpe</groupId>
+ <artifactId>evcbase</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ </dependency>
+ </dependencies>
+
+</project>
diff --git a/svc/svcbase/src/main/java/com/cablelabs/vcpe/svc/svcbase/client/EplClient.java b/svc/svcbase/src/main/java/com/cablelabs/vcpe/svc/svcbase/client/EplClient.java
new file mode 100644
index 0000000..9bc7368
--- /dev/null
+++ b/svc/svcbase/src/main/java/com/cablelabs/vcpe/svc/svcbase/client/EplClient.java
@@ -0,0 +1,149 @@
+package com.cablelabs.vcpe.svc.svcbase.client;
+
+import com.cablelabs.vcpe.svc.svcbase.model.Epl;
+
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.util.List;
+
+/**
+ * Created by steve on 6/8/15.
+ */
+public class EplClient {
+
+ private Client client; // provided by Jersey
+
+ public EplClient() {
+ client = ClientBuilder.newClient();
+ }
+
+ //--------------------------------------------------------
+ public Epl create(Epl epl)
+ //--------------------------------------------------------
+ {
+ WebTarget target =client.target("http://localhost:9090/svcmgr/webapi/svc/");
+ Response response = target.path("epl")
+ .request(MediaType.APPLICATION_JSON)
+ .post(Entity.entity(epl, MediaType.APPLICATION_JSON));
+
+ if (response.getStatus() != 200 ) // figure out how to use Status.OK
+ {
+ // in production you can be more specific based on reponse code, id, etc
+ throw new RuntimeException(response.getStatus() + ": there was an error on the server.");
+ }
+ return response.readEntity(Epl.class);
+ }
+
+ //--------------------------------------------------------
+ public Epl update(Epl epl)
+ //--------------------------------------------------------
+ {
+ WebTarget target =client.target("http://localhost:9090/svcmgr/webapi/svc/");
+ Response response = target.path("epl/"+ epl.getId())
+ .request(MediaType.APPLICATION_JSON)
+ .put(Entity.entity(epl, MediaType.APPLICATION_JSON));
+
+ if (response.getStatus() != 200 ) // figure out how to use Status.OK
+ {
+ // in production you can be more specific based on reponse code, id, etc
+ throw new RuntimeException(response.getStatus() + ": there was an error on the server.");
+ }
+ return response.readEntity(Epl.class);
+ }
+
+ //--------------------------------------------------------
+ public Epl get(String eplId)
+ //--------------------------------------------------------
+ // get Epl of specified ID
+
+ {
+ WebTarget target = client.target("http://localhost:9090/svcmgr/webapi/svc");
+
+ Response response = target.path("epl/"+eplId).request(MediaType.APPLICATION_JSON).get(Response.class);
+ if (response.getStatus() != 200) // figure out how to use Status.OK
+ {
+ // in production you can be more specific based on reponse code, id, etc
+ throw new RuntimeException(response.getStatus() + ": there was an error on the server.");
+ }
+
+ //return response;
+ return response.readEntity(Epl.class);
+ }
+
+ //--------------------------------------------------------
+ public List<Epl> getAll()
+ //--------------------------------------------------------
+ // get a list of all Epl instances
+ {
+
+ WebTarget target = client.target("http://localhost:9090/svcmgr/webapi/svc/");
+
+ // Can I do this with a Response, so that I can check for errors
+ List<Epl> response = target.path("epl/list")
+ .request(MediaType.APPLICATION_JSON)
+ .get(new GenericType<List<Epl>>() {
+ });
+ if (response == null) // figure out how to use Status.OK
+ {
+ // in production you can be more specific based on reponse code, id, etc
+ throw new RuntimeException("there was an error on the server.");
+ }
+ return response;
+ }
+
+ //--------------------------------------------------------
+ public void delete(String eplId)
+ //--------------------------------------------------------
+ // delete Epl of specified ID
+ {
+ WebTarget target = client.target("http://localhost:9090/svcmgr/webapi/svc/");
+ Response response = target.path("epl/"+eplId).request(MediaType.APPLICATION_JSON).delete();
+ if (response.getStatus() != 200) // figure out how to use Status.OK
+ {
+ // in production you can be more specific based on reponse code, id, etc
+ throw new RuntimeException(response.getStatus() + ": there was an error on the server.");
+ }
+ }
+
+ //--------------------------------------------------------
+ public Epl testGet()
+ //--------------------------------------------------------
+ // test marshaling of Epl class from server json
+
+ {
+ WebTarget target = client.target("http://localhost:9090/svcmgr/webapi/svc/");
+
+ Response response = target.path("epl").request(MediaType.APPLICATION_JSON).get(Response.class);
+ if (response.getStatus() != 200) // figure out how to use Status.OK
+ {
+ // in production you can be more specific based on reponse code, id, etc
+ throw new RuntimeException(response.getStatus() + ": there was an error on the server.");
+ }
+
+ //return response;
+ return response.readEntity(Epl.class);
+ }
+
+ //--------------------------------------------------------
+ public String ping()
+ //--------------------------------------------------------
+ // test connectivity
+ {
+
+ WebTarget target = client.target("http://localhost:9090/svcmgr/webapi/svc/");
+
+ Response response = target.path("epl").request(MediaType.TEXT_PLAIN).get();
+ if (response.getStatus() != 200) // figure out how to use Status.OK
+ {
+ // in production you can be more specific based on reponse code, id, etc
+ throw new RuntimeException(response.getStatus() + ": there was an error on the server.");
+ }
+
+ return response.readEntity(String.class);
+ }
+}
diff --git a/svc/svcbase/src/main/java/com/cablelabs/vcpe/svc/svcbase/model/Epl.java b/svc/svcbase/src/main/java/com/cablelabs/vcpe/svc/svcbase/model/Epl.java
new file mode 100644
index 0000000..254fb11
--- /dev/null
+++ b/svc/svcbase/src/main/java/com/cablelabs/vcpe/svc/svcbase/model/Epl.java
@@ -0,0 +1,104 @@
+package com.cablelabs.vcpe.svc.svcbase.model;
+
+import com.cablelabs.vcpe.common.Dbg;
+import com.cablelabs.vcpe.evc.evcbase.model.Evc;
+import com.cablelabs.vcpe.evc.evcbase.client.EvcClient;
+
+import javax.xml.bind.annotation.XmlRootElement;
+import java.util.List;
+
+/**
+ * Created by steve on 5/24/15.
+ */
+
+@XmlRootElement
+public class Epl
+{
+ private String id;
+ private long numCustLocations;
+ private List<String> custAddressList = null;
+ private List<String> uniHostMacList = null;
+ private List<String> uniHostIpList = null;
+ private String cos;
+ private String evcId;
+
+ // zero argument constructor required for JAX-RS
+ public Epl() {
+ id = "unset";
+ this.numCustLocations = -1;
+ this.custAddressList = null;
+ this.uniHostMacList = null;
+ this.uniHostIpList = null;
+ this.cos = "unset";
+ this.evcId = "unset";
+ }
+
+ public void setAllProps (String id, long numCustLocations,
+ List<String> custAddressList,
+ List<String> uniHostMacList, List<String> uniHostIpList, String cos, String evcId) {
+ this.id = id;
+ this.numCustLocations = numCustLocations;
+ this.custAddressList = custAddressList;
+ this.uniHostMacList = uniHostMacList;
+ this.uniHostIpList = uniHostIpList;
+ this.cos = cos;
+ this.evcId = evcId;
+ }
+
+ public void dump() { dump(0); }
+ public void dump(int tab) {
+
+ Dbg.p(tab, "id: " + this.id);
+ Dbg.p(tab, "numCustLocations: " + this.numCustLocations);
+ Dbg.p(tab, "Address List:");
+ for (String addr : custAddressList)
+ Dbg.p(tab+1, addr);
+ Dbg.p(tab, "UNI Mac List:");
+ for (String mac : uniHostMacList)
+ Dbg.p(tab+1, mac);
+ Dbg.p(tab, "UNI IP List:");
+ for (String ip : uniHostIpList)
+ Dbg.p(tab+1, ip);
+ Dbg.p(tab, "cos: " + this.cos);
+ Dbg.p(tab, "Evc:" + this.evcId);
+// if ( this.evcId != "unset") { // hacky
+// EvcClient evcClient = new EvcClient();
+// Evc evc = evcClient.get(this.evcId);
+// evc.dump(tab + 2);
+// }
+ }
+
+ public static void dumpList(List<Epl> eplList) { dumpList(0, eplList); }
+ public static void dumpList(int tab, List<Epl> eplList) {
+ int numSvc = 0;
+ Dbg.p("----- Epl List : [" + eplList.size() + "] elements");
+ for (Epl curEpl : eplList) {
+ numSvc++;
+ Dbg.p(tab+1, "<Entry " + numSvc+">");
+ curEpl.dump(tab+2);
+ }
+ }
+
+ // Getters & Setters
+ public String getId() { return id; }
+ public void setId(String id) { this.id = id; }
+
+ public long getNumCustLocations() { return numCustLocations; }
+ public void setNumCustLocations(long numCustLocations) { this.numCustLocations = numCustLocations; }
+
+ public List<String> getCustAddressList() { return custAddressList; }
+ public void setCustAddressList(List<String> custAddressList) { this.custAddressList = custAddressList; }
+
+ public List<String> getUniHostMacList() { return uniHostMacList; }
+ public void setUniHostMacList(List<String> uniHostMacList) { this.uniHostMacList = uniHostMacList; }
+
+
+ public List<String> getUniHostIpList() { return uniHostIpList; }
+ public void setUniHostIpList(List<String> uniHostIpList) { this.uniHostIpList = uniHostIpList; }
+
+ public String getCos() { return cos; }
+ public void setCos(String cos) { this.cos = cos; }
+
+ public String getEvcId() { return evcId; }
+ public void setEvcId(String evcId) { this.evcId = evcId; }
+}
diff --git a/svc/svcbase/src/main/java/com/cablelabs/vcpe/svc/svcbase/repository/EplRespository.java b/svc/svcbase/src/main/java/com/cablelabs/vcpe/svc/svcbase/repository/EplRespository.java
new file mode 100644
index 0000000..1142963
--- /dev/null
+++ b/svc/svcbase/src/main/java/com/cablelabs/vcpe/svc/svcbase/repository/EplRespository.java
@@ -0,0 +1,21 @@
+package com.cablelabs.vcpe.svc.svcbase.repository;
+
+import com.cablelabs.vcpe.svc.svcbase.model.Epl;
+
+import java.util.List;
+
+/**
+ * Created by steve on 5/25/15.
+ */
+public interface EplRespository
+{
+ // TODO add exceptions
+
+ Epl add(Epl epl); // returns null if already exists, otherwise returns stored epl
+ Epl get(String svcId); // returns null if not found, otherwise stored svc
+ Epl update(Epl epl); // returns null if did not exit, otherwise epl as it was previous to update (put in any case)
+ Epl delete(String svcId); // returns null if not found, otherwise svc as it was previous to delete
+ int count(); // number of Epl stored in the repo
+ public void dump(int tab); // print out contents of the repo
+ List<Epl> getAll();
+}
diff --git a/svc/svcbase/src/main/java/com/cablelabs/vcpe/svc/svcbase/repository/EplRespositoryInMem.java b/svc/svcbase/src/main/java/com/cablelabs/vcpe/svc/svcbase/repository/EplRespositoryInMem.java
new file mode 100644
index 0000000..af82c21
--- /dev/null
+++ b/svc/svcbase/src/main/java/com/cablelabs/vcpe/svc/svcbase/repository/EplRespositoryInMem.java
@@ -0,0 +1,91 @@
+package com.cablelabs.vcpe.svc.svcbase.repository;
+
+import com.cablelabs.vcpe.common.Dbg;
+import com.cablelabs.vcpe.svc.svcbase.model.Epl;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * Created by steve on 5/24/15.
+ */
+
+
+/*
+ Singleton that contains a hashmap which holds instances of Epl objects, indexed by CiS ID
+ */
+
+public enum EplRespositoryInMem implements EplRespository {
+ INSTANCE; // Singleton
+
+ private Map<String, Epl> svcDB = new ConcurrentHashMap<>();
+
+ @Override
+ //--------------------------------------------------------
+ public Epl add(Epl epl)
+ //--------------------------------------------------------
+ {
+ if ( this.get(epl.getId()) != null ) {
+ return null;
+ }
+ svcDB.put(epl.getId(), epl);
+ return epl;
+ }
+
+ @Override
+ //--------------------------------------------------------
+ public Epl get(String svcId) {
+ return svcDB.get(svcId);
+ }
+ //--------------------------------------------------------
+
+ @Override
+ //--------------------------------------------------------
+ public Epl update(Epl epl)
+ //--------------------------------------------------------
+ {
+ // put returns null if epl did not exist, other returns epl as it stood prior to put
+ return svcDB.put(epl.getId(), epl);
+ }
+
+ @Override
+ //--------------------------------------------------------
+ public Epl delete(String svcId)
+ //--------------------------------------------------------
+ {
+ // remove returns null if svc did not exist, other returns svc as it stood prior to remove
+ return svcDB.remove(svcId);
+ }
+
+ @Override
+ //--------------------------------------------------------
+ public int count() {
+ return svcDB.size();
+ }
+ //--------------------------------------------------------
+
+ @Override
+ //--------------------------------------------------------
+ public List<Epl> getAll()
+ //--------------------------------------------------------
+ {
+ List<Epl> eplList = new ArrayList<Epl>(svcDB.values());
+ return eplList;
+ }
+
+ @Override
+ //--------------------------------------------------------
+ public void dump(int tab)
+ //--------------------------------------------------------
+ {
+ Dbg.p(tab, "Epl Repo: " + svcDB.size() + " entrie(s)");
+ int numSvc = 0;
+ for (Epl curEpl : svcDB.values()) {
+ numSvc++;
+ Dbg.p(tab+1, "<Entry " + numSvc+">");
+ curEpl.dump(tab+2);
+ }
+ }
+}
diff --git a/svc/svcbase/src/test/java/com/cablelabs/vcpe/svc/svcbase/client/EplClientTest.java b/svc/svcbase/src/test/java/com/cablelabs/vcpe/svc/svcbase/client/EplClientTest.java
new file mode 100644
index 0000000..f8950f9
--- /dev/null
+++ b/svc/svcbase/src/test/java/com/cablelabs/vcpe/svc/svcbase/client/EplClientTest.java
@@ -0,0 +1,150 @@
+package com.cablelabs.vcpe.svc.svcbase.client;
+
+import com.cablelabs.vcpe.common.Dbg;
+import com.cablelabs.vcpe.cos.cosbase.client.CoSClient;
+import com.cablelabs.vcpe.cos.cosbase.model.CoS;
+import com.cablelabs.vcpe.svc.svcbase.model.Epl;
+
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * Created by steve on 6/8/15.
+ */
+public class EplClientTest {
+
+ @Test
+ public void testAll() throws Exception {
+
+ // First, create a couple of CoS's to reference
+ CoS gold = new CoS();
+ CoS silver = new CoS();
+ CoS bronze = new CoS();
+
+ gold.setAllProps("gold", 100, 0.99, 17.43, 2.43, 0.01);
+ silver.setAllProps("silver", 50, 0.95, 27.43, 2.43, 0.02);
+ bronze.setAllProps("bronze", 25, 0.90, 37.43, 2.43, 0.03);
+
+ CoSClient coSClient = new CoSClient();
+
+ gold = coSClient.create(gold);
+ assertNotNull(gold);
+ silver = coSClient.create(silver);
+ assertNotNull(silver);
+ bronze = coSClient.create(bronze);
+ assertNotNull(bronze);
+
+ List<String> locList1 = new ArrayList<String>();
+ locList1.add("1 MEF Dr, Honolulu HI, USA");
+ locList1.add("1 MEF Dr, Boston MA, MAS");
+ List<String> uniList1 = new ArrayList<String>();
+ uniList1.add("11:AA:00:00:00:00");
+ uniList1.add("11:BB:00:00:00:00");
+ List<String> ipList1 = new ArrayList<String>();
+ ipList1.add("192.168.1.1");
+ ipList1.add("192.168.1.2");
+
+ List<String> locList2 = new ArrayList<String>();
+ locList2.add("22 MEF Dr, Honolulu HI, USA");
+ locList2.add("22 MEF Dr, Boston MA, MAS");
+ List<String> uniList2 = new ArrayList<String>();
+ uniList2.add("22:AA:00:00:00:00");
+ uniList2.add("22:BB:00:00:00:00");
+ List<String> ipList2 = new ArrayList<String>();
+ ipList2.add("192.168.2.1");
+ ipList2.add("192.168.2.2");
+
+ List<String> locList3 = new ArrayList<String>();
+ locList3.add("33 MEF Dr, Honolulu HI, USA");
+ locList3.add("33 MEF Dr, Boston MA, MAS");
+ List<String> uniList3 = new ArrayList<String>();
+ uniList3.add("33:AA:00:00:00:00");
+ uniList3.add("33:BB:00:00:00:00");
+ List<String> ipList3 = new ArrayList<String>();
+ ipList3.add("192.168.3.1");
+ ipList3.add("192.168.3.2");
+
+ Epl epl_1 = new Epl();
+ epl_1.setAllProps("epl-1", 2, locList1, uniList1, ipList1, gold.getId(), "unset");
+
+ EplClient eplClient = new EplClient();
+ Dbg.p(epl_1.getId()+" being created via eplmgr");
+ epl_1.dump(1);
+
+
+ // need to capture returned EPL in case it was modified by svc layer during creation
+ epl_1 = eplClient.create(epl_1);
+ assertNotNull(epl_1);
+
+ Epl retrievedEpl = eplClient.get(epl_1.getId());
+ assertNotNull(retrievedEpl);
+ Dbg.p("epl just retrieved from Epl Service");
+ retrievedEpl.dump(1);
+ retrievedEpl = null;
+
+ epl_1.setCos(bronze.getId());
+ Dbg.p("EPL["+ epl_1.getId()+ "] : about to be updated");
+ epl_1.dump(1);
+ assertNotNull(eplClient.update(epl_1));
+ retrievedEpl = eplClient.get(epl_1.getId());
+ assertNotNull(retrievedEpl);
+ Dbg.p("EPL["+ epl_1.getId()+ "] : retrieved after the update");
+ retrievedEpl.dump(1);
+
+ Epl epl_2 = new Epl();
+ epl_2.setAllProps("epl-2", 2, locList2, uniList2, ipList2, silver.getId(), "unset");
+
+ Epl epl_3 = new Epl();
+ epl_3.setAllProps("epl-3", 2, locList3, uniList3, ipList3, bronze.getId(), "unset");
+
+ // need to capture returned EPL in case it was modified by svc layer during creation
+ epl_2 = eplClient.create(epl_2);
+ assertNotNull(epl_2);
+ epl_3 = eplClient.create(epl_3);
+ assertNotNull(epl_3);
+
+ List<Epl> eplList = eplClient.getAll();
+ assertNotNull(eplList);
+ assertEquals(eplList.size(), 3);
+
+ Epl.dumpList(eplList);
+
+ eplClient.delete(epl_3.getId());
+ eplList = eplClient.getAll();
+ assertNotNull(eplList);
+ assertEquals(eplList.size(),2);
+ Epl.dumpList(eplList);
+
+ eplClient.delete(epl_2.getId());
+ eplList = eplClient.getAll();
+ Epl.dumpList(eplList);
+ assertNotNull(eplList);
+ assertEquals(eplList.size(),1);
+ Epl.dumpList(eplList);
+
+ eplClient.delete(epl_1.getId());
+ eplList = eplClient.getAll();
+ assertNotNull(eplList);
+ assertEquals(eplList.size(),0);
+ Epl.dumpList(eplList);
+ }
+
+ @Test
+ public void testTestGet() throws Exception {
+ EplClient eplClient = new EplClient();
+ Epl epl = eplClient.testGet();
+ epl.dump();;
+ }
+
+ @Test
+ public void testPing() throws Exception {
+
+ EplClient eplClient = new EplClient();
+ String resp = eplClient.ping();
+ Dbg.p(resp);
+ }
+}
diff --git a/svc/svcbase/src/test/java/com/cablelabs/vcpe/svc/svcbase/repository/EplRepositoryTest.java b/svc/svcbase/src/test/java/com/cablelabs/vcpe/svc/svcbase/repository/EplRepositoryTest.java
new file mode 100644
index 0000000..ff8c892
--- /dev/null
+++ b/svc/svcbase/src/test/java/com/cablelabs/vcpe/svc/svcbase/repository/EplRepositoryTest.java
@@ -0,0 +1,126 @@
+package com.cablelabs.vcpe.svc.svcbase.repository;
+
+import com.cablelabs.vcpe.cos.cosbase.model.CoS;
+import com.cablelabs.vcpe.svc.svcbase.model.Epl;
+
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.*;
+
+/**
+ * Created by steve on 5/25/15.
+ */
+public class EplRepositoryTest
+{
+
+ @Test
+ public void test() {
+
+ // First, create a couple of CoS's to reference
+ CoS gold = new CoS();
+ CoS silver = new CoS();
+ CoS bronze = new CoS();
+
+ // id CIR/MBS avail delay jitter frameloss
+ gold.setAllProps("gold", 100, 0.99, 17.43, 2.43, 0.01);
+ silver.setAllProps("silver", 50, 0.95, 27.43, 2.43, 0.02);
+ bronze.setAllProps("bronze", 25, 0.90, 37.43, 2.43, 0.03);
+
+ // lets add these to the
+
+ List<String> locList1 = new ArrayList<String>();
+ locList1.add("1111 MEF Dr, Honolulu HI, USA");
+ locList1.add("2222 MEF Dr, Honolulu HI, USA");
+ List<String> uniList1 = new ArrayList<String>();
+ uniList1.add("11:11:11:11:11:11");
+ uniList1.add("22:22:22:22:22:22");
+ List<String> ipList1 = new ArrayList<String>();
+ ipList1.add("192.168.1.1");
+ ipList1.add("192.168.1.2");
+
+
+ List<String> locList2 = new ArrayList<String>();
+ locList2.add("1111 MEF Dr, Honolulu HI, USA");
+ locList2.add("2222 MEF Dr, Boston MA, MAS");
+ List<String> uniList2 = new ArrayList<String>();
+ uniList2.add("11:11:11:11:11:11");
+ uniList2.add("22:22:22:22:22:22");
+ List<String> ipList2 = new ArrayList<String>();
+ ipList2.add("192.168.2.1");
+ ipList2.add("192.168.2.2");
+
+ List<String> locList3 = new ArrayList<String>();
+ locList3.add("1111 MEF Dr, Honolulu HI, USA");
+ locList3.add("2222 MEF Dr, Boston MA, MAS");
+ locList3.add("3333 MEF Dr, Boulder CO, USA");
+ List<String> uniList3 = new ArrayList<String>();
+ uniList3.add("11:11:11:11:11:11");
+ uniList3.add("22:22:22:22:22:22");
+ List<String> ipList3 = new ArrayList<String>();
+ ipList3.add("192.168.3.1");
+ ipList3.add("192.168.3.2");
+
+ List<String> locList4 = new ArrayList<String>();
+ locList4.add("1111 MEF Dr, Honolulu HI, USA");
+ locList4.add("2222 MEF Dr, Boston MA, MAS");
+ locList4.add("3333 MEF Dr, Boulder CO, USA");
+ locList4.add("4444 MEF Dr, Los Angeles, CA, USA");
+ List<String> uniList4 = new ArrayList<String>();
+ uniList4.add("11:11:11:11:11:11");
+ uniList4.add("22:22:22:22:22:22");
+ uniList4.add("33:33:33:33:33:33");
+ uniList4.add("44:44:44:44:44:44");
+ List<String> ipList4 = new ArrayList<String>();
+ ipList4.add("192.168.4.1");
+ ipList4.add("192.168.4.2");
+
+
+
+ Epl epl_1 = new Epl();
+ Epl epl_2 = new Epl();
+ Epl epl_3 = new Epl();
+ Epl epl_4 = new Epl();
+
+ epl_1.setAllProps("epl-1", 1, locList1, uniList1, ipList1, gold.getId(), "unset");
+ epl_2.setAllProps("epl-2", 2, locList2, uniList2, ipList2, silver.getId(), "unset");
+ epl_3.setAllProps("epl-3", 3, locList3, uniList3, ipList3, bronze.getId(), "unset");
+ epl_4.setAllProps("epl-4", 4, locList4, uniList4, ipList4, gold.getId(), "unset");
+
+ EplRespository repo = EplRespositoryInMem.INSTANCE;
+
+ assertNotNull(repo.add(epl_1));
+ assertNotNull(repo.add(epl_2));
+ assertNotNull(repo.add(epl_3));
+ assertNull(repo.add(epl_3)); // duplicate
+ assertEquals(repo.count(), 3);
+
+ assertNotNull(repo.get(epl_1.getId()));
+ assertNotNull(repo.get(epl_2.getId()));
+ assertNotNull(repo.get(epl_3.getId()));
+
+ assertNotNull(repo.delete(epl_2.getId()));
+ assertNull(repo.delete(epl_2.getId()));
+ assertNull(repo.delete("not-in-repo"));
+ assertEquals(repo.count(), 2);
+
+ assertEquals(repo.get(epl_1.getId()).getNumCustLocations(), 1);
+ assertNotEquals(repo.get(epl_3.getId()).getNumCustLocations(), 1);
+
+
+ assertNull(repo.update(epl_4)); // update non-existent cos
+ assertEquals(repo.count(), 3);
+ assertEquals(repo.get("epl-4").getCos(), gold.getId());
+
+ epl_4.setCos(silver.getId());
+ assertNotNull(repo.update(epl_4)); // update existing svc, same object
+ assertEquals(repo.get(epl_4.getId()).getCos(), silver.getId());
+
+ Epl epl_4_2 = new Epl();
+ epl_4_2.setAllProps("epl-4", 4, locList4, uniList4, ipList4, bronze.getId(), "unset");
+ assertNotNull(repo.update(epl_4_2)); // update svc, new object
+ assertEquals(repo.get(epl_4_2.getId()).getNumCustLocations(), 4);
+ }
+}
diff --git a/svc/svcbase/target/classes/com/cablelabs/vcpe/svc/svcbase/client/EplClient$1.class b/svc/svcbase/target/classes/com/cablelabs/vcpe/svc/svcbase/client/EplClient$1.class
new file mode 100644
index 0000000..bee6861
--- /dev/null
+++ b/svc/svcbase/target/classes/com/cablelabs/vcpe/svc/svcbase/client/EplClient$1.class
Binary files differ
diff --git a/svc/svcbase/target/classes/com/cablelabs/vcpe/svc/svcbase/client/EplClient.class b/svc/svcbase/target/classes/com/cablelabs/vcpe/svc/svcbase/client/EplClient.class
new file mode 100644
index 0000000..04b7db4
--- /dev/null
+++ b/svc/svcbase/target/classes/com/cablelabs/vcpe/svc/svcbase/client/EplClient.class
Binary files differ
diff --git a/svc/svcbase/target/classes/com/cablelabs/vcpe/svc/svcbase/model/Epl.class b/svc/svcbase/target/classes/com/cablelabs/vcpe/svc/svcbase/model/Epl.class
new file mode 100644
index 0000000..853209c
--- /dev/null
+++ b/svc/svcbase/target/classes/com/cablelabs/vcpe/svc/svcbase/model/Epl.class
Binary files differ
diff --git a/svc/svcbase/target/classes/com/cablelabs/vcpe/svc/svcbase/repository/EplRespository.class b/svc/svcbase/target/classes/com/cablelabs/vcpe/svc/svcbase/repository/EplRespository.class
new file mode 100644
index 0000000..8d0d203
--- /dev/null
+++ b/svc/svcbase/target/classes/com/cablelabs/vcpe/svc/svcbase/repository/EplRespository.class
Binary files differ
diff --git a/svc/svcbase/target/classes/com/cablelabs/vcpe/svc/svcbase/repository/EplRespositoryInMem.class b/svc/svcbase/target/classes/com/cablelabs/vcpe/svc/svcbase/repository/EplRespositoryInMem.class
new file mode 100644
index 0000000..bd2e9ef
--- /dev/null
+++ b/svc/svcbase/target/classes/com/cablelabs/vcpe/svc/svcbase/repository/EplRespositoryInMem.class
Binary files differ
diff --git a/svc/svcbase/target/maven-archiver/pom.properties b/svc/svcbase/target/maven-archiver/pom.properties
new file mode 100644
index 0000000..e6fee0f
--- /dev/null
+++ b/svc/svcbase/target/maven-archiver/pom.properties
@@ -0,0 +1,5 @@
+#Generated by Maven
+#Thu Aug 06 14:01:20 PDT 2015
+version=1.0-SNAPSHOT
+groupId=com.cablelabs.vcpe
+artifactId=svcbase
diff --git a/svc/svcbase/target/svcbase.jar b/svc/svcbase/target/svcbase.jar
new file mode 100644
index 0000000..d3ef79a
--- /dev/null
+++ b/svc/svcbase/target/svcbase.jar
Binary files differ
diff --git a/svc/svcbase/target/test-classes/com/cablelabs/vcpe/svc/svcbase/client/EplClientTest.class b/svc/svcbase/target/test-classes/com/cablelabs/vcpe/svc/svcbase/client/EplClientTest.class
new file mode 100644
index 0000000..e0df6f5
--- /dev/null
+++ b/svc/svcbase/target/test-classes/com/cablelabs/vcpe/svc/svcbase/client/EplClientTest.class
Binary files differ
diff --git a/svc/svcbase/target/test-classes/com/cablelabs/vcpe/svc/svcbase/repository/EplRepositoryTest.class b/svc/svcbase/target/test-classes/com/cablelabs/vcpe/svc/svcbase/repository/EplRepositoryTest.class
new file mode 100644
index 0000000..74b4913
--- /dev/null
+++ b/svc/svcbase/target/test-classes/com/cablelabs/vcpe/svc/svcbase/repository/EplRepositoryTest.class
Binary files differ
diff --git a/svc/svcmgr/pom.xml b/svc/svcmgr/pom.xml
new file mode 100644
index 0000000..2751749
--- /dev/null
+++ b/svc/svcmgr/pom.xml
@@ -0,0 +1,33 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <parent>
+ <groupId>com.cablelabs.vcpe</groupId>
+ <artifactId>svc</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ </parent>
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>com.cablelabs.vcpe</groupId>
+ <artifactId>svcmgr</artifactId>
+ <packaging>war</packaging>
+ <version>1.0-SNAPSHOT</version>
+
+ <build>
+ <finalName>svcmgr</finalName>
+ </build>
+
+ <dependencies>
+ <dependency>
+ <groupId>com.cablelabs.vcpe</groupId>
+ <artifactId>svcbase</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>com.cablelabs.vcpe</groupId>
+ <artifactId>evcbase</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ </dependency>
+ </dependencies>
+</project>
diff --git a/svc/svcmgr/src/main/java/com/cablelabs/vcpe/svc/svcmgr/CORSResponseFilter.java b/svc/svcmgr/src/main/java/com/cablelabs/vcpe/svc/svcmgr/CORSResponseFilter.java
new file mode 100644
index 0000000..69a5f44
--- /dev/null
+++ b/svc/svcmgr/src/main/java/com/cablelabs/vcpe/svc/svcmgr/CORSResponseFilter.java
@@ -0,0 +1,24 @@
+package com.cablelabs.vcpe.svc.svcmgr;
+
+import javax.ws.rs.container.ContainerRequestContext;
+import javax.ws.rs.container.ContainerResponseContext;
+import javax.ws.rs.container.ContainerResponseFilter;
+import javax.ws.rs.core.MultivaluedMap;
+import java.io.IOException;
+
+//
+// enable cross origin responses, otherwise we can't send rest requests from domain different than that of the server hosting our service
+//
+
+public class CORSResponseFilter implements ContainerResponseFilter {
+
+ public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
+ throws IOException {
+
+ MultivaluedMap<String, Object> headers = responseContext.getHeaders();
+ headers.add("Access-Control-Allow-Origin", "*");
+ headers.add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
+ headers.add("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, X-Codingpedia");
+ }
+
+}
diff --git a/svc/svcmgr/src/main/java/com/cablelabs/vcpe/svc/svcmgr/EplService.java b/svc/svcmgr/src/main/java/com/cablelabs/vcpe/svc/svcmgr/EplService.java
new file mode 100644
index 0000000..7f7510d
--- /dev/null
+++ b/svc/svcmgr/src/main/java/com/cablelabs/vcpe/svc/svcmgr/EplService.java
@@ -0,0 +1,213 @@
+package com.cablelabs.vcpe.svc.svcmgr;
+
+
+import com.cablelabs.vcpe.common.Dbg;
+import com.cablelabs.vcpe.evc.evcbase.client.EvcClient;
+import com.cablelabs.vcpe.svc.svcbase.model.Epl;
+import com.cablelabs.vcpe.svc.svcbase.repository.EplRespositoryInMem;
+import com.cablelabs.vcpe.evc.evcbase.model.Evc;
+
+
+import javax.ws.rs.*;
+import javax.ws.rs.core.GenericEntity;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Root resource (exposed at "svc/epl" path)
+ */
+
+@Path("svc/epl")
+public class EplService {
+
+ @POST
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Produces(MediaType.APPLICATION_JSON)
+ //--------------------------------------------------------
+ public Response create(Epl epl)
+ //--------------------------------------------------------
+ {
+ if ( epl == null) {
+ return Response.status(Response.Status.BAD_REQUEST).build();
+ }
+
+ Dbg.p("\nADDING [" + epl.getId() + "] to epl repo");
+
+ //
+ // Create an EVC
+ //
+
+ Evc evcForEpl = new Evc();
+
+ // Uni IDs set at lower layers
+ List<String> uniIdList = new ArrayList<String>();
+ uniIdList.add("unset");
+ uniIdList.add("unset");
+
+ // Transfer EPLs mac list to EVC
+ List<String> uniMacList = new ArrayList<String>();
+ if (epl.getUniHostMacList() != null && epl.getUniHostMacList().size() == 2) {
+ uniMacList.add(epl.getUniHostMacList().get(0) );
+ uniMacList.add(epl.getUniHostMacList().get(1));
+ }
+ else {
+ return Response.status(Response.Status.BAD_REQUEST).build();
+ }
+
+ // Transfer EPLs I{P list to EVC
+ List<String> uniIpList = new ArrayList<String>();
+ if (epl.getUniHostIpList() != null && epl.getUniHostIpList().size() == 2) {
+ uniIpList.add(epl.getUniHostIpList().get(0) );
+ uniIpList.add(epl.getUniHostIpList().get(1));
+ }
+ else {
+ return Response.status(Response.Status.BAD_REQUEST).build();
+ }
+
+ // evc mgr will set perf props based on CoS. We need to set everything else
+ evcForEpl.setAllNonPerfProps( "unset", // set by lower layer (id)
+ Evc.EvcType.POINT_TO_POINT, // required for EPL (evcType)
+ 2, // required for EPL (maxUnis)
+ uniIdList, // created above
+ uniMacList, uniIpList, // passed in
+ Evc.FrameDelivery.UNCONDITIONAL, // required for EPL (unicastFrameDelivery)
+ Evc.FrameDelivery.UNCONDITIONAL, // required for EPL (multicastFrameDelivery)
+ Evc.FrameDelivery.UNCONDITIONAL, // required for EPL (broadcastFrameDelivery)
+ true, // required for EPL (ceVLanIdPreservation)
+ true, // required for EPL (ceVlanCosPreservation)
+ 1600, // hard coded, need to figure out source !!
+ epl.getCos());
+
+ // send create request to EVC mgr
+ EvcClient evcClient = new EvcClient();
+ evcForEpl= evcClient.create(evcForEpl);
+
+ // EVC Layer generates the ID, we need to capture it
+ epl.setEvcId(evcForEpl.getId());
+
+ // Now add the EPL to our local repo
+ EplRespositoryInMem.INSTANCE.add(epl);
+ EplRespositoryInMem.INSTANCE.dump(0);
+ return Response.ok().entity(epl).build();
+ }
+
+ @PUT
+ @Path("{eplId}")
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Produces(MediaType.APPLICATION_JSON)
+ //--------------------------------------------------------
+ public Response update(Epl epl)
+ //--------------------------------------------------------
+ {
+ Dbg.p("\nUPDATING [" + epl.getId()+"]");
+
+ EplRespositoryInMem.INSTANCE.update(epl);
+ EplRespositoryInMem.INSTANCE.dump(0);
+ return Response.ok().entity(epl).build();
+ }
+
+ @GET
+ @Path("{eplId}")
+ @Produces(MediaType.APPLICATION_JSON)
+ //--------------------------------------------------------
+ public Response get( @PathParam("eplId") String eplId )
+ //--------------------------------------------------------
+ {
+ if ( eplId == null) {
+ return Response.status(Response.Status.BAD_REQUEST).build();
+ }
+ Dbg.p("\nRETRIEVING ["+eplId+"]");
+ Epl epl = EplRespositoryInMem.INSTANCE.get(eplId);
+ if (epl == null) {
+ return Response.status(Response.Status.NOT_FOUND).build();
+ }
+ epl.dump(1);
+ return Response.ok().entity(epl).build();
+ }
+
+ @GET
+ @Path("list")
+ @Produces(MediaType.APPLICATION_JSON)
+ //--------------------------------------------------------
+ public Response eplList()
+ //--------------------------------------------------------
+
+ // get a list of all Epl objects
+ {
+ Dbg.p("\nEPL GET ALL:");
+ List eplList = EplRespositoryInMem.INSTANCE.getAll();
+ if (eplList == null )
+ {
+ return Response.status(Response.Status.NOT_FOUND).build();
+ }
+ return Response.ok().entity(new GenericEntity<List<Epl>>(eplList) {}).build();
+ }
+
+ @DELETE
+ @Path("{eplId}")
+ //--------------------------------------------------------
+ public Response delete(@PathParam("eplId") String eplId)
+ //--------------------------------------------------------
+ {
+ if ( eplId == null) {
+ return Response.status(Response.Status.BAD_REQUEST).build();
+ }
+
+ // grab the full EPL so that we can get EVC ID to delete
+ Epl epl = EplRespositoryInMem.INSTANCE.get(eplId);
+ if (epl == null) {
+ return Response.status(Response.Status.NOT_FOUND).build();
+ }
+ String evcId = epl.getEvcId();
+
+ // Delete the EVC associated with the EPL being deleted
+ EvcClient evcClient = new EvcClient();
+ evcClient.delete(evcId);
+
+ Dbg.p("\nDELETE:" + eplId);
+ EplRespositoryInMem.INSTANCE.delete(eplId);
+ EplRespositoryInMem.INSTANCE.dump(0);
+ return Response.ok().build();
+ }
+
+ @GET
+ @Produces(MediaType.APPLICATION_JSON)
+ //--------------------------------------------------------
+ public Epl testGet()
+ //--------------------------------------------------------
+ // simple get to check out json format
+
+ {
+ long numLocations = 2;
+
+ List<String> locList = new ArrayList<String>();
+ locList.add("1111 MEF Dr, Honolulu HI, USA");
+ locList.add("2222 MEF Dr, Boston MA, MAS");
+
+ List<String> uniList = new ArrayList<String>();
+ uniList.add("00:0a:95:9d:68:16");
+ uniList.add("00:A0:C9:14:C8:29");
+
+ List<String> ipList = new ArrayList<String>();
+ ipList.add("192.168.1.10");
+ ipList.add("192.168.1.10");
+
+ Epl epl = new Epl();
+ epl.setAllProps("epl-1", numLocations, locList, uniList, ipList, "gold", "unset");
+ return epl;
+ }
+
+ @GET
+ @Produces(MediaType.TEXT_PLAIN)
+ //--------------------------------------------------------
+ public String ping()
+ //--------------------------------------------------------
+ // simple ping to check connectivity
+
+ {
+ Dbg.p("In Epl Service: ping test");
+ return "... pingEpl reponse";
+ }
+}
diff --git a/svc/svcmgr/src/main/java/com/cablelabs/vcpe/svc/svcmgr/SvcJaxRsApplication.java b/svc/svcmgr/src/main/java/com/cablelabs/vcpe/svc/svcmgr/SvcJaxRsApplication.java
new file mode 100644
index 0000000..5d92220
--- /dev/null
+++ b/svc/svcmgr/src/main/java/com/cablelabs/vcpe/svc/svcmgr/SvcJaxRsApplication.java
@@ -0,0 +1,18 @@
+package com.cablelabs.vcpe.svc.svcmgr;
+
+import org.glassfish.jersey.server.ResourceConfig;
+
+//
+// In order to avoid CORS issues, register our CORS Response filter
+//
+
+public class SvcJaxRsApplication extends ResourceConfig {
+
+ /**
+ * Register JAX-RS application components.
+ */
+ public SvcJaxRsApplication() {
+ packages("com.cablelabs.vcpe.cos.cosmgr");
+ register(CORSResponseFilter.class);
+ }
+} \ No newline at end of file
diff --git a/svc/svcmgr/src/main/webapp/WEB-INF/web.xml b/svc/svcmgr/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..06f0b7c
--- /dev/null
+++ b/svc/svcmgr/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- This web.xml file is not required when using Servlet 3.0 container,
+ see implementation details http://jersey.java.net/nonav/documentation/latest/jax-rs.html -->
+<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
+ <servlet>
+ <servlet-name>Jersey Web Application</servlet-name>
+ <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
+ <init-param>
+ <param-name>jersey.config.server.provider.packages</param-name>
+ <param-value>com.cablelabs.vcpe.svc</param-value>
+ </init-param>
+ <init-param>
+ <param-name>javax.ws.rs.Application</param-name>
+ <param-value>com.cablelabs.vcpe.svc.svcmgr.SvcJaxRsApplication</param-value>
+ </init-param>
+ <load-on-startup>1</load-on-startup>
+ </servlet>
+ <servlet-mapping>
+ <servlet-name>Jersey Web Application</servlet-name>
+ <url-pattern>/webapi/*</url-pattern>
+ </servlet-mapping>
+</web-app>
diff --git a/svc/svcmgr/src/main/webapp/index.jsp b/svc/svcmgr/src/main/webapp/index.jsp
new file mode 100644
index 0000000..a064b45
--- /dev/null
+++ b/svc/svcmgr/src/main/webapp/index.jsp
@@ -0,0 +1,8 @@
+<html>
+<body>
+ <h2>Jersey RESTful Web Application!</h2>
+ <p><a href="webapi/myresource">Jersey resource</a>
+ <p>Visit <a href="http://jersey.java.net">Project Jersey website</a>
+ for more information on Jersey!
+</body>
+</html>
diff --git a/svc/svcmgr/target/classes/com/cablelabs/vcpe/svc/svcmgr/CORSResponseFilter.class b/svc/svcmgr/target/classes/com/cablelabs/vcpe/svc/svcmgr/CORSResponseFilter.class
new file mode 100644
index 0000000..343c9df
--- /dev/null
+++ b/svc/svcmgr/target/classes/com/cablelabs/vcpe/svc/svcmgr/CORSResponseFilter.class
Binary files differ
diff --git a/svc/svcmgr/target/classes/com/cablelabs/vcpe/svc/svcmgr/EplService$1.class b/svc/svcmgr/target/classes/com/cablelabs/vcpe/svc/svcmgr/EplService$1.class
new file mode 100644
index 0000000..957dcbb
--- /dev/null
+++ b/svc/svcmgr/target/classes/com/cablelabs/vcpe/svc/svcmgr/EplService$1.class
Binary files differ
diff --git a/svc/svcmgr/target/classes/com/cablelabs/vcpe/svc/svcmgr/EplService.class b/svc/svcmgr/target/classes/com/cablelabs/vcpe/svc/svcmgr/EplService.class
new file mode 100644
index 0000000..1ca9218
--- /dev/null
+++ b/svc/svcmgr/target/classes/com/cablelabs/vcpe/svc/svcmgr/EplService.class
Binary files differ
diff --git a/svc/svcmgr/target/classes/com/cablelabs/vcpe/svc/svcmgr/SvcJaxRsApplication.class b/svc/svcmgr/target/classes/com/cablelabs/vcpe/svc/svcmgr/SvcJaxRsApplication.class
new file mode 100644
index 0000000..c8b5d87
--- /dev/null
+++ b/svc/svcmgr/target/classes/com/cablelabs/vcpe/svc/svcmgr/SvcJaxRsApplication.class
Binary files differ
diff --git a/svc/svcmgr/target/maven-archiver/pom.properties b/svc/svcmgr/target/maven-archiver/pom.properties
new file mode 100644
index 0000000..858608e
--- /dev/null
+++ b/svc/svcmgr/target/maven-archiver/pom.properties
@@ -0,0 +1,5 @@
+#Generated by Maven
+#Thu Aug 06 14:01:20 PDT 2015
+version=1.0-SNAPSHOT
+groupId=com.cablelabs.vcpe
+artifactId=svcmgr
diff --git a/svc/svcmgr/target/svcmgr.war b/svc/svcmgr/target/svcmgr.war
new file mode 100644
index 0000000..507df06
--- /dev/null
+++ b/svc/svcmgr/target/svcmgr.war
Binary files differ
diff --git a/svc/svcmgr/target/svcmgr/WEB-INF/classes/com/cablelabs/vcpe/svc/svcmgr/CORSResponseFilter.class b/svc/svcmgr/target/svcmgr/WEB-INF/classes/com/cablelabs/vcpe/svc/svcmgr/CORSResponseFilter.class
new file mode 100644
index 0000000..343c9df
--- /dev/null
+++ b/svc/svcmgr/target/svcmgr/WEB-INF/classes/com/cablelabs/vcpe/svc/svcmgr/CORSResponseFilter.class
Binary files differ
diff --git a/svc/svcmgr/target/svcmgr/WEB-INF/classes/com/cablelabs/vcpe/svc/svcmgr/EplService$1.class b/svc/svcmgr/target/svcmgr/WEB-INF/classes/com/cablelabs/vcpe/svc/svcmgr/EplService$1.class
new file mode 100644
index 0000000..957dcbb
--- /dev/null
+++ b/svc/svcmgr/target/svcmgr/WEB-INF/classes/com/cablelabs/vcpe/svc/svcmgr/EplService$1.class
Binary files differ
diff --git a/svc/svcmgr/target/svcmgr/WEB-INF/classes/com/cablelabs/vcpe/svc/svcmgr/EplService.class b/svc/svcmgr/target/svcmgr/WEB-INF/classes/com/cablelabs/vcpe/svc/svcmgr/EplService.class
new file mode 100644
index 0000000..1ca9218
--- /dev/null
+++ b/svc/svcmgr/target/svcmgr/WEB-INF/classes/com/cablelabs/vcpe/svc/svcmgr/EplService.class
Binary files differ
diff --git a/svc/svcmgr/target/svcmgr/WEB-INF/classes/com/cablelabs/vcpe/svc/svcmgr/SvcJaxRsApplication.class b/svc/svcmgr/target/svcmgr/WEB-INF/classes/com/cablelabs/vcpe/svc/svcmgr/SvcJaxRsApplication.class
new file mode 100644
index 0000000..c8b5d87
--- /dev/null
+++ b/svc/svcmgr/target/svcmgr/WEB-INF/classes/com/cablelabs/vcpe/svc/svcmgr/SvcJaxRsApplication.class
Binary files differ
diff --git a/svc/svcmgr/target/svcmgr/WEB-INF/lib/asm-all-repackaged-2.2.0-b14.jar b/svc/svcmgr/target/svcmgr/WEB-INF/lib/asm-all-repackaged-2.2.0-b14.jar
new file mode 100644
index 0000000..9c1f40d
--- /dev/null
+++ b/svc/svcmgr/target/svcmgr/WEB-INF/lib/asm-all-repackaged-2.2.0-b14.jar
Binary files differ
diff --git a/svc/svcmgr/target/svcmgr/WEB-INF/lib/cglib-2.2.0-b14.jar b/svc/svcmgr/target/svcmgr/WEB-INF/lib/cglib-2.2.0-b14.jar
new file mode 100644
index 0000000..7d6963b
--- /dev/null
+++ b/svc/svcmgr/target/svcmgr/WEB-INF/lib/cglib-2.2.0-b14.jar
Binary files differ
diff --git a/svc/svcmgr/target/svcmgr/WEB-INF/lib/common-1.0-SNAPSHOT.jar b/svc/svcmgr/target/svcmgr/WEB-INF/lib/common-1.0-SNAPSHOT.jar
new file mode 100644
index 0000000..267b07a
--- /dev/null
+++ b/svc/svcmgr/target/svcmgr/WEB-INF/lib/common-1.0-SNAPSHOT.jar
Binary files differ
diff --git a/svc/svcmgr/target/svcmgr/WEB-INF/lib/cosbase-1.0-SNAPSHOT.jar b/svc/svcmgr/target/svcmgr/WEB-INF/lib/cosbase-1.0-SNAPSHOT.jar
new file mode 100644
index 0000000..d991659
--- /dev/null
+++ b/svc/svcmgr/target/svcmgr/WEB-INF/lib/cosbase-1.0-SNAPSHOT.jar
Binary files differ
diff --git a/svc/svcmgr/target/svcmgr/WEB-INF/lib/evcbase-1.0-SNAPSHOT.jar b/svc/svcmgr/target/svcmgr/WEB-INF/lib/evcbase-1.0-SNAPSHOT.jar
new file mode 100644
index 0000000..f4f5b3a
--- /dev/null
+++ b/svc/svcmgr/target/svcmgr/WEB-INF/lib/evcbase-1.0-SNAPSHOT.jar
Binary files differ
diff --git a/svc/svcmgr/target/svcmgr/WEB-INF/lib/guava-14.0.1.jar b/svc/svcmgr/target/svcmgr/WEB-INF/lib/guava-14.0.1.jar
new file mode 100644
index 0000000..3a3d925
--- /dev/null
+++ b/svc/svcmgr/target/svcmgr/WEB-INF/lib/guava-14.0.1.jar
Binary files differ
diff --git a/svc/svcmgr/target/svcmgr/WEB-INF/lib/hk2-api-2.2.0-b14.jar b/svc/svcmgr/target/svcmgr/WEB-INF/lib/hk2-api-2.2.0-b14.jar
new file mode 100644
index 0000000..acec5bc
--- /dev/null
+++ b/svc/svcmgr/target/svcmgr/WEB-INF/lib/hk2-api-2.2.0-b14.jar
Binary files differ
diff --git a/svc/svcmgr/target/svcmgr/WEB-INF/lib/hk2-locator-2.2.0-b14.jar b/svc/svcmgr/target/svcmgr/WEB-INF/lib/hk2-locator-2.2.0-b14.jar
new file mode 100644
index 0000000..fb2687f
--- /dev/null
+++ b/svc/svcmgr/target/svcmgr/WEB-INF/lib/hk2-locator-2.2.0-b14.jar
Binary files differ
diff --git a/svc/svcmgr/target/svcmgr/WEB-INF/lib/hk2-utils-2.2.0-b14.jar b/svc/svcmgr/target/svcmgr/WEB-INF/lib/hk2-utils-2.2.0-b14.jar
new file mode 100644
index 0000000..2c8df43
--- /dev/null
+++ b/svc/svcmgr/target/svcmgr/WEB-INF/lib/hk2-utils-2.2.0-b14.jar
Binary files differ
diff --git a/svc/svcmgr/target/svcmgr/WEB-INF/lib/javax.annotation-api-1.2.jar b/svc/svcmgr/target/svcmgr/WEB-INF/lib/javax.annotation-api-1.2.jar
new file mode 100644
index 0000000..9ab39ff
--- /dev/null
+++ b/svc/svcmgr/target/svcmgr/WEB-INF/lib/javax.annotation-api-1.2.jar
Binary files differ
diff --git a/svc/svcmgr/target/svcmgr/WEB-INF/lib/javax.inject-2.2.0-b14.jar b/svc/svcmgr/target/svcmgr/WEB-INF/lib/javax.inject-2.2.0-b14.jar
new file mode 100644
index 0000000..21463e7
--- /dev/null
+++ b/svc/svcmgr/target/svcmgr/WEB-INF/lib/javax.inject-2.2.0-b14.jar
Binary files differ
diff --git a/svc/svcmgr/target/svcmgr/WEB-INF/lib/javax.ws.rs-api-2.0.jar b/svc/svcmgr/target/svcmgr/WEB-INF/lib/javax.ws.rs-api-2.0.jar
new file mode 100644
index 0000000..b7d364b
--- /dev/null
+++ b/svc/svcmgr/target/svcmgr/WEB-INF/lib/javax.ws.rs-api-2.0.jar
Binary files differ
diff --git a/svc/svcmgr/target/svcmgr/WEB-INF/lib/jersey-client-2.2.jar b/svc/svcmgr/target/svcmgr/WEB-INF/lib/jersey-client-2.2.jar
new file mode 100644
index 0000000..cab47b0
--- /dev/null
+++ b/svc/svcmgr/target/svcmgr/WEB-INF/lib/jersey-client-2.2.jar
Binary files differ
diff --git a/svc/svcmgr/target/svcmgr/WEB-INF/lib/jersey-common-2.2.jar b/svc/svcmgr/target/svcmgr/WEB-INF/lib/jersey-common-2.2.jar
new file mode 100644
index 0000000..55d27ed
--- /dev/null
+++ b/svc/svcmgr/target/svcmgr/WEB-INF/lib/jersey-common-2.2.jar
Binary files differ
diff --git a/svc/svcmgr/target/svcmgr/WEB-INF/lib/jersey-container-servlet-core-2.2.jar b/svc/svcmgr/target/svcmgr/WEB-INF/lib/jersey-container-servlet-core-2.2.jar
new file mode 100644
index 0000000..e03b5f9
--- /dev/null
+++ b/svc/svcmgr/target/svcmgr/WEB-INF/lib/jersey-container-servlet-core-2.2.jar
Binary files differ
diff --git a/svc/svcmgr/target/svcmgr/WEB-INF/lib/jersey-media-moxy-2.2.jar b/svc/svcmgr/target/svcmgr/WEB-INF/lib/jersey-media-moxy-2.2.jar
new file mode 100644
index 0000000..786290a
--- /dev/null
+++ b/svc/svcmgr/target/svcmgr/WEB-INF/lib/jersey-media-moxy-2.2.jar
Binary files differ
diff --git a/svc/svcmgr/target/svcmgr/WEB-INF/lib/jersey-server-2.2.jar b/svc/svcmgr/target/svcmgr/WEB-INF/lib/jersey-server-2.2.jar
new file mode 100644
index 0000000..37b3410
--- /dev/null
+++ b/svc/svcmgr/target/svcmgr/WEB-INF/lib/jersey-server-2.2.jar
Binary files differ
diff --git a/svc/svcmgr/target/svcmgr/WEB-INF/lib/org.eclipse.persistence.antlr-2.5.0.jar b/svc/svcmgr/target/svcmgr/WEB-INF/lib/org.eclipse.persistence.antlr-2.5.0.jar
new file mode 100644
index 0000000..cff0ef8
--- /dev/null
+++ b/svc/svcmgr/target/svcmgr/WEB-INF/lib/org.eclipse.persistence.antlr-2.5.0.jar
Binary files differ
diff --git a/svc/svcmgr/target/svcmgr/WEB-INF/lib/org.eclipse.persistence.asm-2.5.0.jar b/svc/svcmgr/target/svcmgr/WEB-INF/lib/org.eclipse.persistence.asm-2.5.0.jar
new file mode 100644
index 0000000..832e18e
--- /dev/null
+++ b/svc/svcmgr/target/svcmgr/WEB-INF/lib/org.eclipse.persistence.asm-2.5.0.jar
Binary files differ
diff --git a/svc/svcmgr/target/svcmgr/WEB-INF/lib/org.eclipse.persistence.core-2.5.0.jar b/svc/svcmgr/target/svcmgr/WEB-INF/lib/org.eclipse.persistence.core-2.5.0.jar
new file mode 100644
index 0000000..01bb838
--- /dev/null
+++ b/svc/svcmgr/target/svcmgr/WEB-INF/lib/org.eclipse.persistence.core-2.5.0.jar
Binary files differ
diff --git a/svc/svcmgr/target/svcmgr/WEB-INF/lib/org.eclipse.persistence.moxy-2.5.0.jar b/svc/svcmgr/target/svcmgr/WEB-INF/lib/org.eclipse.persistence.moxy-2.5.0.jar
new file mode 100644
index 0000000..29a1057
--- /dev/null
+++ b/svc/svcmgr/target/svcmgr/WEB-INF/lib/org.eclipse.persistence.moxy-2.5.0.jar
Binary files differ
diff --git a/svc/svcmgr/target/svcmgr/WEB-INF/lib/osgi-resource-locator-1.0.1.jar b/svc/svcmgr/target/svcmgr/WEB-INF/lib/osgi-resource-locator-1.0.1.jar
new file mode 100644
index 0000000..bd6aa17
--- /dev/null
+++ b/svc/svcmgr/target/svcmgr/WEB-INF/lib/osgi-resource-locator-1.0.1.jar
Binary files differ
diff --git a/svc/svcmgr/target/svcmgr/WEB-INF/lib/svcbase-1.0-SNAPSHOT.jar b/svc/svcmgr/target/svcmgr/WEB-INF/lib/svcbase-1.0-SNAPSHOT.jar
new file mode 100644
index 0000000..d3ef79a
--- /dev/null
+++ b/svc/svcmgr/target/svcmgr/WEB-INF/lib/svcbase-1.0-SNAPSHOT.jar
Binary files differ
diff --git a/svc/svcmgr/target/svcmgr/WEB-INF/lib/validation-api-1.1.0.Final.jar b/svc/svcmgr/target/svcmgr/WEB-INF/lib/validation-api-1.1.0.Final.jar
new file mode 100644
index 0000000..de85403
--- /dev/null
+++ b/svc/svcmgr/target/svcmgr/WEB-INF/lib/validation-api-1.1.0.Final.jar
Binary files differ
diff --git a/svc/svcmgr/target/svcmgr/WEB-INF/web.xml b/svc/svcmgr/target/svcmgr/WEB-INF/web.xml
new file mode 100644
index 0000000..06f0b7c
--- /dev/null
+++ b/svc/svcmgr/target/svcmgr/WEB-INF/web.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- This web.xml file is not required when using Servlet 3.0 container,
+ see implementation details http://jersey.java.net/nonav/documentation/latest/jax-rs.html -->
+<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
+ <servlet>
+ <servlet-name>Jersey Web Application</servlet-name>
+ <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
+ <init-param>
+ <param-name>jersey.config.server.provider.packages</param-name>
+ <param-value>com.cablelabs.vcpe.svc</param-value>
+ </init-param>
+ <init-param>
+ <param-name>javax.ws.rs.Application</param-name>
+ <param-value>com.cablelabs.vcpe.svc.svcmgr.SvcJaxRsApplication</param-value>
+ </init-param>
+ <load-on-startup>1</load-on-startup>
+ </servlet>
+ <servlet-mapping>
+ <servlet-name>Jersey Web Application</servlet-name>
+ <url-pattern>/webapi/*</url-pattern>
+ </servlet-mapping>
+</web-app>
diff --git a/svc/svcmgr/target/svcmgr/index.jsp b/svc/svcmgr/target/svcmgr/index.jsp
new file mode 100644
index 0000000..a064b45
--- /dev/null
+++ b/svc/svcmgr/target/svcmgr/index.jsp
@@ -0,0 +1,8 @@
+<html>
+<body>
+ <h2>Jersey RESTful Web Application!</h2>
+ <p><a href="webapi/myresource">Jersey resource</a>
+ <p>Visit <a href="http://jersey.java.net">Project Jersey website</a>
+ for more information on Jersey!
+</body>
+</html>
diff --git a/uni/pom.xml b/uni/pom.xml
new file mode 100644
index 0000000..a9d9fd2
--- /dev/null
+++ b/uni/pom.xml
@@ -0,0 +1,23 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <parent>
+ <groupId>com.cablelabs.vcpe</groupId>
+ <artifactId>vcpe-services</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ </parent>
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>com.cablelabs.vcpe</groupId>
+ <artifactId>uni</artifactId>
+ <packaging>pom</packaging>
+ <version>1.0-SNAPSHOT</version>
+
+ <modules>
+ <module>unibase</module>
+ </modules>
+
+ <dependencies></dependencies>
+
+</project>
diff --git a/uni/unibase/pom.xml b/uni/unibase/pom.xml
new file mode 100644
index 0000000..839f4ad
--- /dev/null
+++ b/uni/unibase/pom.xml
@@ -0,0 +1,23 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <parent>
+ <groupId>com.cablelabs.vcpe</groupId>
+ <artifactId>uni</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ </parent>
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>com.cablelabs.vcpe</groupId>
+ <artifactId>unibase</artifactId>
+ <packaging>jar</packaging>
+ <version>1.0-SNAPSHOT</version>
+
+ <build>
+ <finalName>unibase</finalName>
+ </build>
+
+ <dependencies></dependencies>
+
+</project>
diff --git a/uni/unibase/src/main/java/com/cablelabs/vcpe/uni/unibase/client/EvcPathClient.java b/uni/unibase/src/main/java/com/cablelabs/vcpe/uni/unibase/client/EvcPathClient.java
new file mode 100644
index 0000000..1bc41b5
--- /dev/null
+++ b/uni/unibase/src/main/java/com/cablelabs/vcpe/uni/unibase/client/EvcPathClient.java
@@ -0,0 +1,180 @@
+package com.cablelabs.vcpe.uni.unibase.client;
+
+import com.cablelabs.vcpe.common.Dbg;
+import com.cablelabs.vcpe.uni.unibase.model.EvcPath;
+import com.cablelabs.vcpe.uni.unibase.model.Uni;
+
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.xml.bind.DatatypeConverter;
+import java.util.List;
+
+/**
+ * Created by steve on 5/28/15.
+ */
+
+public class EvcPathClient {
+
+ private String evcMgrServer = "localhost";
+ private String evcMgrPort = "8181";
+ private String evcMgrCfgRESTPath = "/restconf/config/cl-vcpe-mef:evcs/";
+
+ private Client client; // provided by Jersey
+
+ public EvcPathClient() {
+ client = ClientBuilder.newClient();
+ }
+
+ //--------------------------------------------------------
+ public Response create(EvcPath evcPath )
+ //--------------------------------------------------------
+ {
+ WebTarget target =client.target("http://"+evcMgrServer+":" + evcMgrPort + evcMgrCfgRESTPath);
+
+ String json = evcPath.toJson();
+ Dbg.p("\nEVC Create JSON:");
+ Dbg.p(json);
+
+ Response response = target.path("evc")
+ .request(MediaType.APPLICATION_JSON)
+ .post(Entity.entity(json, MediaType.APPLICATION_JSON));
+
+ if (response.getStatus() != 200 ) // figure out how to use Status.OK
+ {
+ // in production you can be more specific based on reponse code, id, etc
+ throw new RuntimeException(response.getStatus() + ": there was an error on the server.");
+ }
+ //return response.readEntity(EvcPath.class);
+ return response;
+ }
+
+ //--------------------------------------------------------
+ public Response update(EvcPath evcPath) throws Exception
+ //--------------------------------------------------------
+ {
+ WebTarget target =client.target("http://"+evcMgrServer+":" + evcMgrPort + evcMgrCfgRESTPath);
+
+ String json = evcPath.toJson();
+ String unamepass = "admin:admin";
+ String authorizationHeaderValue = "Basic " + DatatypeConverter.printBase64Binary(unamepass.getBytes("UTF-8"));
+ Dbg.p("\nEVC Create/Update JSON:");
+ Dbg.p(json);
+
+ Response response = target.path("evc/"+evcPath.getId())
+ .request(MediaType.APPLICATION_JSON)
+ .header("Authorization", authorizationHeaderValue)
+ .put(Entity.entity(json, MediaType.APPLICATION_JSON));
+
+ if (response.getStatus() != 200 ) // figure out how to use Status.OK
+ {
+ // in production you can be more specific based on reponse code, id, etc
+ throw new RuntimeException(response.getStatus() + ": there was an error on the server.");
+ }
+ return response;
+ }
+ //--------------------------------------------------------
+ public void delete(String evcPathId) throws Exception
+ //--------------------------------------------------------
+ // delete EvcPath of specified ID
+ {
+ WebTarget target =client.target("http://"+evcMgrServer+":" + evcMgrPort + evcMgrCfgRESTPath);
+
+ String uNameAndPass = "admin:admin";
+ String authorizationHeaderValue = "Basic " +
+ DatatypeConverter.printBase64Binary(uNameAndPass.getBytes("UTF-8"));
+
+ Response response = target.path("evc/" + evcPathId)
+ .request(MediaType.APPLICATION_JSON)
+ .header("Authorization", authorizationHeaderValue)
+ .delete();
+ if (response.getStatus() != 200) // figure out how to use Status.OK
+ {
+ // in production you can be more specific based on reponse code, id, etc
+ throw new RuntimeException(response.getStatus() + ": there was an error on the server.");
+ }
+ }
+
+ //
+ // Code from here below requires work in order to work with ODL
+ //
+
+ //--------------------------------------------------------
+ public EvcPath get(String evcPathId)
+ //--------------------------------------------------------
+ // get EvcPath of specified ID
+ {
+ WebTarget target = client.target("http://localhost:9090/evcmgr/webapi/");
+
+ Response response = target.path("evc/"+evcPathId).request(MediaType.APPLICATION_JSON).get(Response.class);
+ if (response.getStatus() != 200) // figure out how to use Status.OK
+ {
+ // in production you can be more specific based on reponse code, id, etc
+ throw new RuntimeException(response.getStatus() + ": there was an error on the server.");
+ }
+
+ return response.readEntity(EvcPath.class);
+ }
+
+ //--------------------------------------------------------
+ public List<EvcPath> getAll()
+ //--------------------------------------------------------
+ // get a list of all EvcPath instances
+ {
+
+ WebTarget target = client.target("http://localhost:9090/evcmgr/webapi/");
+
+ // Can I do this with a Response, so that I can check for errors
+ List<EvcPath> response = target.path("evc/list")
+ .request(MediaType.APPLICATION_JSON)
+ .get(new GenericType<List<EvcPath>>() {
+ });
+ if (response == null) // figure out how to use Status.OK
+ {
+ // in production you can be more specific based on reponse code, id, etc
+ throw new RuntimeException("there was an error on the server.");
+ }
+ return response;
+ }
+
+ //--------------------------------------------------------
+ public EvcPath testGet()
+ //--------------------------------------------------------
+ // test marshaling of EvcPath class from server json
+ {
+ WebTarget target = client.target("http://localhost:9090/evcmgr/webapi/");
+
+ Response response = target.path("evc").request(MediaType.APPLICATION_JSON).get(Response.class);
+ if (response.getStatus() != 200) // figure out how to use Status.OK
+ {
+ // in production you can be more specific based on reponse code, id, etc
+ throw new RuntimeException(response.getStatus() + ": there was an error on the server.");
+ }
+
+ //return response;
+ return response.readEntity(EvcPath.class);
+ }
+
+ //--------------------------------------------------------
+ public String ping()
+ //--------------------------------------------------------
+ // test connectivity
+ {
+
+ WebTarget target = client.target("http://localhost:9090/evcmgr/webapi/");
+
+ Response response = target.path("evc").request(MediaType.TEXT_PLAIN).get();
+ if (response.getStatus() != 200) // figure out how to use Status.OK
+ {
+ // in production you can be more specific based on reponse code, id, etc
+ throw new RuntimeException(response.getStatus() + ": there was an error on the server.");
+ }
+
+
+ return response.readEntity(String.class);
+ }
+}
diff --git a/uni/unibase/src/main/java/com/cablelabs/vcpe/uni/unibase/client/UniClient.java b/uni/unibase/src/main/java/com/cablelabs/vcpe/uni/unibase/client/UniClient.java
new file mode 100644
index 0000000..a1dcff4
--- /dev/null
+++ b/uni/unibase/src/main/java/com/cablelabs/vcpe/uni/unibase/client/UniClient.java
@@ -0,0 +1,188 @@
+package com.cablelabs.vcpe.uni.unibase.client;
+
+import com.cablelabs.vcpe.common.Dbg;
+import com.cablelabs.vcpe.uni.unibase.model.Uni;
+
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.util.List;
+import javax.xml.bind.DatatypeConverter;
+
+/**
+ * Created by steve on 5/28/15.
+ */
+
+public class UniClient {
+
+ private String uniMgrServer = "localhost";
+ private String uniMgrPort = "8181";
+ private String uniMgrCfgRESTPath = "/restconf/config/cl-vcpe-mef:unis/";
+
+ private Client client; // provided by Jersey
+
+ public UniClient() {
+ client = ClientBuilder.newClient();
+ }
+
+ //--------------------------------------------------------
+ public Response create(Uni uni ) throws Exception
+ //--------------------------------------------------------
+ // create Uni
+ {
+ WebTarget target =client.target("http://"+uniMgrServer+":" + uniMgrPort + uniMgrCfgRESTPath);
+
+ String json = uni.toJson();
+ Dbg.p("\nUNI Create JSON:");
+ Dbg.p(json);
+
+ String uNameAndPass = "admin:admin";
+ String authorizationHeaderValue = "Basic " +
+ DatatypeConverter.printBase64Binary(uNameAndPass.getBytes("UTF-8"));
+ Response response = target.path("uni")
+ .request(MediaType.APPLICATION_JSON)
+ .header("Authorization", authorizationHeaderValue)
+ .post(Entity.entity(json, MediaType.APPLICATION_JSON));
+
+ if (response.getStatus() != 200 ) // figure out how to use Status.OK
+ {
+ // in production you can be more specific based on reponse code, id, etc
+ throw new RuntimeException(response.getStatus() + ": there was an error on the server.");
+ }
+ //return response.readEntity(Uni.class);
+ return response;
+ }
+
+ //--------------------------------------------------------
+ public Response update(Uni uni) throws Exception
+ //--------------------------------------------------------
+ // create/update Uni. This seems to be how OLD expects uni creation
+ {
+ WebTarget target =client.target("http://"+uniMgrServer+":" + uniMgrPort + uniMgrCfgRESTPath);
+
+ String json = uni.toJson();
+ Dbg.p("\nUNI Create/Update JSON:");
+ Dbg.p(json);
+
+ String uNameAndPass = "admin:admin";
+ String authorizationHeaderValue = "Basic " +
+ DatatypeConverter.printBase64Binary(uNameAndPass.getBytes("UTF-8"));
+ Response response = target.path("uni/"+uni.getId())
+ .request(MediaType.APPLICATION_JSON)
+ .header("Authorization", authorizationHeaderValue)
+ .put(Entity.entity(json, MediaType.APPLICATION_JSON));
+
+ if (response.getStatus() != 200 ) // figure out how to use Status.OK
+ {
+ // in production you can be more specific based on reponse code, id, etc
+ throw new RuntimeException(response.getStatus() + ": there was an error on the server.");
+ }
+ return response;
+ }
+
+ //--------------------------------------------------------
+ public void delete(String uniId) throws Exception
+ //--------------------------------------------------------
+ // delete Uni of specified ID
+ {
+ WebTarget target =client.target("http://"+uniMgrServer+":" + uniMgrPort + uniMgrCfgRESTPath);
+
+ String uNameAndPass = "admin:admin";
+ String authorizationHeaderValue = "Basic " +
+ DatatypeConverter.printBase64Binary(uNameAndPass.getBytes("UTF-8"));
+
+ Response response = target.path("uni/" + uniId)
+ .request(MediaType.APPLICATION_JSON)
+ .header("Authorization", authorizationHeaderValue)
+ .delete();
+ if (response.getStatus() != 200) // figure out how to use Status.OK
+ {
+ // in production you can be more specific based on reponse code, id, etc
+ throw new RuntimeException(response.getStatus() + ": there was an error on the server.");
+ }
+ }
+
+ //
+ // Code from here below requires work in order to work with ODL
+ //
+
+ //--------------------------------------------------------
+ public Uni get(String uniId)
+ //--------------------------------------------------------
+ // get Uni of specified ID
+ {
+ WebTarget target = client.target("http://localhost:9090/unimgr/webapi/");
+
+ Response response = target.path("uni/"+uniId).request(MediaType.APPLICATION_JSON).get(Response.class);
+ if (response.getStatus() != 200) // figure out how to use Status.OK
+ {
+ // in production you can be more specific based on reponse code, id, etc
+ throw new RuntimeException(response.getStatus() + ": there was an error on the server.");
+ }
+
+ //return response;
+ return response.readEntity(Uni.class);
+ }
+
+ //--------------------------------------------------------
+ public List<Uni> getAll()
+ //--------------------------------------------------------
+ // get a list of all Uni instances
+ {
+
+ WebTarget target = client.target("http://localhost:9090/unimgr/webapi/");
+
+ // Can I do this with a Response, so that I can check for errors
+ List<Uni> response = target.path("uni/list")
+ .request(MediaType.APPLICATION_JSON)
+ .get(new GenericType<List<Uni>>() {
+ });
+ if (response == null) // figure out how to use Status.OK
+ {
+ // in production you can be more specific based on reponse code, id, etc
+ throw new RuntimeException("there was an error on the server.");
+ }
+ return response;
+ }
+
+ //--------------------------------------------------------
+ public Uni testGet()
+ //--------------------------------------------------------
+ // test marshaling of Uni class from server json
+ {
+ WebTarget target = client.target("http://localhost:9090/unimgr/webapi/");
+
+ Response response = target.path("uni").request(MediaType.APPLICATION_JSON).get(Response.class);
+ if (response.getStatus() != 200) // figure out how to use Status.OK
+ {
+ // in production you can be more specific based on reponse code, id, etc
+ throw new RuntimeException(response.getStatus() + ": there was an error on the server.");
+ }
+
+ //return response;
+ return response.readEntity(Uni.class);
+ }
+
+ //--------------------------------------------------------
+ public String ping()
+ //--------------------------------------------------------
+ // test connectivity
+ {
+
+ WebTarget target = client.target("http://localhost:9090/unimgr/webapi/");
+
+ Response response = target.path("uni").request(MediaType.TEXT_PLAIN).get();
+ if (response.getStatus() != 200) // figure out how to use Status.OK
+ {
+ // in production you can be more specific based on reponse code, id, etc
+ throw new RuntimeException(response.getStatus() + ": there was an error on the server.");
+ }
+
+
+ return response.readEntity(String.class);
+ }
+}
diff --git a/uni/unibase/src/main/java/com/cablelabs/vcpe/uni/unibase/model/EvcPath.java b/uni/unibase/src/main/java/com/cablelabs/vcpe/uni/unibase/model/EvcPath.java
new file mode 100644
index 0000000..6556fbb
--- /dev/null
+++ b/uni/unibase/src/main/java/com/cablelabs/vcpe/uni/unibase/model/EvcPath.java
@@ -0,0 +1,112 @@
+package com.cablelabs.vcpe.uni.unibase.model;
+
+/**
+ * Created by steve on 7/24/15.
+ */
+public class EvcPath {
+
+ String id = "unset";
+ Uni uni1 = null;
+ Uni uni2 = null;
+ String cos;
+ Uni.SvcSpeed ingressBW = Uni.SvcSpeed.UNASSIGNED;
+ Uni.SvcSpeed egressBW = Uni.SvcSpeed.UNASSIGNED;
+
+ public EvcPath(String id, Uni uni1, Uni uni2,
+ Uni.SvcSpeed ingressBW,
+ Uni.SvcSpeed egressBW,
+ String cos)
+ {
+ this.id = id;
+ this.uni1 = uni1;
+ this.uni2 = uni2;
+ this.cos = cos;
+ this.ingressBW = ingressBW;
+ this.egressBW = egressBW;
+ }
+
+ public String toJson() {
+
+//{
+// "evc":
+// {
+// "evc:id": "822f8284-2b35-11e5-b345-feff819cdc9f",
+// "evc:uni-dest":
+// [
+// {
+// "order": 0,
+// "uni": "822f7eec-2b35-11e5-b345-feff819cdc9f"
+// }
+// ],
+// "evc:uni-source":
+// [
+// {
+// "order": 0,
+// "uni": "111f7eec-2c35-11e5-b345-feff819cdc9f"
+// }
+// ],
+// "evc:cos-id": "string",
+// "evc:ingress-bw":
+// {
+// "speed-1G": {}
+// },
+// "evc:egress-bw":
+// {
+// "speed-1G": {}
+// }
+// }
+//}
+
+ String json = "{\n"+
+ " \"evc\":\n"+
+ " {\n"+
+ " \"evc:id\": \""+ this.getId() +"\",\n"+
+ " \"evc:uni-dest\":\n"+
+ " [\n"+
+ " {\n"+
+ " \"order\": 0,\n"+
+ " \"uni\": \""+ this.uni1.getId() +"\"\n"+
+ " }\n"+
+ " ],\n"+
+ " \"evc:uni-source\":\n"+
+ " [\n"+
+ " {\n"+
+ " \"order\": 0,\n"+
+ " \"uni\": \""+ this.uni2.getId() +"\"\n"+
+ " }\n"+
+ " ],\n"+
+ " \"evc:cos-id\": \""+ this.getCos() +"\",\n"+
+ " \"evc:ingress-bw\":\n"+
+ " {\n"+
+// " \"speed-1G\": {}\n"+
+ " \"" + this.getIngressBW() + "\": {}\n"+
+ " },\n"+
+ " \"evc:egress-bw\":\n"+
+ " {\n"+
+// " \"speed-1G\": {}\n"+
+ " \"" + this.getEgressBW() + "\": {}\n"+
+ " }\n"+
+ " }\n"+
+ "}";
+ return json;
+ }
+
+
+ public String getId() { return id; }
+ public void setId(String id) { this.id = id; }
+
+ public Uni getUn1() { return uni1; }
+ public void setUn1(Uni uni1) { this.uni1 = uni1; }
+
+ public Uni getUn2() { return uni2; }
+ public void setUn2(Uni uni2) { this.uni2 = uni2; }
+
+ public String getCos() { return cos; }
+ public void setCos(String cos) { this.cos = cos; }
+
+ public Uni.SvcSpeed getIngressBW() { return ingressBW; }
+ public void setIngressBW(Uni.SvcSpeed ingressBW) { this.ingressBW = ingressBW; }
+
+ public Uni.SvcSpeed getEgressBW() { return egressBW; }
+ public void setEgressBW(Uni.SvcSpeed egressBW) { this.egressBW = egressBW; }
+}
diff --git a/uni/unibase/src/main/java/com/cablelabs/vcpe/uni/unibase/model/Uni.java b/uni/unibase/src/main/java/com/cablelabs/vcpe/uni/unibase/model/Uni.java
new file mode 100644
index 0000000..6d1b9c0
--- /dev/null
+++ b/uni/unibase/src/main/java/com/cablelabs/vcpe/uni/unibase/model/Uni.java
@@ -0,0 +1,230 @@
+package com.cablelabs.vcpe.uni.unibase.model;
+
+import com.cablelabs.vcpe.common.Dbg;
+
+import javax.xml.bind.annotation.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * Created by steve on 5/24/15.
+ */
+
+@XmlRootElement
+public class Uni
+{
+
+ public enum SvcSpeed {
+ UNASSIGNED ("UNASSIGNED"),
+ TEN_MEG ("speed-10M"),
+ HUNDRED_MEG ("speed-100M"),
+ ONE_GIG ("speed-1G"),
+ TEN_GIG ("speed-10G");
+ private final String s;
+ private SvcSpeed(final String s) {this.s = s;}
+ @Override public String toString() { return s; }
+ }
+
+ public enum PhysMedium { // just a sampling of 802.3 phys layers
+ UNASSIGNED ("UNASSIGNED"),
+ TEN_BASE_T ("10BASE‑T"),
+ HUNDERED_BASE_T("100BASE‑T"),
+ GIG_BASE_T ("1000BASE‑T"),
+ TEN_GIG_BASE_T ("10GBASE‑T");
+ private final String s;
+ private PhysMedium(final String s) {this.s = s;}
+ @Override public String toString() { return s; }
+ }
+
+ public enum MacLayer {
+ UNASSIGNED ("UNASSIGNED"),
+ IEEE_802_3 ("IEEE 802.3-2005");
+ private final String s;
+ private MacLayer(final String s) {this.s = s;}
+ @Override public String toString() { return s; }
+ }
+
+ public enum SyncMode {
+ UNASSIGNED ("UNASSIGNED"),
+ ENABLED ("syncEnabled"),
+ DISABLED ("syncDisabled");
+ private final String s;
+ private SyncMode(final String s) {this.s = s;}
+ @Override public String toString() { return s; }
+ }
+
+ public enum Type { // not sure what this is
+ UNASSIGNED ("UNASSIGNED"),
+ UNITYPE ("UNITYPE");
+ private final String s;
+ private Type(final String s) {this.s = s;}
+ @Override public String toString() { return s; }
+ }
+
+ @XmlElement(name="id")
+ private String id;
+
+ @XmlTransient // This does not get written to JSON body
+ private SvcSpeed speed;
+
+ @XmlElement(name="ip-address")
+ private String ipAddress;
+
+ @XmlElement(name="mac-address")
+ private String macAddress;
+
+ @XmlElement(name="physical-medium")
+ private PhysMedium physicalMedium;
+
+ @XmlElement(name="mac-layer")
+ private MacLayer macLayer;
+
+ @XmlElement(name="mode")
+ private SyncMode mode;
+
+ @XmlElement(name="type")
+ private Type type;
+
+ @XmlElement(name="mtu-size")
+ private long mtuSize;
+
+ // no argument constructor required for JAX-RS
+ public Uni() {
+ this.id = "unset";
+ this.speed = SvcSpeed.UNASSIGNED;
+ this.ipAddress = "unset";
+ this.macAddress = "unset";
+ this.physicalMedium = PhysMedium.UNASSIGNED;
+ this.macLayer = MacLayer.UNASSIGNED;
+ this.mode = SyncMode.UNASSIGNED;
+ this.type = Type.UNASSIGNED;
+ this.mtuSize = -1;
+ }
+
+ public void setAllProps (String id, SvcSpeed speed, String ipAddress,
+ String macAddress, PhysMedium physicalMedium,
+ MacLayer macLayer, SyncMode mode, Type type, long mtuSize) {
+ this.id = id;
+ this.speed = speed;
+ this.ipAddress = ipAddress;
+ this.macAddress = macAddress;
+ this.physicalMedium = physicalMedium;
+ this.macLayer = macLayer;
+ this.mode = mode;
+ this.type = type;
+ this.mtuSize = mtuSize;
+ }
+
+ public void dump() { dump(0); }
+ public void dump(int tab) {
+ Dbg.p(tab, "id: " + this.id);
+ Dbg.p(tab, "speed: " + this.speed);
+ Dbg.p(tab, "ipAddress: " + this.ipAddress);
+ Dbg.p(tab, "macAddress: " + this.macAddress);
+ Dbg.p(tab, "physicalMedium: " + this.physicalMedium);
+ Dbg.p(tab, "macLayer: " + this.macLayer);
+ Dbg.p(tab, "mode: " + this.mode);
+ Dbg.p(tab, "type: " + this.type);
+ Dbg.p(tab, "mtuSize: " + this.mtuSize);
+ }
+
+ public String toJson() {
+
+ String json = "{\n"+
+ " \"uni\":\n"+
+ " {\n"+
+ " \"uni:id\": \""+ this.getId() +"\",\n"+
+ " \"speed\":\n" +
+ " {\n" +
+ " \"" + this.getSpeed() + "\": "+"\"1\"\n"+
+ " },\n"+
+ " \"uni:mac-layer\": \""+ this.getMacLayer() +"\",\n"+
+ " \"uni:physical-medium\": \""+ this.getPhysicalMedium() +"\",\n"+
+ " \"uni:mtu-size\": \""+ this.getMtuSize() +"\",\n"+
+ " \"uni:type\": \"\",\n"+
+ " \"uni:mac-address\": \""+ this.getMacAddress() +"\",\n"+
+ " \"uni:ip-address\": \""+ this.getIpAddress() +"\",\n"+
+ " \"uni:mode\": \""+ this.getMode() +"\"\n"+
+ " }\n"+
+ "}";
+
+ return json;
+ }
+
+
+ public static SvcSpeed cirToSvcSpeed (long cir) {
+
+ // find closest
+ SvcSpeed svcSpeed = SvcSpeed.UNASSIGNED;
+ if ( cir <= 10000 )
+ svcSpeed = SvcSpeed.TEN_MEG;
+ else if ( cir <= 100000 )
+ svcSpeed = SvcSpeed.HUNDRED_MEG;
+ else if ( cir <= 1000000 )
+ svcSpeed = SvcSpeed.ONE_GIG;
+ else
+ svcSpeed = SvcSpeed.TEN_GIG;
+
+ return svcSpeed;
+ }
+
+ public static PhysMedium svcSpeedToPhysMedium (SvcSpeed svcSpeed) {
+
+
+ // just for demo, this really needs to come from host, when hosts are modeled
+ switch (svcSpeed) {
+ case TEN_MEG:
+ return PhysMedium.TEN_BASE_T;
+ case HUNDRED_MEG:
+ return PhysMedium.HUNDERED_BASE_T;
+ case ONE_GIG:
+ return PhysMedium.GIG_BASE_T;
+ case TEN_GIG:
+ return PhysMedium.TEN_GIG_BASE_T;
+ default:
+ return PhysMedium.UNASSIGNED;
+ }
+ }
+
+ public static void dumpList(List<Uni> uniList) { dumpList(0, uniList); }
+ public static void dumpList(int tab, List<Uni> uniList) {
+ int numUni = 0;
+ Dbg.p("----- Uni List : [" + uniList.size() + "] elements");
+ for (Uni curUni : uniList) {
+ numUni++;
+ Dbg.p(tab+1, "<Entry " + numUni+">");
+ curUni.dump(tab+2);
+ }
+ }
+
+ // getters & setters
+
+ public String getId() { return id; }
+ public void setId(String id) { this.id = id; }
+
+ public SvcSpeed getSpeed() { return speed; }
+ public void setSpeed(SvcSpeed speed) { this.speed = speed; }
+
+ public String getIpAddress() { return ipAddress; }
+ public void setIpAddress(String ipAddress) { this.ipAddress = ipAddress; }
+
+ public String getMacAddress() { return macAddress; }
+ public void setMacAddress(String macAddress) { this.macAddress = macAddress; }
+
+ public PhysMedium getPhysicalMedium() { return physicalMedium; }
+ public void setPhysicalMedium(PhysMedium physicalMedium) { this.physicalMedium = physicalMedium; }
+
+ public MacLayer getMacLayer() { return macLayer; }
+ public void setMacLayer(MacLayer macLayer) { this.macLayer = macLayer; }
+
+ public SyncMode getMode() { return mode; }
+ public void setMode(SyncMode mode) { this.mode = mode; }
+
+ public Type getType() { return type; }
+ public void setType(Type type) { this.type = type; }
+
+ public long getMtuSize() { return mtuSize; }
+ public void setMtuSize(long mtuSize) { this.mtuSize = mtuSize; }
+}
diff --git a/uni/unibase/src/test/java/com/cablelabs/vcpe/uni/unibase/client/UniClientTest.java b/uni/unibase/src/test/java/com/cablelabs/vcpe/uni/unibase/client/UniClientTest.java
new file mode 100644
index 0000000..0160190
--- /dev/null
+++ b/uni/unibase/src/test/java/com/cablelabs/vcpe/uni/unibase/client/UniClientTest.java
@@ -0,0 +1,50 @@
+package com.cablelabs.vcpe.uni.unibase.client;
+
+import com.cablelabs.vcpe.uni.unibase.model.EvcPath;
+
+//import com.cablelabs.vcpe.cos.cosbase.client.CoSClient;
+//import com.cablelabs.vcpe.cos.cosbase.model.CoS;
+
+import com.cablelabs.vcpe.uni.unibase.model.Uni;
+import org.junit.Test;
+
+/**
+ * Created by steve on 5/28/15.
+ */
+
+public class UniClientTest {
+
+ @Test
+ public void testAll() throws Exception {
+
+// CoS gold = new CoS();
+// gold.setAllProps("gold", 100, 0.99, 17.43, 2.43, 0.01);
+
+
+ UniClient uniClient = new UniClient();
+
+ Uni uni1 = new Uni();
+ uni1.setAllProps("uni-1", Uni.SvcSpeed.ONE_GIG,
+ "192.168.1.100", "11:AA:00:00:00:00",
+ Uni.PhysMedium.GIG_BASE_T, Uni.MacLayer.IEEE_802_3,
+ Uni.SyncMode.ENABLED, Uni.Type.UNITYPE, 1600);
+ uniClient.update(uni1);
+
+ Uni uni2 = new Uni();
+ uni2.setAllProps("uni-2", Uni.SvcSpeed.HUNDRED_MEG,
+ "192.168.1.101", "11:BB:00:00:00:00",
+ Uni.PhysMedium.HUNDERED_BASE_T, Uni.MacLayer.IEEE_802_3,
+ Uni.SyncMode.ENABLED, Uni.Type.UNITYPE, 1600);
+
+ uniClient.update(uni1);
+ uniClient.update(uni2);
+
+
+ EvcPathClient evcPathClient = new EvcPathClient();
+ EvcPath evcPath = new EvcPath( "new-evc", uni1, uni2,
+ Uni.SvcSpeed.ONE_GIG,
+ Uni.SvcSpeed.TEN_GIG,
+ "Gold" );
+ evcPathClient.update(evcPath);
+ }
+} \ No newline at end of file
diff --git a/uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/client/EvcPathClient$1.class b/uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/client/EvcPathClient$1.class
new file mode 100644
index 0000000..a0424c4
--- /dev/null
+++ b/uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/client/EvcPathClient$1.class
Binary files differ
diff --git a/uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/client/EvcPathClient.class b/uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/client/EvcPathClient.class
new file mode 100644
index 0000000..7a5d975
--- /dev/null
+++ b/uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/client/EvcPathClient.class
Binary files differ
diff --git a/uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/client/UniClient$1.class b/uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/client/UniClient$1.class
new file mode 100644
index 0000000..c27fe95
--- /dev/null
+++ b/uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/client/UniClient$1.class
Binary files differ
diff --git a/uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/client/UniClient.class b/uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/client/UniClient.class
new file mode 100644
index 0000000..2299402
--- /dev/null
+++ b/uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/client/UniClient.class
Binary files differ
diff --git a/uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/model/EvcPath.class b/uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/model/EvcPath.class
new file mode 100644
index 0000000..665f9a9
--- /dev/null
+++ b/uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/model/EvcPath.class
Binary files differ
diff --git a/uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/model/Uni$1.class b/uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/model/Uni$1.class
new file mode 100644
index 0000000..60bbc96
--- /dev/null
+++ b/uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/model/Uni$1.class
Binary files differ
diff --git a/uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/model/Uni$MacLayer.class b/uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/model/Uni$MacLayer.class
new file mode 100644
index 0000000..a01569d
--- /dev/null
+++ b/uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/model/Uni$MacLayer.class
Binary files differ
diff --git a/uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/model/Uni$PhysMedium.class b/uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/model/Uni$PhysMedium.class
new file mode 100644
index 0000000..d1aafca
--- /dev/null
+++ b/uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/model/Uni$PhysMedium.class
Binary files differ
diff --git a/uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/model/Uni$SvcSpeed.class b/uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/model/Uni$SvcSpeed.class
new file mode 100644
index 0000000..ea1f246
--- /dev/null
+++ b/uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/model/Uni$SvcSpeed.class
Binary files differ
diff --git a/uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/model/Uni$SyncMode.class b/uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/model/Uni$SyncMode.class
new file mode 100644
index 0000000..bd49b42
--- /dev/null
+++ b/uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/model/Uni$SyncMode.class
Binary files differ
diff --git a/uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/model/Uni$Type.class b/uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/model/Uni$Type.class
new file mode 100644
index 0000000..bf73e35
--- /dev/null
+++ b/uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/model/Uni$Type.class
Binary files differ
diff --git a/uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/model/Uni.class b/uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/model/Uni.class
new file mode 100644
index 0000000..f982446
--- /dev/null
+++ b/uni/unibase/target/classes/com/cablelabs/vcpe/uni/unibase/model/Uni.class
Binary files differ
diff --git a/uni/unibase/target/maven-archiver/pom.properties b/uni/unibase/target/maven-archiver/pom.properties
new file mode 100644
index 0000000..84d59f2
--- /dev/null
+++ b/uni/unibase/target/maven-archiver/pom.properties
@@ -0,0 +1,5 @@
+#Generated by Maven
+#Thu Aug 06 14:01:19 PDT 2015
+version=1.0-SNAPSHOT
+groupId=com.cablelabs.vcpe
+artifactId=unibase
diff --git a/uni/unibase/target/test-classes/com/cablelabs/vcpe/uni/unibase/client/UniClientTest.class b/uni/unibase/target/test-classes/com/cablelabs/vcpe/uni/unibase/client/UniClientTest.class
new file mode 100644
index 0000000..79bb6e4
--- /dev/null
+++ b/uni/unibase/target/test-classes/com/cablelabs/vcpe/uni/unibase/client/UniClientTest.class
Binary files differ
diff --git a/uni/unibase/target/unibase.jar b/uni/unibase/target/unibase.jar
new file mode 100644
index 0000000..46cc4d4
--- /dev/null
+++ b/uni/unibase/target/unibase.jar
Binary files differ
diff --git a/uni/unimgr/dbg.js b/uni/unimgr/dbg.js
new file mode 100644
index 0000000..f4d3416
--- /dev/null
+++ b/uni/unimgr/dbg.js
@@ -0,0 +1,84 @@
+(function(){
+
+ var dbgFlag = true;
+ var pre = ""
+
+ var on = function() { dbgFlag = true; };
+ var off = function() { dbgFlag = false; };
+
+ var p = function(str, tab) {
+ if ( dbgFlag )
+ {
+ var tabStr = "";
+ if (tab) {
+ for (var i = 0; i < tab; i++ )
+ tabStr += " ";
+ }
+ console.log(pre + tabStr + str);
+ }
+ };
+
+ var pj = function(obj) {
+ if ( dbgFlag )
+ console.log(JSON.stringify(obj,null,3)) ;
+ };
+
+ var e = function(eMsg) {
+ console.log("!! ERROR: " + eMsg);
+ }
+
+ var w = function(eMsg) {
+ console.log("** WARNIING: " + eMsg);
+ }
+
+ // for testing. Write regaurdless of dbgFlag
+ var t = function(str, tab) {
+ var tabStr = "";
+ if (tab) {
+ for (var i = 0; i < tab; i++ )
+ tabStr += " ";
+ }
+ console.log(pre + tabStr + str);
+ }
+
+function curTime() {
+
+ var date = new Date();
+
+ var hour = date.getHours();
+ hour = (hour < 10 ? "0" : "") + hour;
+
+ var min = date.getMinutes();
+ min = (min < 10 ? "0" : "") + min;
+
+ var sec = date.getSeconds();
+ sec = (sec < 10 ? "0" : "") + sec;
+
+ // var year = date.getFullYear();
+
+ // var month = date.getMonth() + 1;
+ // month = (month < 10 ? "0" : "") + month;
+
+ // var day = date.getDate();
+ // day = (day < 10 ? "0" : "") + day;
+
+ // return year + ":" + month + ":" + day + ":" + hour + ":" + min + ":" + sec;
+
+ return hour + ":" + min + ":" + sec;
+
+
+}
+
+ module.exports.curTime = curTime; // returns str w current time
+
+ module.exports.on = on; // enable DBG printing
+ module.exports.off = off; // squelch DBG printing
+ module.exports.p = p; // print a debug string
+ module.exports.pj = pj; // print JSON version of an object
+ module.exports.w = w; // print an warning msg
+ module.exports.e = e; // print an error msg
+ module.exports.t = t; // print an error msg
+
+
+
+}()); \ No newline at end of file
diff --git a/uni/unimgr/package.json b/uni/unimgr/package.json
new file mode 100644
index 0000000..9c2c9f6
--- /dev/null
+++ b/uni/unimgr/package.json
@@ -0,0 +1,10 @@
+{
+ "name": "unimgr-emulator",
+ "version": "0.0.1",
+ "description": "recieves and prints unimgr REST calls",
+ "author": "steve@sentosatech.com",
+ "dependencies": {
+ "express" : "latest",
+ "body-parser": "*"
+ }
+} \ No newline at end of file
diff --git a/uni/unimgr/uniMgrEmu.js b/uni/unimgr/uniMgrEmu.js
new file mode 100644
index 0000000..f5ecb88
--- /dev/null
+++ b/uni/unimgr/uniMgrEmu.js
@@ -0,0 +1,247 @@
+
+// Create express HTTP server app
+var express = require('express');
+var app = express();
+
+// have express parse http request JSON bodies into POJO's
+var bodyParser = require('body-parser');
+app.use(bodyParser.json());
+
+// local modules
+var dbg = require('./dbg.js');
+
+// enable cross domain requests
+app.all('*', function(req, res, next) {
+ res.header("Access-Control-Allow-Origin", "*");
+ res.header("Access-Control-Allow-Headers", "X-Requested-With");
+ res.header('Access-Control-Allow-Headers', 'Content-Type');
+ res.header('Access-Control-Allow-Headers', 'Authorization');
+ res.header('Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, OPTIONS');
+ next();
+});
+
+
+// ---------------------------------------------
+// UNI Manager Services
+// ---------------------------------------------
+// PUT: Create/update UNI
+// /restconf/config/cl-vcpe-mef:unis/uni/
+// BODY:
+// {
+// "uni": {
+// "uni:id": "822f7eec-2b35-11e5-b345-feff819cdc9f",
+// "speed": {
+// "speed-1G": 1
+// },
+// "uni:mac-layer": "IEEE 802.3-2005",
+// "uni:physical-medium": "UNI TypeFull Duplex 2 Physical Interface",
+// "uni:mtu-size": 0,
+// "uni:type": "",
+// "uni:mac-address": "68:5b:35:bb:f8:3e",
+// "uni:ip-address": "192.168.0.22",
+// "uni:mode": "Full Duplex"
+// }
+// }
+//
+// GET: Query UNI
+// /restconf/operational/cl-vcpe-mef:unis/uni/
+// RESPONSE:
+// {
+// "uni": [
+// {
+// "id": "822f7eec-2b35-11e5-b345-feff819cdc9f",
+// "type": "",
+// "speed": {
+// "speed-1G": [
+// null
+// ]
+// },
+// "ip-address": "192.168.1.30",
+// "physical-medium": "UNI TypeFull Duplex 2 Physical Interface",
+// "mode": "Full Duplex",
+// "mac-address": "08:00:27:35:64:90",
+// "mtu-size": 0,
+// "mac-layer": "IEEE 802.3-2005"
+// }
+// ]
+// }
+//
+//
+// DELETE: Delete a UNI
+// /restconf/config/cl-vcpe-mef:unis/uni/
+//
+// ---------------------------------------------
+
+
+var uniMgrOpPath = "/restconf/operational/cl-vcpe-mef:unis/uni/";
+var uniMgrOpId = uniMgrOpPath+":uniId"
+
+var uniMgrCfgPath = "/restconf/config/cl-vcpe-mef:unis/uni/";
+var uniMgrCfgId = uniMgrCfgPath+":uniId"
+
+dbg.p("uni Op REST path : " + uniMgrOpPath);
+dbg.p("uni Op REST id : " + uniMgrOpId);
+dbg.p("uni Cfg REST path : " + uniMgrCfgPath);
+dbg.p("uni Cfg REST id : " + uniMgrCfgId);
+
+
+// We will maintain a map of UNI's created
+var uniMap = {};
+
+
+var removeUniNameSpace = function(uniIn ) {
+ //dbg.p("in removeUniNameSpace()");
+ var uniOut = {};
+
+ // remove pesky ODL namespace qualifiers, as they are not present in ODL responses
+ uniOut["uni"] =
+ [
+ {
+ "id" : uniIn["uni"]["uni:id"],
+ "speed" : uniIn["uni"]["speed"],
+ "mac-layer" : uniIn["uni"]["uni:mac-layer"],
+ "physical-medium" : uniIn["uni"]["uni:physical-medium"],
+ "mtu-size" : uniIn["uni"]["uni:mtu-size"],
+ "type" : uniIn["uni"]["uni:type"],
+ "mac-address" : uniIn["uni"]["uni:mac-address"],
+ "ip-address" : uniIn["uni"]["uni:ip-address"],
+ "mode" : uniIn["uni"]["uni:mode"]
+ }
+ ]
+
+ // dbg.p("Clean uni"); dbg.pj(uniOut);
+ return uniOut;
+}
+
+// Create/update a UNI
+// ---------------------------------------------
+app.put( uniMgrCfgId, function(req, resp){
+ dbg.p ("... [" + dbg.curTime() + "] made it to PUT: " + uniMgrCfgPath + req.params.uniId );
+
+ var uni = req.body;
+ dbg.p("Creating /Updating Uni: ");
+ dbg.pj(uni);
+
+ uniClean = removeUniNameSpace(uni);
+ uniMap[uniClean.uni[0].id] = uniClean;
+
+ // dbg.p("uni map after push of clean"); dbg.pj(uniMap);
+ resp.send( { "message":
+ "... made it to PUT: " + uniMgrCfgId } );
+});
+
+
+
+// Query UNI Info
+// ---------------------------------------------
+app.get( uniMgrOpId, function(req, resp){
+
+ var uniId = req.params.uniId;
+ dbg.p ("... [" + dbg.curTime() + "] made it to GET: " + uniMgrOpPath + uniId );
+
+ var uniToReturn = null;
+ if ( uniMap[uniId] )
+ uniToReturn = uniMap[uniId];
+ else
+ uniToReturn = { "error" : "uni not in the DB: " + uniId }
+
+ resp.send( uniToReturn );
+});
+
+// Delete UNI
+// ---------------------------------------------
+app.delete( uniMgrCfgId, function(req, resp){
+ var uniId = req.params.uniId;
+ dbg.p ("... [" + dbg.curTime() + "] made it to DELETE: " + uniMgrCfgPath + uniId );
+
+ // dbg.p("uni map prior to delete");
+ // dbg.pj(uniMap);
+ delete uniMap[uniId];
+ // dbg.p("-----------------------------------");
+ // dbg.p("uni map after delete");
+ // dbg.pj(uniMap);
+
+ resp.send( { "message":
+ "... made it to DELETE: " + uniMgrCfgPath + uniId } );
+});
+
+// ---------------------------------------------
+// EVC Path Services
+// ---------------------------------------------
+// POST/PUT: Create/update UNI
+// /restconf/operational/cl-vcpe-mef:evcs/evc/
+// BODY:
+// {
+// "evc":
+// {
+// "evc:id": "822f8284-2b35-11e5-b345-feff819cdc9f",
+// "evc:uni-dest":
+// [
+// {
+// "order": 0,
+// "uni": "822f7eec-2b35-11e5-b345-feff819cdc9f"
+// }
+// ],
+// "evc:uni-source":
+// [
+// {
+// "order": 0,
+// "uni": "111f7eec-2c35-11e5-b345-feff819cdc9f"
+// }
+// ],
+// "evc:cos-id": "string",
+// "evc:ingress-bw":
+// {
+// "speed-1G": {}
+// },
+// "evc:egress-bw":
+// {
+// "speed-1G": {}
+// }
+// }
+// }
+//
+// ---------------------------------------------
+
+var evcMgrCfgPath = "/restconf/config/cl-vcpe-mef:evcs/evc/";
+var evcMgrCfgId = evcMgrCfgPath+":evcId"
+dbg.p("evc cfg REST path : " + evcMgrCfgPath);
+dbg.p("evc cfg REST id : " + evcMgrCfgId);
+
+// We will maintain a map of EVCs created
+var evcMap = {};
+
+
+// Create/update EVC Path
+// ---------------------------------------------
+app.put( evcMgrCfgId, function(req, resp){
+ var evcId = req.params.evcId;
+ dbg.p ("... [" + dbg.curTime() + "] made it to PUT: " + evcMgrCfgPath + evcId );
+ dbg.p("req body = ");
+ dbg.pj(req.body);
+ dbg.p("----------------------------------------------------")
+ resp.send( { "message":
+ "... made it to PUT: " + evcMgrCfgId } );
+});
+
+
+// Query EVC Info
+// ---------------------------------------------
+// TBD
+
+
+// Delete EVC
+// ---------------------------------------------
+app.delete( evcMgrCfgId, function(req, resp){
+ var evcId = req.params.evcId;
+ dbg.p ("... [" + dbg.curTime() + "] made it to DELETE: " + evcMgrCfgPath + evcId );
+
+ // currently not keeping a map of EVCs, just acknowledge recept of REST msg
+ resp.send( { "message":
+ "... made it to DELETE: " + evcMgrCfgPath + evcId } );
+});
+
+
+var PORT = 8181;
+app.listen(PORT);
+console.log('Running on http://localhost:' + PORT);