From 2301edbf56dd000cd2cdda00c5b8c76e72ed40e6 Mon Sep 17 00:00:00 2001 From: Hallvard Traetteberg <hal@ntnu.no> Date: Sun, 29 Sep 2019 22:02:42 +0200 Subject: [PATCH] Moved emf+osgi stuff to another OSGi workspace --- dict-ws/README.md | 2 + dict-ws/cnf/build.bnd | 12 -- dict-ws/cnf/local/index.xml | 2 +- dict-ws/cnf/local/index.xml.sha | 2 +- dict-ws/cnf/release/index.xml | 2 +- dict-ws/cnf/release/index.xml.sha | 2 +- emf-ws/.gitattributes | 75 ++++++++ emf-ws/.gitignore | 4 + emf-ws/.gradle-wrapper/gradle-wrapper.jar | Bin 0 -> 55741 bytes .../.gradle-wrapper/gradle-wrapper.properties | 5 + emf-ws/.travis.yml | 10 + emf-ws/README.md | 84 +++++++++ emf-ws/build.gradle | 4 + emf-ws/cnf/.gitignore | 1 + emf-ws/cnf/.project | 11 ++ emf-ws/cnf/build.bnd | 88 +++++++++ emf-ws/cnf/central.maven | 9 + emf-ws/cnf/local/index.xml | 2 + emf-ws/cnf/local/index.xml.sha | 1 + emf-ws/cnf/release/index.xml | 2 + emf-ws/cnf/release/index.xml.sha | 1 + emf-ws/cnf/templates/index.xml | 96 ++++++++++ emf-ws/cnf/templates/index.xml.sha | 1 + emf-ws/gradle.properties | 3 + emf-ws/gradlew | 172 ++++++++++++++++++ emf-ws/gradlew.bat | 84 +++++++++ emf-ws/settings.gradle | 14 ++ .../tdt4250.emf.servlet/.classpath | 0 .../tdt4250.emf.servlet/.project | 0 .../tdt4250.emf.servlet/bnd.bnd | 0 .../tdt4250.emf.servlet/launch.bndrun | 0 .../tdt4250/ra/servlet/ResourceServlet.java | 0 .../test/tdt4250/ra/servlet/ignore.md | 0 .../.classpath | 0 .../tdt4250.emf.servletsupport.impl/.project | 0 .../tdt4250.emf.servletsupport.impl/bnd.bnd | 0 .../launch.bndrun | 0 .../servletsupport/impl/AnnotationUtil.java | 0 .../impl/JsonEAttributeSerializer.java | 0 .../impl/JsonEObjectSerializer.java | 0 .../servletsupport/impl/JsonSerializer.java | 0 .../impl/NameReferenceResolver.java | 0 .../servletsupport/impl/RequestHandler.java | 0 .../servletsupport/impl/RequestSupport.java | 0 .../servletsupport/impl/ResourceProvider.java | 0 .../servletsupport/impl/package-info.java | 0 .../tdt4250/servletsupport/impl/ignore.md | 0 .../tdt4250.emf.servletsupport/.classpath | 0 .../tdt4250.emf.servletsupport/.project | 0 .../tdt4250.emf.servletsupport/bnd.bnd | 0 .../tdt4250/servletsupport/IPostHandler.java | 0 .../servletsupport/IReferenceResolver.java | 0 .../servletsupport/IRequestPathResolver.java | 0 .../servletsupport/IRequestQueryExecutor.java | 0 .../servletsupport/IResourceProvider.java | 0 .../servletsupport/IResponseSerializer.java | 0 .../tdt4250/servletsupport/package-info.java | 0 emf-ws/tdt4250.ra.resource/.classpath | 12 ++ emf-ws/tdt4250.ra.resource/.project | 23 +++ emf-ws/tdt4250.ra.resource/bnd.bnd | 20 ++ emf-ws/tdt4250.ra.resource/launch.bndrun | 18 ++ .../tdt4250/ra/resource/SampleResource.java | 31 ++++ .../src/tdt4250/ra/resource/sample.ra | 20 ++ .../test/tdt4250/ra/resource/ignore.md | 1 + 64 files changed, 798 insertions(+), 16 deletions(-) create mode 100644 emf-ws/.gitattributes create mode 100644 emf-ws/.gitignore create mode 100644 emf-ws/.gradle-wrapper/gradle-wrapper.jar create mode 100644 emf-ws/.gradle-wrapper/gradle-wrapper.properties create mode 100644 emf-ws/.travis.yml create mode 100644 emf-ws/README.md create mode 100644 emf-ws/build.gradle create mode 100644 emf-ws/cnf/.gitignore create mode 100644 emf-ws/cnf/.project create mode 100644 emf-ws/cnf/build.bnd create mode 100644 emf-ws/cnf/central.maven create mode 100644 emf-ws/cnf/local/index.xml create mode 100644 emf-ws/cnf/local/index.xml.sha create mode 100644 emf-ws/cnf/release/index.xml create mode 100644 emf-ws/cnf/release/index.xml.sha create mode 100644 emf-ws/cnf/templates/index.xml create mode 100644 emf-ws/cnf/templates/index.xml.sha create mode 100644 emf-ws/gradle.properties create mode 100644 emf-ws/gradlew create mode 100644 emf-ws/gradlew.bat create mode 100644 emf-ws/settings.gradle rename {dict-ws => emf-ws}/tdt4250.emf.servlet/.classpath (100%) rename {dict-ws => emf-ws}/tdt4250.emf.servlet/.project (100%) rename {dict-ws => emf-ws}/tdt4250.emf.servlet/bnd.bnd (100%) rename {dict-ws => emf-ws}/tdt4250.emf.servlet/launch.bndrun (100%) rename {dict-ws => emf-ws}/tdt4250.emf.servlet/src/tdt4250/ra/servlet/ResourceServlet.java (100%) rename {dict-ws => emf-ws}/tdt4250.emf.servlet/test/tdt4250/ra/servlet/ignore.md (100%) rename {dict-ws => emf-ws}/tdt4250.emf.servletsupport.impl/.classpath (100%) rename {dict-ws => emf-ws}/tdt4250.emf.servletsupport.impl/.project (100%) rename {dict-ws => emf-ws}/tdt4250.emf.servletsupport.impl/bnd.bnd (100%) rename {dict-ws => emf-ws}/tdt4250.emf.servletsupport.impl/launch.bndrun (100%) rename {dict-ws => emf-ws}/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/AnnotationUtil.java (100%) rename {dict-ws => emf-ws}/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/JsonEAttributeSerializer.java (100%) rename {dict-ws => emf-ws}/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/JsonEObjectSerializer.java (100%) rename {dict-ws => emf-ws}/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/JsonSerializer.java (100%) rename {dict-ws => emf-ws}/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/NameReferenceResolver.java (100%) rename {dict-ws => emf-ws}/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/RequestHandler.java (100%) rename {dict-ws => emf-ws}/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/RequestSupport.java (100%) rename {dict-ws => emf-ws}/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/ResourceProvider.java (100%) rename {dict-ws => emf-ws}/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/package-info.java (100%) rename {dict-ws => emf-ws}/tdt4250.emf.servletsupport.impl/test/tdt4250/servletsupport/impl/ignore.md (100%) rename {dict-ws => emf-ws}/tdt4250.emf.servletsupport/.classpath (100%) rename {dict-ws => emf-ws}/tdt4250.emf.servletsupport/.project (100%) rename {dict-ws => emf-ws}/tdt4250.emf.servletsupport/bnd.bnd (100%) rename {dict-ws => emf-ws}/tdt4250.emf.servletsupport/src/tdt4250/servletsupport/IPostHandler.java (100%) rename {dict-ws => emf-ws}/tdt4250.emf.servletsupport/src/tdt4250/servletsupport/IReferenceResolver.java (100%) rename {dict-ws => emf-ws}/tdt4250.emf.servletsupport/src/tdt4250/servletsupport/IRequestPathResolver.java (100%) rename {dict-ws => emf-ws}/tdt4250.emf.servletsupport/src/tdt4250/servletsupport/IRequestQueryExecutor.java (100%) rename {dict-ws => emf-ws}/tdt4250.emf.servletsupport/src/tdt4250/servletsupport/IResourceProvider.java (100%) rename {dict-ws => emf-ws}/tdt4250.emf.servletsupport/src/tdt4250/servletsupport/IResponseSerializer.java (100%) rename {dict-ws => emf-ws}/tdt4250.emf.servletsupport/src/tdt4250/servletsupport/package-info.java (100%) create mode 100644 emf-ws/tdt4250.ra.resource/.classpath create mode 100644 emf-ws/tdt4250.ra.resource/.project create mode 100644 emf-ws/tdt4250.ra.resource/bnd.bnd create mode 100644 emf-ws/tdt4250.ra.resource/launch.bndrun create mode 100644 emf-ws/tdt4250.ra.resource/src/tdt4250/ra/resource/SampleResource.java create mode 100644 emf-ws/tdt4250.ra.resource/src/tdt4250/ra/resource/sample.ra create mode 100644 emf-ws/tdt4250.ra.resource/test/tdt4250/ra/resource/ignore.md diff --git a/dict-ws/README.md b/dict-ws/README.md index 518e2ed..5d00859 100644 --- a/dict-ws/README.md +++ b/dict-ws/README.md @@ -2,6 +2,8 @@ This OSGi project shows how an unmodular (monolithic, one-bundle) OSGi project is transformed into a modular, flexible one, in two steps. All three variants implements a simple web service for searching one or more dictionaries. Logically, all variants consist of a domain part, the dictionary- and search-related classes (among others, a **Dict** interface and its implementations) and the web service (a **Servlet**). Technically, the variants differ in how these parts are distributed among bundles and utilize the component mechanism. +In addition to the dict project, there is an (unrelated) example of how to use an EMF model developed using Eclipse PDE in an OSGi bundle (project) managed by Bnd(tools). The case is a REST API serving an EMF model instance, see [below](#emf-rest-in-osgi). + ## Setup The root project and folder was created using the BndTools' Bnd OSGi Workspace wizard, and each bundle with the Bnd OSGi Project wizard. Which bundle template to use depends on the specific bundle, there are api, component and servlet bundles in this project. diff --git a/dict-ws/cnf/build.bnd b/dict-ws/cnf/build.bnd index 69ecd32..756129c 100644 --- a/dict-ws/cnf/build.bnd +++ b/dict-ws/cnf/build.bnd @@ -58,18 +58,6 @@ pretty = true; \ local = ${build}/release --plugin.EMF: aQute.bnd.repository.p2.provider.P2Repository; \ - name = "EMF 2.19 Release"; \ - url = "http://download.eclipse.org/modeling/emf/emf/builds/release/2.19" - --plugin.Acceleo: aQute.bnd.repository.p2.provider.P2Repository; \ - name = "Acceleo Updates 3.7 Release"; \ - url = "https://download.eclipse.org/acceleo/updates/releases/3.7" - --plugin.Ra: aQute.bnd.repository.p2.provider.P2Repository; \ - name = "Local Ra repository"; \ - url = "file:${build}/../../tdt4250.ra.repository" - -releaserepo: Release -baselinerepo: Release diff --git a/dict-ws/cnf/local/index.xml b/dict-ws/cnf/local/index.xml index 32a4a09..b0e92af 100644 --- a/dict-ws/cnf/local/index.xml +++ b/dict-ws/cnf/local/index.xml @@ -1,2 +1,2 @@ <?xml version='1.0' encoding='UTF-8'?> -<repository xmlns="http://www.osgi.org/xmlns/repository/v1.0.0" name="Local" increment="1568286905496"/> +<repository xmlns="http://www.osgi.org/xmlns/repository/v1.0.0" name="Local" increment="1569449476756"/> diff --git a/dict-ws/cnf/local/index.xml.sha b/dict-ws/cnf/local/index.xml.sha index ca0e3d6..5ac20d7 100644 --- a/dict-ws/cnf/local/index.xml.sha +++ b/dict-ws/cnf/local/index.xml.sha @@ -1 +1 @@ -cedf409ea38a6a13e0a64001bc4efe2bfbd9b1212750671d5aaaea52a658b65a \ No newline at end of file +0f4ab43c8259f8770941c97370a69c94057545349c472b60455a3868043d7c19 \ No newline at end of file diff --git a/dict-ws/cnf/release/index.xml b/dict-ws/cnf/release/index.xml index 4af8098..f818396 100644 --- a/dict-ws/cnf/release/index.xml +++ b/dict-ws/cnf/release/index.xml @@ -1,2 +1,2 @@ <?xml version='1.0' encoding='UTF-8'?> -<repository xmlns="http://www.osgi.org/xmlns/repository/v1.0.0" name="Release" increment="1568286905501"/> +<repository xmlns="http://www.osgi.org/xmlns/repository/v1.0.0" name="Release" increment="1569449476759"/> diff --git a/dict-ws/cnf/release/index.xml.sha b/dict-ws/cnf/release/index.xml.sha index 5d41024..68e315e 100644 --- a/dict-ws/cnf/release/index.xml.sha +++ b/dict-ws/cnf/release/index.xml.sha @@ -1 +1 @@ -ea524b1f831740b9be82930dd5a0fdb50339e83f978e99477b66f7e840fa4fef \ No newline at end of file +5268a56c364964c76e45f65d30b6e34866042e4542a5eae69fe71e863d1dd953 \ No newline at end of file diff --git a/emf-ws/.gitattributes b/emf-ws/.gitattributes new file mode 100644 index 0000000..b21186b --- /dev/null +++ b/emf-ws/.gitattributes @@ -0,0 +1,75 @@ +# Text files with LF eol +*.auth crlf=input +*.awk crlf=input +*.bnd crlf=input +*.bndrun crlf=input +*.c crlf=input ident +*.conf crlf=input +*.cpp crlf=input ident +*.css crlf=input +*.ddf crlf=input +*.ee crlf=input +*.gradle crlf=input +*.groovy crlf=input +*.h crlf=input ident +*.html crlf=input ident +*.java crlf=input ident +*.js crlf=input +*.lib crlf=input +*.md crlf=input +*.MF crlf=input +*.mf crlf=input +*.perm crlf=input +*.php crlf=input +*.pl crlf=input +*.pom crlf=input +*.prefs crlf=input +*.properties crlf=input +*.py crlf=input +*.schema crlf=input +*.SF crlf=input +*.sh crlf=input +*.tcl crlf=input +*.txt crlf=input +*.xml crlf=input +*.xsd crlf=input ident +*.xsl crlf=input +*.xslt crlf=input +*.yml crlf=input +.classpath crlf=input +.project crlf=input +gradlew crlf=input +packageinfo crlf=input +Makefile crlf=input +README crlf=input +LICENSE crlf=input + +# No EOL translation +*.bat -crlf + +# Binary. No EOL translation, no diff +*.ico binary +*.jpeg binary +*.jpg binary +*.png binary +*.crt binary +*.pdf binary +*.dll binary +*.jar binary +*.jnilib binary +*.so binary +*.zip binary +*.doc binary +*.ppt binary +*.xls binary +*.odg binary +*.odp binary +*.ods binary +*.odt binary +*.otg binary +*.otp binary +*.ots binary +*.ott binary +*.key binary +*.numbers binary +*.pages binary diff --git a/emf-ws/.gitignore b/emf-ws/.gitignore new file mode 100644 index 0000000..6f9c31e --- /dev/null +++ b/emf-ws/.gitignore @@ -0,0 +1,4 @@ +.DS_Store +.gradle/ +generated/ +.metadata diff --git a/emf-ws/.gradle-wrapper/gradle-wrapper.jar b/emf-ws/.gradle-wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..457aad0d98108420a977756b7145c93c8910b076 GIT binary patch literal 55741 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	m|_t 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 literal 0 HcmV?d00001 diff --git a/emf-ws/.gradle-wrapper/gradle-wrapper.properties b/emf-ws/.gradle-wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..75b8c7c --- /dev/null +++ b/emf-ws/.gradle-wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-5.0-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/emf-ws/.travis.yml b/emf-ws/.travis.yml new file mode 100644 index 0000000..bd29779 --- /dev/null +++ b/emf-ws/.travis.yml @@ -0,0 +1,10 @@ +sudo: false + +language: java + +jdk: + - oraclejdk8 + +install: ./gradlew --version + +script: ./gradlew --continue diff --git a/emf-ws/README.md b/emf-ws/README.md new file mode 100644 index 0000000..72d38c9 --- /dev/null +++ b/emf-ws/README.md @@ -0,0 +1,84 @@ +# tdt4250.dict project + +This OSGi project shows how an unmodular (monolithic, one-bundle) OSGi project is transformed into a modular, flexible one, in two steps. All three variants implements a simple web service for searching one or more dictionaries. Logically, all variants consist of a domain part, the dictionary- and search-related classes (among others, a **Dict** interface and its implementations) and the web service (a **Servlet**). Technically, the variants differ in how these parts are distributed among bundles and utilize the component mechanism. + +In addition to the dict project, there is an (unrelated) example of how to use an EMF model developed using Eclipse PDE in an OSGi bundle (project) managed by Bnd(tools). The case is a REST API serving an EMF model instance, see [below](#emf-rest-in-osgi). + +## Setup + +The root project and folder was created using the BndTools' Bnd OSGi Workspace wizard, and each bundle with the Bnd OSGi Project wizard. Which bundle template to use depends on the specific bundle, there are api, component and servlet bundles in this project. + +To make your own OSGi project with a similar structure, it's best to start with a fresh Eclipse workspace, create a Bnd OSGi Workspace there and the bundles one by one, making sure to "guess" the right template to use. To be able to glance at this example while working on your own, open the example workspace in a *different* Eclipse installation, since it's difficult to open the same Eclipse one different workspaces simultaneously. + +To run the project, you should open the launch.bndrun file in the servlet bundle, make sure it resolves and use **Run OSGi**. You can try various commands in the gogo shell, e.g. **felix:lb** to see which bundles are in which states or **scr:list** to se the active components, and do a dictionary lookup using **http://localhost:8080/dict?q=master** in a browser. + +## Variant 1 + +The first variant consists of the [tdt4250.dict1.servlet](tdt4250.dict1.servlet/README.md) bundle, which was created using the Servlet Component template. It contains both the logic for dictionary search and the **Servlet**, i.e. it is unmodular. It's also inflexible, since the set of dictionaries is hard-coded into the **Servlet** implementation class. + +### Packages + +- **tdt4250.dict1.core**: The core interfaces and classes that will be used by dictionary users and implementations. There's a **Dict** interface, a **DictSearch** class managing search within a set of **Dict**s and a **DictSearchResult** class for the search result. +- **tdt4250.dict1.no**: An implementation of the **Dict** interface that loads a Norwegian dictionary from a file, with supporting classes. +- **tdt4250.dict1.servlet**: The **Servlet** component (i.e. implementation annotated with **@Component**) implementing a web service for searching a set of dictionaries (currently just the Norwegian one). + +## Variant 2 + +The second variant consists of the [tdt4250.dict2.core](tdt4250.dict2.core/README.md) and [tdt4250.dict2.servlet](tdt4250.dict2.servlet/README.md) bundles. It's somewhat modular, since it's split into at least two bundles. It's also inflexiblie, since the set of dictionaries is still hard-coded into the Servlet implementation class. + +### Bundles and packages + +* **tdt4250.dict2.core** + * **tdt4250.dict2.core**: Same core interfaces and classes of variant 1. + * **tdt4250.dict2.no**: Same **Dict** implementation and supporting classes as in variant 1. +* **tdt4250.dict2.servlet** + * **tdt4250.dict2.servlet**: The same **Servlet** component with hard-coded set of dictionaries (currently just the Norwegian one). + +## Variant 3 + +The third variant consists of the [tdt4250.dict3.api](tdt4250.dict3.api/README.md), [tdt4250.dict3.util](tdt4250.dict3.util/README.md), [tdt4250.dict3.no](tdt4250.dict3.no/README.md), [tdt4250.dict3.servlet](tdt4250.dict3.servlet/README.md) (and [tdt4250.dict3.rest](tdt4250.dict3.rest/README.md) and [tdt4250.dict3.gogo](tdt4250.dict3.gogo/README.md) bundles. It's modular, being split into bundles with minimal dependencies, and flexible, since new bundles can contribute additional dictionaries as components. + +### Bundles and packages + +* **tdt4250.dict3.api** + * **tdt4250.dict3.api**: Same core interfaces and classes of variant 2. +* **tdt4250.dict3.util**: + * **tdt4250.dict3.util**: + * **tdt4250.dict3.util.internal**: +* **tdt4250.dict3.no**: Same **Dict** implementation as in variant 2. + * **tdt4250.dict3.no**: Same **Dict** implementation and supporting classes as in variant 1. +* **tdt4250.dict3.servlet** + * **tdt4250.dict3.servlet**: The same **Servlet** implementation, but now depending on (injected) **Dict** services to make it more flexible. +* **tdt4250.dict3.gogo** + * **tdt4250.dict3.gogo**: Gogo shell commands for managing **Dict** service components. + +## EMF REST in OSGi + +This (unrelated) part of this example shows how to serve an EMF instance in a REST API. There's two neat things with this example: + +* the REST API servlet is generic, so it can serve any EMF model instance, optionally guided by model annotations +* the EMF project bundles are built by Eclipse PDE (outside this OSGi project), and used here + +### Generic EMF REST servlet + +You can think of a REST API as a way of navigating from a set of root objects to some objects of interest and either reading or operating on them. Navigation is done along associations (references in Ecore terminologi) and you can typically filter and select while navigating. The result is typically serialized back as Json. + +If you're doing this in pure Java, you can use a combination of reflection and annotations to do this generically. The **tdt4250.emf.*** bundles provide the same for EMF: generic REST API access to any EMF model instance driven by the model: + +* **tdt4250.emf.servletsupport**: Service interfaces for various aspects of the the REST API, like navigating along associations, applying a final operation and serializing the result. +* **tdt4250.emf.servletsupport.impl**: Generic implementation of the service interfaces +* **tdt4250.emf.servlet.**: The end-point that decodes a request and uses the services. It supports any set of named resources, so the first path segment is the resources to access, and the rest is the REST path and optional query/operation. + +### Making EMF model bundles available for OSGi + +To test the generic REST support, a resource allocation model (for university staff and courses) is used. This corresponding EMF model project (in general PDE bundle/plugin projects) is outside and in the same folder as the OSGi workspace. The layout is as follows + +* **examples** - the git repo folder + * **dict-ws** - the OSGi workspace + * **cnf** - OSGi workspace configuration project + * **tdt4250.emf.*** - bundle project providing REST servlet + * **tdt4250.ra.resource - bundle providing a sample EMF resource (instance of ra model) to serve + * tdt4250.ra - EMF resource allocation model project + * tdt4250.ra.feature - features to publish in p2 repository + * tdt4250.ra.repository - p2 repository project + diff --git a/emf-ws/build.gradle b/emf-ws/build.gradle new file mode 100644 index 0000000..23fe818 --- /dev/null +++ b/emf-ws/build.gradle @@ -0,0 +1,4 @@ +// Available to customize the build +wrapper { + jarFile = rootProject.file('.gradle-wrapper/gradle-wrapper.jar') +} diff --git a/emf-ws/cnf/.gitignore b/emf-ws/cnf/.gitignore new file mode 100644 index 0000000..0a2101f --- /dev/null +++ b/emf-ws/cnf/.gitignore @@ -0,0 +1 @@ +/cache/ diff --git a/emf-ws/cnf/.project b/emf-ws/cnf/.project new file mode 100644 index 0000000..1397bbe --- /dev/null +++ b/emf-ws/cnf/.project @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>cnf</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + </buildSpec> + <natures> + </natures> +</projectDescription> diff --git a/emf-ws/cnf/build.bnd b/emf-ws/cnf/build.bnd new file mode 100644 index 0000000..69ecd32 --- /dev/null +++ b/emf-ws/cnf/build.bnd @@ -0,0 +1,88 @@ +# Configure Repositories +-plugin.1.R7.API: \ + aQute.bnd.repository.maven.pom.provider.BndPomRepository; \ + snapshotUrls=https://oss.sonatype.org/content/repositories/osgi/; \ + releaseUrls=https://repo.maven.apache.org/maven2/; \ + revision=org.osgi.enroute:osgi-api:7.0.0; \ + readOnly=true; \ + name="OSGi R7 API" +-plugin.2.Enterprise.API: \ + aQute.bnd.repository.maven.pom.provider.BndPomRepository; \ + snapshotUrls=https://oss.sonatype.org/content/repositories/osgi/; \ + releaseUrls=https://repo.maven.apache.org/maven2/; \ + revision=org.osgi.enroute:enterprise-api:7.0.0; \ + readOnly=true; \ + name="Enterprise Java APIs" +-plugin.3.R7.Impl: \ + aQute.bnd.repository.maven.pom.provider.BndPomRepository; \ + snapshotUrls=https://oss.sonatype.org/content/repositories/osgi/; \ + releaseUrls=https://repo.maven.apache.org/maven2/; \ + revision=org.osgi.enroute:impl-index:7.0.0; \ + readOnly=true; \ + name="OSGi R7 Reference Implementations" +-plugin.4.Test: \ + aQute.bnd.repository.maven.pom.provider.BndPomRepository; \ + snapshotUrls=https://oss.sonatype.org/content/repositories/osgi/; \ + releaseUrls=https://repo.maven.apache.org/maven2/; \ + revision=org.osgi.enroute:test-bundles:7.0.0; \ + readOnly=true; \ + name="Testing Bundles" +-plugin.5.Debug: \ + aQute.bnd.repository.maven.pom.provider.BndPomRepository; \ + snapshotUrls=https://oss.sonatype.org/content/repositories/osgi/; \ + releaseUrls=https://repo.maven.apache.org/maven2/; \ + revision=org.osgi.enroute:debug-bundles:7.0.0; \ + readOnly=true; \ + name="Debug Bundles" +-plugin.6.Central: \ + aQute.bnd.repository.maven.provider.MavenBndRepository; \ + releaseUrl=https://repo.maven.apache.org/maven2/; \ + index=${.}/central.maven; \ + readOnly=true; \ + name="Maven Central" +-plugin.7.Local: \ + aQute.bnd.deployer.repository.LocalIndexedRepo; \ + name = Local; \ + pretty = true; \ + local = ${build}/local + +-plugin.8.Templates: \ + aQute.bnd.deployer.repository.LocalIndexedRepo; \ + name = Templates; \ + pretty = true; \ + local = ${build}/templates + +-plugin.9.Release: \ + aQute.bnd.deployer.repository.LocalIndexedRepo; \ + name = Release; \ + pretty = true; \ + local = ${build}/release + +-plugin.EMF: aQute.bnd.repository.p2.provider.P2Repository; \ + name = "EMF 2.19 Release"; \ + url = "http://download.eclipse.org/modeling/emf/emf/builds/release/2.19" + +-plugin.Acceleo: aQute.bnd.repository.p2.provider.P2Repository; \ + name = "Acceleo Updates 3.7 Release"; \ + url = "https://download.eclipse.org/acceleo/updates/releases/3.7" + +-plugin.Ra: aQute.bnd.repository.p2.provider.P2Repository; \ + name = "Local Ra repository"; \ + url = "file:${build}/../../tdt4250.ra.repository" + +-releaserepo: Release +-baselinerepo: Release + +# Always use contracts +-contract: * + +# Set Git revision information in the manifests of built bundles +Git-Descriptor: ${system-allow-fail;git describe --dirty --always} +Git-SHA: ${system-allow-fail;git rev-list -1 HEAD} + +# JUnit +junit: org.apache.servicemix.bundles.junit; version=4.12 +mockito: org.mockito.mockito-core; version=2.13.0 +mockito-deps: org.objenesis; version=2.6.0,\ + net.bytebuddy.byte-buddy; version=1.7.9,\ + net.bytebuddy.byte-buddy-agent; version=1.7.9 diff --git a/emf-ws/cnf/central.maven b/emf-ws/cnf/central.maven new file mode 100644 index 0000000..18d7d96 --- /dev/null +++ b/emf-ws/cnf/central.maven @@ -0,0 +1,9 @@ +# List repository contents using GAV coordinates + +com.fasterxml.jackson.core:jackson-core:2.9.8 +com.fasterxml.jackson.core:jackson-annotations:2.9.8 +com.fasterxml.jackson.core:jackson-databind:2.9.8 +#com.fasterxml.jackson.jaxrs:jackson-jaxrs-base:2.9.8 +#com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:2.9.8 +#com.fasterxml.jackson.module:jackson-module-jaxb-annotations:2.9.8 +#org.apache.aries.jax.rs:org.apache.aries.jax.rs.jackson:1.0.2 diff --git a/emf-ws/cnf/local/index.xml b/emf-ws/cnf/local/index.xml new file mode 100644 index 0000000..b0e92af --- /dev/null +++ b/emf-ws/cnf/local/index.xml @@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='UTF-8'?> +<repository xmlns="http://www.osgi.org/xmlns/repository/v1.0.0" name="Local" increment="1569449476756"/> diff --git a/emf-ws/cnf/local/index.xml.sha b/emf-ws/cnf/local/index.xml.sha new file mode 100644 index 0000000..5ac20d7 --- /dev/null +++ b/emf-ws/cnf/local/index.xml.sha @@ -0,0 +1 @@ +0f4ab43c8259f8770941c97370a69c94057545349c472b60455a3868043d7c19 \ No newline at end of file diff --git a/emf-ws/cnf/release/index.xml b/emf-ws/cnf/release/index.xml new file mode 100644 index 0000000..f818396 --- /dev/null +++ b/emf-ws/cnf/release/index.xml @@ -0,0 +1,2 @@ +<?xml version='1.0' encoding='UTF-8'?> +<repository xmlns="http://www.osgi.org/xmlns/repository/v1.0.0" name="Release" increment="1569449476759"/> diff --git a/emf-ws/cnf/release/index.xml.sha b/emf-ws/cnf/release/index.xml.sha new file mode 100644 index 0000000..68e315e --- /dev/null +++ b/emf-ws/cnf/release/index.xml.sha @@ -0,0 +1 @@ +5268a56c364964c76e45f65d30b6e34866042e4542a5eae69fe71e863d1dd953 \ No newline at end of file diff --git a/emf-ws/cnf/templates/index.xml b/emf-ws/cnf/templates/index.xml new file mode 100644 index 0000000..fa850a5 --- /dev/null +++ b/emf-ws/cnf/templates/index.xml @@ -0,0 +1,96 @@ +<?xml version='1.0' encoding='UTF-8'?> +<repository xmlns="http://www.osgi.org/xmlns/repository/v1.0.0" name="Templates" increment="1567521105177"> + <resource> + <capability namespace="osgi.identity"> + <attribute name="osgi.identity" value="org.bndtools.templates.osgi"/> + <attribute name="type" value="osgi.bundle"/> + <attribute name="version" value="7.0.0.201810191116" type="Version"/> + </capability> + <capability namespace="osgi.wiring.bundle"> + <attribute name="bundle-version" value="7.0.0.201810191116" type="Version"/> + <attribute name="osgi.wiring.bundle" value="org.bndtools.templates.osgi"/> + </capability> + <capability namespace="osgi.wiring.host"> + <attribute name="bundle-version" value="7.0.0.201810191116" type="Version"/> + <attribute name="osgi.wiring.host" value="org.bndtools.templates.osgi"/> + </capability> + <capability namespace="org.bndtools.template"> + <attribute name="help" value="comp-help.xml"/> + <attribute name="name" value="Component Development"/> + <attribute name="icon" value="data:image/gif;base64,R0lGODlhEAAQAPYAAElJSU5OTlFRUVNTU1hYWFtbW2FhYWJiYmRkZGlpaWtra21tbW5ubm9vb3l5eYCAgIGBgYKCgoODg4WFhYeHh4mJiYyMjI+Pj5ycnJ6enqCgoKGhoaOjo6Wlpaampqenp6ioqKqqqqysrLCwsLGxsbKysrW1tbe3t7m5ubq6ury8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9HR0dLS0tTU1NXV1dbW1tjY2NnZ2dvb29zc3N3d3d7e3uLi4uTk5OXl5efn5+np6e3t7QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAE8AIf8LSW1hZ2VNYWdpY2sHZ2FtbWE9MQAsAAAAABAAEAAAB6CAT4KDTy8vhIiEL05MI4mCPjw8hUxGjiIeHoRGTkYvKj4+IyI8TCqKTD5GRqGsPC8OipGfGB6GnxWCry9GPCoRghWGPBURES+pkpqDIp88RgwqqS88joO2Iy8+CR4XHq88GIIXnyoJBAGCzdQvIiIq8B4MhCI+1JKSzvODKkYexp8YMPDgI9agCA0SPInwSmGBAAAeLVQxooBERAUIPAoEADs="/> + <attribute name="ranking" value="1001.0" type="Double"/> + <attribute name="org.bndtools.template" value="project"/> + <attribute name="category" value="OSGi Release 7 Templates (with OSGi enRoute repositories)"/> + <attribute name="dir" value="templates/ds"/> + </capability> + <capability namespace="org.bndtools.template"> + <attribute name="help" value="api-help.xml"/> + <attribute name="name" value="API Project"/> + <attribute name="icon" value="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABZVBMVEUAAABLh7sxW5A2ZJkzX5Q2ZZpMi8FQkcdHgrcxW5A5aZ5SlMpfrOJdqN4xW5BbpNpVmtBDe7FfrOJOjsRfrOJfrOJAdaoxW5BfrOJfrOJSlMoxW5A8b6Q8b6RfrOJVmtAxW5A5aZ5Yn9VbpNoxW5BdqN5dqN45aZ5frOJSlMpfrOIxW5BAdapDe7H////A3PjB3fr6/P/C3Pn8/v/3+/6/3Prx9/7u9f3j8P3I4fvD3fq92/nm8P3c6/3g7fzR5PvN4/vL4vvU5/rF3vnz+f3Y6v3V6fza6vnH3/fB2e+my+pqseVsn+Gju9dglNdYj9SDocRXhrY9ZZjr8f3q8/vQ5frB3Pq11fmtz/eix/fi7fXi6vXY5/XA2vTT3+6y0O3N3OyaxuuMwOqBvOp3t+jD1OeGruS6zuKzxt+HuN97pdlvnthqm9eMrtVxndKVr85aj8tXlMhTjcFShrltkLhfgq1PdKOdhMrdAAAALnRSTlMA/NqKaxQQB/v69vHw7evq5eTj2s/MysnGu7u2s6uopKOekoSEbV1XS0U2NCge2PG++QAAAOpJREFUGNMVzNNiA1EUheETtKlt2z0eT0ZJG7O2bT5/9vx367tYCKG1kZvbQqGjb2BwdGolAbB4jaH0bibI5juXAOavsG7vaKpkWJ51A8zl2fZW0tF1HRfZE8D0hep7bgAo3nM9AGM5h/CU4Xt74rN9FaD/1LUshdKUwb6aERTRspayb4bwHUIiIjkhhFLTT7cgaPOHKYRwzs3guDeEjZqgIFQxk5dDsJsm3+yjwwOLG572MAGw3FZ7fnktlyuVoluaBYhVMSSkqt5nPmIA8d/S4935iSaFY1fj4cfCzPhwtKu1Xv//i64j1ABv2TB0qN71PQAAAABJRU5ErkJggg=="/> + <attribute name="ranking" value="1000.0" type="Double"/> + <attribute name="org.bndtools.template" value="project"/> + <attribute name="category" value="OSGi Release 7 Templates (with OSGi enRoute repositories)"/> + <attribute name="dir" value="templates/api"/> + </capability> + <capability namespace="org.bndtools.template"> + <attribute name="help" value="integration-test-help.xml"/> + <attribute name="name" value="Integration Testing"/> + <attribute name="icon" value="data:image/gif;base64,R0lGODlhEAAQAMQAAOCwsuG6u9hCT9lLV9pfattqc9x0fNx+hd2IjiGETzmPYSyKV1Gbc12hfGqnhXatjo65oJu/qafFsrPKu7/QxOLExP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAABYALAAAAAAQABAAAAVMoCWOZGmeaHpGTMs8qsgkUyzTtjVPRV8hBYRpZxEILYQT0ShKihqQW42JFEUSCtEiIaI6LQsGBZKAIQUWwIEEYTgko4BhcAjk7vhTCAA7"/> + <attribute name="ranking" value="999.0" type="Double"/> + <attribute name="org.bndtools.template" value="project"/> + <attribute name="category" value="OSGi Release 7 Templates (with OSGi enRoute repositories)"/> + <attribute name="dir" value="templates/integration-test"/> + </capability> + <capability namespace="org.bndtools.template"> + <attribute name="help" value="servlet-help.xml"/> + <attribute name="name" value="Servlet Component"/> + <attribute name="icon" value="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADYUlEQVR4nGWTW2hbBQCGv3PJOT1JeslJejeu6Q1bW1ulY5vZppg6n5RhH9SBA4dziChT5nxpEUEG7kkUcQ6kE5lUkY2+iA/rQFRscU666TrtNemaNGma2CTN5STnHB/mYOr/9D98/A8f/AL/Scf+95tcnu4XfLockpyFdmwbM6MuJZOlqXx6eXxh5vX1u3nhTmnuPybUdx482dC59fbBJx/Tvop/wVrqAnWagWWq1OaHaIs8Xfh5OvpOOjp1Ojp/xgaQAJr6jgo7+kbG3bumT8z7LjnWrBUcagsuxUutsoAsmWy5dlIVfMYR3KENr80rbZKsT2bTv9we6Np36qS684cTG57LPLtnnO/+OIeMie5uJ7a1jFt/C8n7HCt5iZju4UC7Nhi+Iec3bl34UWoPvtfY1O+4WOz80qE7bWLpGAVjDkmssL/nTbz6U5jOAUqmRJUZwcj/iRJow5/MBLO57k/l6vr+w4V7J52687YO2/4efx3EMhbFfAS3a4Bi2aZoCZSMErNzb2DEVfTAgFPTBg+LvjolFJPmsGwbgGIFmpwjjIYmCHgHcEugieCS4K/4Z9zjqSdfVohr1/DWKSHZ7ZQD+wKHuLZ+njp1kBpF5/nB18iaMooADgFkATSxQq4QQRayeDwH8GnNaB41IFoVy95730sEO0aJb8d5sGU3hlUGbCzAssEGoqtnaa1ewF+bx21dZDH6EYZVtMVYPL+kCSYN9Y/zyiPn+HZhktFLIc7OHCdnZClYULLARPzHEWgOAV2pIbNhLkke/0jj/T2+Jza0KkRRYTkxgc+1BUKU2VvTQBVltRvbOcBm0c96VsAjr2Cv9ZP6yXtG0qo752XT83LrQ81qvCwhWSap3DSqLKBKKdIlHdsdJFWSyMpdyKJMJnGZ6pnhbGJx8YgYmT2V/PVqbMy+ukqlsE2N51GyRTAtm0Shi9rGF0mXIGdC0bQRSwa+SIjErDQWDp9OSgAb4a9nNlN7m4danUMRYwq7fIWk0UNzx8ckKjXkKhalfI5eJc/ucJkbE4VPrl8/OvavMwH07vr81ZZe6125L1yz5+EjLBRUKjY0KqCsbrH0zVzmtyvR0Zs3j334vzfeib/zuNdd/cAh1SEPNzY427Fs1mO5pVLRmNrO/X5+dfWDzbv5vwErUW66xLs5NQAAAABJRU5ErkJggg=="/> + <attribute name="ranking" value="998.0" type="Double"/> + <attribute name="org.bndtools.template" value="project"/> + <attribute name="category" value="OSGi Release 7 Templates (with OSGi enRoute repositories)"/> + <attribute name="dir" value="templates/servlet"/> + </capability> + <capability namespace="org.bndtools.template"> + <attribute name="help" value="jax-rs-help.xml"/> + <attribute name="name" value="JAX-RS Resource Component"/> + <attribute name="icon" value="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAeFBMVEUAAAC+uQEAAAANDQAAAAAAAADs6ADl4gDj3wC4tQHZ1gDIxQfAvQCzsACbmgayrQKWlACOjAB9ewNWVAU7OgHm4wDf3QC4twOopgCgngCCgABkYgBtawBYVwAAAADU+3n/+wD49ADOygDl4AD8+ADu6gDf2wDRzQDVgRdOAAAAH3RSTlMAwQ0cCAT89/Hf38K1q6CcdF1NNCr36aiPgmpoQSwUn3NPfwAAAHhJREFUGNNlz2kPgjAYA+CKB6LiibcC4/z//5A2kHcQ+mXps6TZgGwSdjDH83Ktk7WHhdu9RR7y3D1eCcmAqban24qgAYEojAkaiHqo9xcBrwvVzeEawEMZfVPAoGwbF8b/ETgNBAPYAAzuzx+rgR4EePgkrAaz73cWXBDb6aht4AAAAABJRU5ErkJggg=="/> + <attribute name="ranking" value="997.0" type="Double"/> + <attribute name="org.bndtools.template" value="project"/> + <attribute name="category" value="OSGi Release 7 Templates (with OSGi enRoute repositories)"/> + <attribute name="dir" value="templates/jax-rs"/> + </capability> + <capability namespace="org.bndtools.template"> + <attribute name="help" value="jpa-dao-help.xml"/> + <attribute name="name" value="JPA Data Access Component"/> + <attribute name="icon" value="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAEYSURBVBgZBcHPio5hGAfg6/2+R980k6wmJgsJ5U/ZOAqbSc2GnXOwUg7BESgLUeIQ1GSjLFnMwsKGGg1qxJRmPM97/1zXFAAAAEADdlfZzr26miup2svnelq7d2aYgt3rebl585wN6+K3I1/9fJe7O/uIePP2SypJkiRJ0vMhr55FLCA3zgIAOK9uQ4MS361ZOSX+OrTvkgINSjS/HIvhjxNNFGgQsbSmabohKDNoUGLohsls6BaiQIMSs2FYmnXdUsygQYmumy3Nhi6igwalDEOJEjPKP7CA2aFNK8Bkyy3fdNCg7r9/fW3jgpVJbDmy5+PB2IYp4MXFelQ7izPrhkPHB+P5/PjhD5gCgCenx+VR/dODEwD+A3T7nqbxwf1HAAAAAElFTkSuQmCC"/> + <attribute name="ranking" value="996.0" type="Double"/> + <attribute name="org.bndtools.template" value="project"/> + <attribute name="category" value="OSGi Release 7 Templates (with OSGi enRoute repositories)"/> + <attribute name="dir" value="templates/jpa-dao"/> + </capability> + <capability namespace="org.bndtools.template"> + <attribute name="help" value="app-help.xml"/> + <attribute name="name" value="Application Project"/> + <attribute name="icon" value="data:image/gif;base64,R0lGODlhEAAQANUAAACPKmGAqW6KsHeSsnmVuICXs4GYsYScu4ylxJipuaGzy6i81rCKIbjBwbqXJr3M2L7O48TQ38bX6czb7c64b9Df8NHf7tLg7NPh8tfh59vm893o9d7k7eLn3uLr9uvx9+3y+O7r2PL1+PPt1Pf4+fvdg/vhkPzno/ztufzyz/754v797/7+/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkKAC0ALAAAAAAQABAAAAaBwJZwSCwWKY6k0kExthwrVQp1MpUcTgpjy2U0jRyCRsQSaQgcYwTh+YhIgI8HESkqFh4QiQUAeBYKRQcQeW99ABAHRQITG20ghwACRQEYGI4ekQCLEpYaGpqbQwcPFZYYmnYNHRkXFpGBRBEJKSMjIYcJdUURAwUGBn0Du05DokRBADs="/> + <attribute name="ranking" value="1000.0" type="Double"/> + <attribute name="org.bndtools.template" value="project"/> + <attribute name="category" value="OSGi Release 7 Templates (with OSGi enRoute repositories)"/> + <attribute name="dir" value="templates/app"/> + </capability> + <capability namespace="org.bndtools.template"> + <attribute name="help" value="templates/launch/felix-gogo.xml"/> + <attribute name="name" value="Felix 4+"/> + <attribute name="icon" value="data:image/gif;base64,R0lGODlhEAAQAOYAAAAAAP///+EdiTcIsd/AXIyltvCtwoUNb8VoTy4FVW07zOh0lH9/f4oHstbg4tvQmSItMbYDjuc5YMWfuD8FgXYO2OIMY8WkUuheZNyCucnJyWUGrfXt1oYemFkDaemWoaysrOtVgiMGeFYGks0CfMkferAdktxBd+fdraAFo0wKwffZ5e7Fxfzu8e64rt7Vg7oHdOglXuZodUQGbYIMw+AZdc+6VNeauePq6uWJltkCbpIEmfPc1nQGqGwJzeuhqygGa+RBa+hHevf5+UcKiuAyaMcEiOQdaukUXd0XYiMFUbwLiJ8HmH2GieLRjHgIx+ywudgMbvfi4rQHlr8Di1AGl+qDlokKq/76+/r18eNAdqQEnI2rs9MDed8EbGcHs+iXp/Lx2Pnv7ScETvfe5uYLZNsFcKQFoNni47sIiv37+MoFh74EiP79/Pv7+/Pf1v34+sADiP////fa5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAAHQALAAAAAAQABAAAAeRgA8vKC10hoeIhk4XNic/YomJYQQIB2lFH1mRh29BMB47SzEsm4YGJQ0UVUZIOXClNyZUIzNTZVpSm3JWUWcbCUw6GDybbWAWbD1jV2YSHKVQSRFfSjRrMmqlC14pKkAVAi6lWEIkTwNEXSGldGRHcT4iHRM47HM1WwoQXGjsdCsZCjQB4c/QEAduGBREpIFOIAA7"/> + <attribute name="ranking" value="1001.0" type="Double"/> + <attribute name="org.bndtools.template" value="bndrun"/> + <attribute name="category" value="OSGi Release 7 Templates (with OSGi enRoute repositories)"/> + <attribute name="dir" value="templates/launch/felix-gogo"/> + </capability> + <capability namespace="osgi.content"> + <attribute name="size" value="25577" type="Long"/> + <attribute name="url" value="org.bndtools.templates.osgi/org.bndtools.templates.osgi-7.0.0.jar"/> + <attribute name="mime" value="application/vnd.osgi.bundle"/> + <attribute name="osgi.content" value="274A856A7D66B1B56D976F1619B5DE2253635305EC8D1BA271389F8AB5623495"/> + </capability> + </resource> +</repository> diff --git a/emf-ws/cnf/templates/index.xml.sha b/emf-ws/cnf/templates/index.xml.sha new file mode 100644 index 0000000..57ac548 --- /dev/null +++ b/emf-ws/cnf/templates/index.xml.sha @@ -0,0 +1 @@ +908735368c6088de40477c5e8f80d3ebeeb0c818857491f7f764a78c518da49c \ No newline at end of file diff --git a/emf-ws/gradle.properties b/emf-ws/gradle.properties new file mode 100644 index 0000000..06a3212 --- /dev/null +++ b/emf-ws/gradle.properties @@ -0,0 +1,3 @@ +bnd_version=4.2.0-SNAPSHOT + +bnd_repourl=https://oss.sonatype.org/content/repositories/snapshots diff --git a/emf-ws/gradlew b/emf-ws/gradlew new file mode 100644 index 0000000..72c3264 --- /dev/null +++ b/emf-ws/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/.gradle-wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/emf-ws/gradlew.bat b/emf-ws/gradlew.bat new file mode 100644 index 0000000..9ffb627 --- /dev/null +++ b/emf-ws/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\.gradle-wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/emf-ws/settings.gradle b/emf-ws/settings.gradle new file mode 100644 index 0000000..a2a7c66 --- /dev/null +++ b/emf-ws/settings.gradle @@ -0,0 +1,14 @@ +buildscript { + repositories { + maven { + url uri(bnd_repourl) + } + mavenCentral() + } + dependencies { classpath "biz.aQute.bnd:biz.aQute.bnd.gradle:${bnd_version}" } + /* Add bnd gradle plugin to buildscript classpath of rootProject */ + def bndPlugin = files(configurations.classpath.files) + gradle.rootProject { buildscript { dependencies { classpath bndPlugin } } } +} + +apply plugin: 'biz.aQute.bnd.workspace' diff --git a/dict-ws/tdt4250.emf.servlet/.classpath b/emf-ws/tdt4250.emf.servlet/.classpath similarity index 100% rename from dict-ws/tdt4250.emf.servlet/.classpath rename to emf-ws/tdt4250.emf.servlet/.classpath diff --git a/dict-ws/tdt4250.emf.servlet/.project b/emf-ws/tdt4250.emf.servlet/.project similarity index 100% rename from dict-ws/tdt4250.emf.servlet/.project rename to emf-ws/tdt4250.emf.servlet/.project diff --git a/dict-ws/tdt4250.emf.servlet/bnd.bnd b/emf-ws/tdt4250.emf.servlet/bnd.bnd similarity index 100% rename from dict-ws/tdt4250.emf.servlet/bnd.bnd rename to emf-ws/tdt4250.emf.servlet/bnd.bnd diff --git a/dict-ws/tdt4250.emf.servlet/launch.bndrun b/emf-ws/tdt4250.emf.servlet/launch.bndrun similarity index 100% rename from dict-ws/tdt4250.emf.servlet/launch.bndrun rename to emf-ws/tdt4250.emf.servlet/launch.bndrun diff --git a/dict-ws/tdt4250.emf.servlet/src/tdt4250/ra/servlet/ResourceServlet.java b/emf-ws/tdt4250.emf.servlet/src/tdt4250/ra/servlet/ResourceServlet.java similarity index 100% rename from dict-ws/tdt4250.emf.servlet/src/tdt4250/ra/servlet/ResourceServlet.java rename to emf-ws/tdt4250.emf.servlet/src/tdt4250/ra/servlet/ResourceServlet.java diff --git a/dict-ws/tdt4250.emf.servlet/test/tdt4250/ra/servlet/ignore.md b/emf-ws/tdt4250.emf.servlet/test/tdt4250/ra/servlet/ignore.md similarity index 100% rename from dict-ws/tdt4250.emf.servlet/test/tdt4250/ra/servlet/ignore.md rename to emf-ws/tdt4250.emf.servlet/test/tdt4250/ra/servlet/ignore.md diff --git a/dict-ws/tdt4250.emf.servletsupport.impl/.classpath b/emf-ws/tdt4250.emf.servletsupport.impl/.classpath similarity index 100% rename from dict-ws/tdt4250.emf.servletsupport.impl/.classpath rename to emf-ws/tdt4250.emf.servletsupport.impl/.classpath diff --git a/dict-ws/tdt4250.emf.servletsupport.impl/.project b/emf-ws/tdt4250.emf.servletsupport.impl/.project similarity index 100% rename from dict-ws/tdt4250.emf.servletsupport.impl/.project rename to emf-ws/tdt4250.emf.servletsupport.impl/.project diff --git a/dict-ws/tdt4250.emf.servletsupport.impl/bnd.bnd b/emf-ws/tdt4250.emf.servletsupport.impl/bnd.bnd similarity index 100% rename from dict-ws/tdt4250.emf.servletsupport.impl/bnd.bnd rename to emf-ws/tdt4250.emf.servletsupport.impl/bnd.bnd diff --git a/dict-ws/tdt4250.emf.servletsupport.impl/launch.bndrun b/emf-ws/tdt4250.emf.servletsupport.impl/launch.bndrun similarity index 100% rename from dict-ws/tdt4250.emf.servletsupport.impl/launch.bndrun rename to emf-ws/tdt4250.emf.servletsupport.impl/launch.bndrun diff --git a/dict-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/AnnotationUtil.java b/emf-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/AnnotationUtil.java similarity index 100% rename from dict-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/AnnotationUtil.java rename to emf-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/AnnotationUtil.java diff --git a/dict-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/JsonEAttributeSerializer.java b/emf-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/JsonEAttributeSerializer.java similarity index 100% rename from dict-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/JsonEAttributeSerializer.java rename to emf-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/JsonEAttributeSerializer.java diff --git a/dict-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/JsonEObjectSerializer.java b/emf-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/JsonEObjectSerializer.java similarity index 100% rename from dict-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/JsonEObjectSerializer.java rename to emf-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/JsonEObjectSerializer.java diff --git a/dict-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/JsonSerializer.java b/emf-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/JsonSerializer.java similarity index 100% rename from dict-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/JsonSerializer.java rename to emf-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/JsonSerializer.java diff --git a/dict-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/NameReferenceResolver.java b/emf-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/NameReferenceResolver.java similarity index 100% rename from dict-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/NameReferenceResolver.java rename to emf-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/NameReferenceResolver.java diff --git a/dict-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/RequestHandler.java b/emf-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/RequestHandler.java similarity index 100% rename from dict-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/RequestHandler.java rename to emf-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/RequestHandler.java diff --git a/dict-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/RequestSupport.java b/emf-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/RequestSupport.java similarity index 100% rename from dict-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/RequestSupport.java rename to emf-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/RequestSupport.java diff --git a/dict-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/ResourceProvider.java b/emf-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/ResourceProvider.java similarity index 100% rename from dict-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/ResourceProvider.java rename to emf-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/ResourceProvider.java diff --git a/dict-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/package-info.java b/emf-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/package-info.java similarity index 100% rename from dict-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/package-info.java rename to emf-ws/tdt4250.emf.servletsupport.impl/src/tdt4250/servletsupport/impl/package-info.java diff --git a/dict-ws/tdt4250.emf.servletsupport.impl/test/tdt4250/servletsupport/impl/ignore.md b/emf-ws/tdt4250.emf.servletsupport.impl/test/tdt4250/servletsupport/impl/ignore.md similarity index 100% rename from dict-ws/tdt4250.emf.servletsupport.impl/test/tdt4250/servletsupport/impl/ignore.md rename to emf-ws/tdt4250.emf.servletsupport.impl/test/tdt4250/servletsupport/impl/ignore.md diff --git a/dict-ws/tdt4250.emf.servletsupport/.classpath b/emf-ws/tdt4250.emf.servletsupport/.classpath similarity index 100% rename from dict-ws/tdt4250.emf.servletsupport/.classpath rename to emf-ws/tdt4250.emf.servletsupport/.classpath diff --git a/dict-ws/tdt4250.emf.servletsupport/.project b/emf-ws/tdt4250.emf.servletsupport/.project similarity index 100% rename from dict-ws/tdt4250.emf.servletsupport/.project rename to emf-ws/tdt4250.emf.servletsupport/.project diff --git a/dict-ws/tdt4250.emf.servletsupport/bnd.bnd b/emf-ws/tdt4250.emf.servletsupport/bnd.bnd similarity index 100% rename from dict-ws/tdt4250.emf.servletsupport/bnd.bnd rename to emf-ws/tdt4250.emf.servletsupport/bnd.bnd diff --git a/dict-ws/tdt4250.emf.servletsupport/src/tdt4250/servletsupport/IPostHandler.java b/emf-ws/tdt4250.emf.servletsupport/src/tdt4250/servletsupport/IPostHandler.java similarity index 100% rename from dict-ws/tdt4250.emf.servletsupport/src/tdt4250/servletsupport/IPostHandler.java rename to emf-ws/tdt4250.emf.servletsupport/src/tdt4250/servletsupport/IPostHandler.java diff --git a/dict-ws/tdt4250.emf.servletsupport/src/tdt4250/servletsupport/IReferenceResolver.java b/emf-ws/tdt4250.emf.servletsupport/src/tdt4250/servletsupport/IReferenceResolver.java similarity index 100% rename from dict-ws/tdt4250.emf.servletsupport/src/tdt4250/servletsupport/IReferenceResolver.java rename to emf-ws/tdt4250.emf.servletsupport/src/tdt4250/servletsupport/IReferenceResolver.java diff --git a/dict-ws/tdt4250.emf.servletsupport/src/tdt4250/servletsupport/IRequestPathResolver.java b/emf-ws/tdt4250.emf.servletsupport/src/tdt4250/servletsupport/IRequestPathResolver.java similarity index 100% rename from dict-ws/tdt4250.emf.servletsupport/src/tdt4250/servletsupport/IRequestPathResolver.java rename to emf-ws/tdt4250.emf.servletsupport/src/tdt4250/servletsupport/IRequestPathResolver.java diff --git a/dict-ws/tdt4250.emf.servletsupport/src/tdt4250/servletsupport/IRequestQueryExecutor.java b/emf-ws/tdt4250.emf.servletsupport/src/tdt4250/servletsupport/IRequestQueryExecutor.java similarity index 100% rename from dict-ws/tdt4250.emf.servletsupport/src/tdt4250/servletsupport/IRequestQueryExecutor.java rename to emf-ws/tdt4250.emf.servletsupport/src/tdt4250/servletsupport/IRequestQueryExecutor.java diff --git a/dict-ws/tdt4250.emf.servletsupport/src/tdt4250/servletsupport/IResourceProvider.java b/emf-ws/tdt4250.emf.servletsupport/src/tdt4250/servletsupport/IResourceProvider.java similarity index 100% rename from dict-ws/tdt4250.emf.servletsupport/src/tdt4250/servletsupport/IResourceProvider.java rename to emf-ws/tdt4250.emf.servletsupport/src/tdt4250/servletsupport/IResourceProvider.java diff --git a/dict-ws/tdt4250.emf.servletsupport/src/tdt4250/servletsupport/IResponseSerializer.java b/emf-ws/tdt4250.emf.servletsupport/src/tdt4250/servletsupport/IResponseSerializer.java similarity index 100% rename from dict-ws/tdt4250.emf.servletsupport/src/tdt4250/servletsupport/IResponseSerializer.java rename to emf-ws/tdt4250.emf.servletsupport/src/tdt4250/servletsupport/IResponseSerializer.java diff --git a/dict-ws/tdt4250.emf.servletsupport/src/tdt4250/servletsupport/package-info.java b/emf-ws/tdt4250.emf.servletsupport/src/tdt4250/servletsupport/package-info.java similarity index 100% rename from dict-ws/tdt4250.emf.servletsupport/src/tdt4250/servletsupport/package-info.java rename to emf-ws/tdt4250.emf.servletsupport/src/tdt4250/servletsupport/package-info.java diff --git a/emf-ws/tdt4250.ra.resource/.classpath b/emf-ws/tdt4250.ra.resource/.classpath new file mode 100644 index 0000000..3ebd512 --- /dev/null +++ b/emf-ws/tdt4250.ra.resource/.classpath @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8"?> +<classpath> + <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/> + <classpathentry kind="con" path="aQute.bnd.classpath.container"/> + <classpathentry kind="src" output="bin" path="src"/> + <classpathentry kind="src" output="bin_test" path="test"> + <attributes> + <attribute name="test" value="true"/> + </attributes> + </classpathentry> + <classpathentry kind="output" path="bin"/> +</classpath> diff --git a/emf-ws/tdt4250.ra.resource/.project b/emf-ws/tdt4250.ra.resource/.project new file mode 100644 index 0000000..9a8cd79 --- /dev/null +++ b/emf-ws/tdt4250.ra.resource/.project @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>tdt4250.ra.resource</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.jdt.core.javabuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>bndtools.core.bndbuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.jdt.core.javanature</nature> + <nature>bndtools.core.bndnature</nature> + </natures> +</projectDescription> diff --git a/emf-ws/tdt4250.ra.resource/bnd.bnd b/emf-ws/tdt4250.ra.resource/bnd.bnd new file mode 100644 index 0000000..4cc24cb --- /dev/null +++ b/emf-ws/tdt4250.ra.resource/bnd.bnd @@ -0,0 +1,20 @@ +-buildpath: \ + osgi.annotation;version=7.0.0,\ + osgi.core;version=7.0.0,\ + osgi.cmpn;version=7.0.0,\ + tdt4250.ra,\ + tdt4250.emf.servletsupport;version=latest,\ + org.eclipse.emf.common,\ + org.eclipse.emf.ecore,\ + org.eclipse.emf.ecore.xmi,\ + tdt4250.emf.servletsupport.impl;version=latest + +-testpath: \ + ${junit},\ + ${mockito},\ + ${mockito-deps} + +javac.source: 1.8 +javac.target: 1.8 + +Bundle-Version: 0.0.0.${tstamp} \ No newline at end of file diff --git a/emf-ws/tdt4250.ra.resource/launch.bndrun b/emf-ws/tdt4250.ra.resource/launch.bndrun new file mode 100644 index 0000000..58af947 --- /dev/null +++ b/emf-ws/tdt4250.ra.resource/launch.bndrun @@ -0,0 +1,18 @@ +-runfw: org.eclipse.osgi;version=3.13 +-runprovidedcapabilities: ${native_capability} + +-resolve.effective: active + +-runproperties: \ + org.osgi.service.http.port=8080,\ + osgi.console=,\ + osgi.console.enable.builtin=false + +-runbundles:\ + org.apache.felix.gogo.runtime,\ + org.apache.felix.gogo.shell,\ + org.apache.felix.gogo.command + +-runrequires:\ + osgi.identity;filter:='(osgi.identity=org.apache.felix.gogo.shell)',\ + osgi.identity;filter:='(osgi.identity=org.apache.felix.gogo.command)' diff --git a/emf-ws/tdt4250.ra.resource/src/tdt4250/ra/resource/SampleResource.java b/emf-ws/tdt4250.ra.resource/src/tdt4250/ra/resource/SampleResource.java new file mode 100644 index 0000000..f03276f --- /dev/null +++ b/emf-ws/tdt4250.ra.resource/src/tdt4250/ra/resource/SampleResource.java @@ -0,0 +1,31 @@ +package tdt4250.ra.resource; + +import java.net.URL; + +import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.resource.ResourceSet; +import org.osgi.framework.BundleContext; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; + +import tdt4250.ra.RaPackage; +import tdt4250.ra.util.RaResourceFactoryImpl; +import tdt4250.servletsupport.IResourceProvider; +import tdt4250.servletsupport.impl.ResourceProvider; + +@Component +public class SampleResource extends ResourceProvider implements IResourceProvider { + + @Activate + public void activate(BundleContext bc) { + URL resource = bc.getBundle().getResource("/tdt4250/ra/resource/sample.ra"); + setUri(URI.createURI(resource.toString())); + } + + @Override + protected void configureResourceSet(ResourceSet resourceSet) { + super.configureResourceSet(resourceSet); + resourceSet.getPackageRegistry().put(RaPackage.eNS_URI, RaPackage.eINSTANCE); + resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("ra", new RaResourceFactoryImpl()); + } +} diff --git a/emf-ws/tdt4250.ra.resource/src/tdt4250/ra/resource/sample.ra b/emf-ws/tdt4250.ra.resource/src/tdt4250/ra/resource/sample.ra new file mode 100644 index 0000000..b1dd27d --- /dev/null +++ b/emf-ws/tdt4250.ra.resource/src/tdt4250/ra/resource/sample.ra @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ra:Department + xmi:version="2.0" + xmlns:xmi="http://www.omg.org/XMI" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:ra="platform:/plugin/tdt4250.ra/model/ra.ecore" + xsi:schemaLocation="platform:/plugin/tdt4250.ra/model/ra.ecore ra.ecore" + name="Dept. of CS" + shortName="IDI"> + <resourceAllocations + factor="0.5"> + <person + href="idi.xmi#//@staff.0"/> + </resourceAllocations> + <resourceAllocations + factor="1.0"> + <person + href="idi.xmi#//@staff.0"/> + </resourceAllocations> +</ra:Department> diff --git a/emf-ws/tdt4250.ra.resource/test/tdt4250/ra/resource/ignore.md b/emf-ws/tdt4250.ra.resource/test/tdt4250/ra/resource/ignore.md new file mode 100644 index 0000000..feef779 --- /dev/null +++ b/emf-ws/tdt4250.ra.resource/test/tdt4250/ra/resource/ignore.md @@ -0,0 +1 @@ +# To make sure the folder exists in git -- GitLab