diff --git a/.gitignore b/.gitignore index 7ff327c6..4f35f1f4 100644 --- a/.gitignore +++ b/.gitignore @@ -26,6 +26,8 @@ tmp/ local.properties .settings/ .loadpath +.classpath +.project # Locally stored "Eclipse launch configurations" *.launch diff --git a/README.md b/README.md index 10ffa4aa..ccf42881 100644 --- a/README.md +++ b/README.md @@ -4,29 +4,67 @@ CRCE is an experimental repository, designed to support research into component- ## Prerequisities -- **JDK 7** set in `JAVA_HOME` environment variable before starting CRCE (there is a problem with running web UI on JDK 8, need to update dependencies), tested on 1.7.0_80 +- **JDK 11** set in `JAVA_HOME` environment variable before starting CRCE, tested on OpenJDK 11.0.4 - **MongoDB**, tested on v2.6.10, v3.4.10 - **Maven 3**, tested on 3.5.2 -On linux, switching to JDK 7 for development/build can be done via `sudo update-alternatives --config java`. +On linux, switching to JDK 11 for development/build can be done via `sudo update-alternatives --config java`. ## Build +Build process consists of two parts. Compiling and building the code itself and building the docker image. + +### Build CRCE + +This process can be done automatically by running the `build-code.bash` script placed in the project root directory. + 1. `crce-parent` in `/pom` directory 2. `shared-build-settings` in `/build` 3. everything in `/third-party` (bash: `.../third-party$ for d in * ; do cd $d; mvn clean install; cd .. ; done`) 4. `crce-core-reactor` in `/core` 5. `crce-modules-reactor` in `/modules` +6. `provision-reactor` in `/deploy` On linux, step 3. can be perfomed via `.../third-party$ for d in * ; do cd $d ; mvn clean install ; cd .. ; done`. In case of maven error "Received fatal alert: protocol_version", use `mvn -Dhttps.protocols=TLSv1.2 ...` after https://stackoverflow.com/a/50924208/261891. + +### Build docker image + +Docker image is placed in directory `/deploy` but before it can be used, bundles must be collected. +Bundles can be collected by running the following commands in `/deploy` directory: + +```bash +mvn clean pax:directory +./prepare-bundles.sh + +``` + +The `prepare-bundles.sh` script is needed due to the issues further described in the Issues section. + +To finally build the image itself, execute the following commnad in `/deploy` directory: + +```bash +docker build . -t ${image-tag} +``` + ## Start up -Run CRCE using Maven plugin for pax in `crce-modules-reactor` module (i.e. `/modules` directory): +Assuimg the dokcer image is already build, run it by following command: -`mvn pax:provision` +```bash +docker run -it \ + -p 8080:8080 \ + --add-host mongoserver:172.17.0.1 \ + -v /felix/deploy:/felix/deploy \ + ${image-tag} +``` -The output log should write up some info about dependencies terminated by lines similar to the following: +The `-p` parameter maps the port of docker virual machine to the real port on the computer. +The `--add-host` allows docker to connect to the Mongo database running locally (Docker *usually* uses 172.17.0.1 ip to access localhost from the container). The app expects the database to be listening on port 27017 by default. +The `-v` parameter maps directory in container to the real directory in the host machine so that it can be used to install new bundles via CLI. + + +If everything works, the output log should write up some info about dependencies terminated by lines similar to the following: ``` Listening for transport dt_socket at address: 65505 @@ -47,17 +85,58 @@ The cause of the latter is a badly loaded binary of mathematical solver which do Started up, the application is accessible at: -- web UI: http://localhost:8080/crce +- web UI: http://localhost:8080/crce-webui - REST web services: http://localhost:8080/rest/v2/ Updated (more or less) REST WS documentation is available at [Apiary](https://crceapi.docs.apiary.io/). +### MongoDB + +Mongo DB can either be run locally or in docker using following command: + +```bash +sudo docker run -d -p 27017:27017 -v ~/data:/data/db mongo +``` + +Where `~/data` is directory on host machine to be used as a storage by Mongo. + ### lpsolve installation To solve the issue with mathematical solver, you need to install [lpsolve library](https://sourceforge.net/projects/lpsolve/) to your computer. To do that, follow [their guide](http://lpsolve.sourceforge.net/5.5/Java/README.html#install) step by step. > Note that on Windows, you do not have to place the libs to `\WINDOWS` or `\WINDOWS\SYSTEM32` as the guide states. Put it wherever you wish and add the directory to your `Path`. +## Debugging + +Remote debugging is possible when running CRCE in Docker. To enable remote debug, application needs to be started with following flags: + +```bash +-Xdebug -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 +``` + +And expose the port 5005 by adding `-p 5005:5005` to the `docker run` command. + +Check the `deploy/Dockerfile` to see the difference between running the app in normal and debug mode. + ## Code updates After modifying a part of code, only the parental module needs to be rebuilt (no need to rebuild all). After that, the pax process must be restarted. + +## Configuration + +Configuration is done via OSGI service called [Configuration Admin](https://osgi.org/specification/osgi.cmpn/7.0.0/service.cm.html). +Details on how it's implemented in Felix can be found in [Apache Felix Configuration Admin Service](https://felix.apache.org/documentation/subprojects/apache-felix-config-admin.html). + +By default, Felix will look into the `config` directory for possible configuration (example of such directory can be found in `deploy/conf.default`) + + +## Issues + +### Required runtime environment capability in some bundles + +Some bundles (mostly those from the third parties) either require a particular version of OSGi runtime environment or require the capability `osgi.ee` to be set to a specific value. This may or may not work with newer version of Java and to avoid runtime problems, these requirements need to be removed. + +To remove them, it is necessary to edit manifest (`META-INF/MANIFEST.MF`) of such bundle and remove lines containing: +`Require-Capability: osgi.ee;` or `Bundle-RequiredExecutionEnvironment: J2SE-`. This is done in the `deploy/prepare-bundles.sh` script. + +An ideal solution would be to either found newer version of such bundles or replace them with different bundles with same functionality. This however may introduce compatibility issues (as some other bundles may depend on the current versions) or may not even be possible (replacement bundle does not exist). diff --git a/arch/.gitignore b/arch/.gitignore new file mode 100644 index 00000000..a14f836d --- /dev/null +++ b/arch/.gitignore @@ -0,0 +1,8 @@ +#ignore vim +*.swp + +#ignore tex build +*.aux +*.gz +*.log + diff --git a/arch/IndexerApi.png b/arch/IndexerApi.png new file mode 100644 index 00000000..f4866fcf Binary files /dev/null and b/arch/IndexerApi.png differ diff --git a/arch/Modules.png b/arch/Modules.png new file mode 100644 index 00000000..716645ac Binary files /dev/null and b/arch/Modules.png differ diff --git a/arch/crce.eap b/arch/crce.eap new file mode 100644 index 00000000..fed3f7dc Binary files /dev/null and b/arch/crce.eap differ diff --git a/arch/favlogo.jpg b/arch/favlogo.jpg new file mode 100644 index 00000000..b70db908 Binary files /dev/null and b/arch/favlogo.jpg differ diff --git a/arch/sar-2018.pdf b/arch/sar-2018.pdf new file mode 100644 index 00000000..828a3fad Binary files /dev/null and b/arch/sar-2018.pdf differ diff --git a/arch/sar-2018.tex b/arch/sar-2018.tex new file mode 100644 index 00000000..f9fb7bf8 --- /dev/null +++ b/arch/sar-2018.tex @@ -0,0 +1,172 @@ +\documentclass[12pt, a4paper]{article} +\usepackage[utf8]{inputenc} +\usepackage[IL2]{fontenc} +\usepackage[czech]{babel} +\usepackage{graphicx} + +\begin{document} +\begin{figure}[h!] +\centering +\includegraphics[bb= 0 0 820 445 , width=75mm]{favlogo.jpg} +\end{figure} + +\vspace{5cm} + +{\centering +{\huge Architektura CRCE}\\[1em] +{\large KIV/SAR - semestrální práce}\\[7,5cm] +} + +\begin{tabular}{l r} +student: & Radek VAIS, Zdeněk VALEŠ\\ +mail: & vaisr@students.zcu.cz, valesz@students.zcu.cz\\ +datum: & 1.1.2019\\ +\end{tabular} + +\thispagestyle{empty} +\newpage + +%======================================== +%======================================== +%======================================== +%======================================== +%======================================== +\section{Zadání} %===================================================================================================== + +CRCE\footnote{Component Repository supporting Compatibility Evaluation} je komponentové úložiště vyvíjené v rámci výzkumu na Katedře informatiky a výpočetní techniky na Západočeské univerzitě v Plzni. Jeho hlavní vlastností je podpora kontroly kompatibility verzí různých OSGi komponent nebo webových api. + +\subsection{Motivace} + +Vývoj projektu probíhá již několik let a vystřídalo se na něm mnoho vývojářů, což způsobilo zanesení větších či menších architektonických dluhů. Projekt již můžeme klasifikovat jako velký. Existuje potřeba, aby střídající se vývojáři (např. v rámci bakalářských prací) snadno a rychle zprovoznili základní instalaci a získali tak prostředí, pro rychlý vývoj nových částí. + +\subsection{Cíle projektu} + +\begin{itemize} + \item Unifikovat proces sestavení aplikace a spuštění. + \item Zdokumentovat současnou architekturu aplikace. + \item Analyzovat závislosti modulů v projektu a ověřit, zda některé moduly mají být součástí jádra. + \item Připravit Docker image pro vývojáře. +\end{itemize} + +\newpage +%======================================== +%======================================== +%======================================== +%======================================== +%======================================== +\section{Analýza~architektury} %============================================================================================ + +Celý projekt je rozdělen do čtyř hlavních modulů: sdílené nastavení sestavení, jádro, moduly a knihovny třetích stran. Ne zcela jasné je začlenění mechanismu pro nasazení a spuštění v modulu \texttt{CRCE modules} (jedná se o komponentu \texttt{provision}). Závislostí modulů na jádře pozorujeme dva typy. Prvním typem je závislost na agregačním modulu jádra, druhým je jmenovitá závislost na komponentách jádra. Tyto skutečnosti jsou patrné na celkovém diagramu na Obrázku \ref{fig:wholeCRCE}. + +\begin{figure}[h!] +\centering +\includegraphics[width=135mm]{wholeCRCE.png} +\caption{Diagram závislostí všech maven komponent projektu CRCE před provedenými úpravami.} +\label{fig:wholeCRCE} +\end{figure} + +Během analýzy modulu pro moduly CRCE jsme identifikovali několik kandidátů na přesun do jádra. Za kandidáty jsme volili takové komponenty, které využívá velká část ostatních modulů a zároveň tyto moduly mají závislosti do jádra. Komponenta webového rozhraní (\texttt{crce-webui}) tomuto pravidlu sice odporuje, představuje ale základní komponentu, bez které by úložiště nešlo použít. Přesouvané komponenty jsou: \texttt{crce-compatibility-api}, \texttt{crce-webui}, \texttt{crce-concurrency} (graficky znázorněno na Obrázku \ref{fig:modulesCRCE}). + +Po identifikace kandidátů jsme z přesunu vyřadili komponentu metadata-osgi-bundle, kvůli nedostatečné obecnosti. Komponenta je schopna indexovat pouze OSGI komponenty -- přesun do jádra by byl možný, pokud by uměla indexovat obecné JAR. Komponenta \texttt{crce-webui} bohužel obsahuje silnou závislost na této komponentě, která brání přesunu \texttt{crce-webui} do jádra. Závislost spočívá v použití několika konstant, které jsou v definované v metadata-osgi-bundle. Navrhli jsme tedy přidání metody do rozhraní indexeru pro zjištění jaké elementy indexer zpracovává a silnou závislost jsme nahradili slabou závislostí. + +\begin{figure}[h!] +\centering +\includegraphics[width=135mm]{modules.png} +\label{fig:modulesCRCE} +\caption{Diagram původních závislostí uvnitř modulu moduly CRCE. Zeleně jsou označeny přesouvané komponenty. Červeně je označena nevhodná závislost.} +\end{figure} + +%======================================== +%======================================== +%======================================== +%======================================== +%======================================== +\section{Provedené~změny} %======================================================================================= + +V projektu jsme provedli několik změn, které by měly vést k zjednodušení práce budoucích vývojářů. Pro přehlednost dodávám, že v této sekci pojem \textit{modul} značí maven modul v kořenovém adresáři CRCE a pojem \textit{komponenta} značí jeden z maven modulů obsahující konkrétní implementaci (\textit{crce-webui}, \textit{crce-metadata-api}, ...). + +\subsection{Nový modul pro sestavení} +Do kořene CRCE byl přidán nový modul \textit{deploy}, do kterého byla přesunuta komponenta \textit{provision}, používaná ke spouštění CRCE. Jsou zde agregovány všechny komponenty z jádra a komponenty z modulu \textit{modules}, které jsou zachycené v \textit{crce-default-modules}. + +Nově přidaná komponenta \textit{crce-default-modules} tedy slouží jako agregátor komponent z modulu \textit{modules}, které mají být použité ve výsledné distribuci. + +V rámci přípravy modulu pro sestavení a spuštění byla povýšena verze Felix na 5.0.0. Starší verze způsobovala problémy se spuštěním interaktivního shellu při spuštění pomocí Dockeru. + +\subsection{Přesun vybraných modulů do jádra} +Do jádra byly z modulu \textit{modules} přesunuty komponenty: \textit{crce-compatibility-api}, \textit{crce-webui} a \textit{crce-concurrency}. V případě \textit{crce-webui} bylo nutné odstranit závislost na \textit{crce-core} (jinak by se jednalo o kruhovou závislost) a nahradit ji jednotlivými závislostmi na vybraných komponentách z jádra. + +V komponentě \textit{crce-compatibility-api} bylo nutné přidat výchozí (prázdnou) implementaci rozhraní \textit{Compatibility} a \textit{Diff}. Pro tyto implementace byl přidán unit test. + +Součástí přesunu komponent do jádra bylo přidání unit testu do \textit{crce-metadata-osgi-bundle}, který dokazuje schopnost této komponenty indexovat pouze OSGI bundly a ne obecné JAR. + +\subsubsection{Nahrazení silné závislosti v komponentě crce-webui} +Komponenta \textit{crce-webui} obsahovala silnou závislost na komponentě \textit{crce-metadata-osgi-bundle}. Tato závislost spočívala v použití několika konstant, označujících indexované elementy, definovaných v rozhraní \textit{NsOsgiIdentity}. Konstanty byly použity ve třídě \textit{ResourceServlet} k filtrování zobrazovaných OSGI bundlů. + +Po dohodě s vyučujícím jsme tuto závislost nahradili slabou závislostí -- konstanty stejného typu jsme dodefinovali i v komponentě \textit{crce-webui}. Silná závislost byla odstraněna, nicméně pokud se v budoucnu změní komponenta \textit{crce-metadata-osgi-bundle}, bude nutné kontrolovat, zda změna neovlivnila \textit{crce-webui} a případné nesrovnalosti opravit. + +Aby bylo podobným závislostem v budoucnosti zamezeno, rozhraní indexeru bylo rozšířeno o metodu, která vrací elementy, jež je indexer schopen detekovat. V rámci této práce byla vytvořena defaultní implementace této vlastnosti v AbstractIndexer, která vrací pouze prázdný seznam. Projekt lze bezpečně přeložit, ale momentálně novou funkci rozhraní plně využívá jen OSGiIndexer. + +\begin{figure}[h!] +\centering +\includegraphics[width=135mm]{indexerApi.png} +\label{fig:indexerApi} +\caption{Diagram ukazuje upravené rozhraní indexeru, které nově obsahuje metodu getIndexedAttributes, která slouží k získání seznamu vlastností, které daný indexer zpracovává. Dále naznačuje možnost umístit implementaci indexeru do modulu crce-core nebo crce-modules (fiktivní indexery JarIndexer a AnotherIndexer).} +\end{figure} + +\subsubsection{Načítání connection stringu} + +Součástí příprav pro dockerizaci bylo přidání konfigurace připojení k databázi MongoDB. Ke konfiguraci připojení lze nyní využít proměnnou prostředí \textit{mongo\_connection}, kde aplikace očekává MongoDB connection string\footnote{viz dokumentace: https://docs.mongodb.com/manual/reference/connection-string/}. V případě, že tato proměnná není nastavena, použije se výchozí hodnota (\textit{mongodb://localhost:27017}, která nese připojení k databázi běžící na localhostu a standardním portu. Výhodou tohoto přístupu je možnost konfigurovat connection string v Dockerfile a při změně pouze znovu sestavit image. + + +\section{Dockerizace projektu} +Do modulu \textit{deploy} byl přidán Dockerfile, kterým je možné sestavit docker image obsahující spustitelnou verzi CRCE. Do takto spuštěného CRCE lze doinstalovávat nové OSGI komponenty a není nutné celý projekt znovu sestavovat. + + + +%======================================== +%======================================== +%======================================== +%======================================== +%======================================== +\section{Uživatelská~příručka} %====================================================================================== + +Provedené změny ovlivnily základní používání projektu při vývoji. + +Pro sestavení na platformě Linux lze použít bash script \textit{build.bash}\footnote{Teoreticky není nutná platforma Linux. Pro uživatele Windows by měl být dostačující bash interpret nebo Linux subsystem. Tato možnost nebyla testována.}, který automaticky spustí jednotlivé kroky sestavení pomocí nástroje Maven. Script vždy vykonává všechny kroky od začátku, v případě selhání je vhodné po opravě pokračovat v buildu manuálně. + +V případě, že databáze neběží na localhostu, nebo standardním portu, je možné nastavit připojení skrze proměnnou prostředí \textit{mongo\_connection}. Tato proměnná by v případě použití měla obsahovat celý connection string. Pokud není nastavená, pro připojení k databázi bude použita výchozí hodnota: \textit{mongodb://localhost:27017}. + +\subsection{Docker} +K sestavení Docker image je možné použít Dockerfile, který se nachází v modulu \textit{deploy}. Sestavení image je provedeno příkazem: + +\begin{verbatim} +docker build . -t crce-docker +\end{verbatim} + +Výsledný image obsahuje distribuci Apache Felix 5.0.0, JDK 1.7 a všechny OSGI bundly z CRCE. Spuštění lze provést příkazem: + +\begin{verbatim} +docker run -it \ + -p 8080:8080 \ + --add-host mongoserver:172.17.0.1 \ + -v /felix/deploy:/felix/deploy \ + crce-docker +\end{verbatim} + +Parametr \textit{add-host} slouží k přidání záznamu do /etc/hosts v kontejneru a image se pak může k databázi běžící na hostovacím stroji dostat pomocí hostname \textit{mongoserver}. IP adresa 172.17.0.1 je adresa, kterou docker přiřazuje hostovacímu stroji. Do adresáře \textit{/felix/deploy} na hostovacím stroji je možné vložit OSGI bundly a ty následně nainstalovat a spustit skrze Gogo shell. K běžící instanci je možné přistoupit na adrese \textit{http://localhost:8080/crce}. + +Před spuštěním docker image je třeba spustit instanci MongoDB. Není podstatné, zda bude spuštěna prostřednictvím Dockeru (např. image 3.4-jessie), lokálním stroji nebo na serveru. Jen je třeba před sestavením ověřit nastavení connection string. Není připravena konfigurace docker-compose, protože se nám v rámci konfigurace a testů nepodařilo zprovoznit GoGo shell při použití compose mechanismu, uživatel by byl ochuzen o diagnostické možnosti OSGi runtime. + +%======================================== +%======================================== +%======================================== +%======================================== +%======================================== +\newpage +\section{Závěr} %====================================================================================================== + +V rámci projektu jsme naplnili cíl usnadnit novým vývojářům spuštění výchozí aplikace, především přípravou docker image. Nepodařilo se nám zjednodušit proces sestavení celé aplikace na jeden Maven příkaz nicméně pro prostředí Linux jsme vytvořili script, který úkony nutné pro sestavení provede automaticky. +Dále jsme přesunuli několik modulů do jádra CRCE z důvodu jejich provázanosti s ostatními nebo nutnosti pro používání. + + +\end{document} \ No newline at end of file diff --git a/arch/wholeCRCE.png b/arch/wholeCRCE.png new file mode 100644 index 00000000..02a9b475 Binary files /dev/null and b/arch/wholeCRCE.png differ diff --git a/artifact-list.txt b/artifact-list.txt new file mode 100755 index 00000000..fa1c63a6 --- /dev/null +++ b/artifact-list.txt @@ -0,0 +1,49 @@ +c:\users\valesz\documents\crce: crce-reactor +c:\users\valesz\documents\crce\build: crce-parent -> shared-build-settings +c:\users\valesz\documents\crce\build\compiled: shared-build-settings -> compiled-bundle-settings +c:\users\valesz\documents\crce\build\wrappers: shared-build-settings -> wrapper-bundle-settings +c:\users\valesz\documents\crce\core: crce-core-reactor +c:\users\valesz\documents\crce\core\crce-core: crce-parent -> crce-core +c:\users\valesz\documents\crce\core\crce-metadata-api: compiled-bundle-settings -> crce-metadata-api +c:\users\valesz\documents\crce\core\crce-metadata-dao-api: compiled-bundle-settings -> crce-metadata-dao-api +c:\users\valesz\documents\crce\core\crce-metadata-dao-impl: compiled-bundle-settings -> crce-metadata-dao-impl +c:\users\valesz\documents\crce\core\crce-metadata-dao-mongodb: compiled-bundle-settings -> crce-metadata-dao-mongodb +c:\users\valesz\documents\crce\core\crce-metadata-impl: compiled-bundle-settings -> crce-metadata-impl +c:\users\valesz\documents\crce\core\crce-metadata-indexer-api: compiled-bundle-settings -> crce-metadata-indexer-api +c:\users\valesz\documents\crce\core\crce-metadata-indexer-impl: compiled-bundle-settings -> crce-metadata-indexer-impl +c:\users\valesz\documents\crce\core\crce-metadata-json-api: compiled-bundle-settings -> crce-metadata-json-api +c:\users\valesz\documents\crce\core\crce-metadata-json-impl: compiled-bundle-settings -> crce-metadata-json-impl +c:\users\valesz\documents\crce\core\crce-metadata-service-api: compiled-bundle-settings -> crce-metadata-service-api +c:\users\valesz\documents\crce\core\crce-metadata-service-impl: compiled-bundle-settings -> crce-metadata-service-impl +c:\users\valesz\documents\crce\core\crce-plugin-api: compiled-bundle-settings -> crce-plugin-api +c:\users\valesz\documents\crce\core\crce-repository-api: compiled-bundle-settings -> crce-repository-api +c:\users\valesz\documents\crce\core\crce-repository-impl: compiled-bundle-settings -> crce-repository-impl +c:\users\valesz\documents\crce\core\crce-resolver-api: compiled-bundle-settings -> crce-resolver-api +c:\users\valesz\documents\crce\core\crce-resolver-impl: compiled-bundle-settings -> crce-resolver-impl +c:\users\valesz\documents\crce\modules: crce-modules-parent -> crce-modules-reactor +c:\users\valesz\documents\crce\modules\crce-compatibility-api: crce-modules-parent -> crce-compatibility-api +c:\users\valesz\documents\crce\modules\crce-compatibility-dao-api: crce-modules-parent -> crce-compatibility-dao-api +c:\users\valesz\documents\crce\modules\crce-compatibility-dao-mongodb: crce-modules-parent -> crce-compatibility-dao-mongodb +c:\users\valesz\documents\crce\modules\crce-concurrency: crce-modules-parent -> crce-concurrency +c:\users\valesz\documents\crce\modules\crce-handler-metrics: crce-modules-parent -> crce-handler-metrics +c:\users\valesz\documents\crce\modules\crce-integration-tests: crce-modules-parent -> crce-integration-tests +c:\users\valesz\documents\crce\modules\crce-metadata-osgi-bundle: crce-modules-parent -> crce-metadata-osgi-bundle +c:\users\valesz\documents\crce\modules\crce-optimizer-functions: crce-modules-parent -> crce-optimizer-functions +c:\users\valesz\documents\crce\modules\crce-repository-maven-impl: crce-modules-parent -> crce-repository-maven-impl +c:\users\valesz\documents\crce\modules\crce-rest: crce-modules-parent -> crce-rest +c:\users\valesz\documents\crce\modules\crce-rest-v2: crce-modules-parent -> crce-rest-v2 +c:\users\valesz\documents\crce\modules\crce-restimpl-indexer: crce-modules-parent -> crce-restimpl-indexer +c:\users\valesz\documents\crce\modules\crce-target: crce-modules-parent -> crce-target +c:\users\valesz\documents\crce\modules\crce-vo: crce-modules-parent -> crce-vo +c:\users\valesz\documents\crce\modules\crce-webservices-indexer: crce-modules-parent -> crce-webservices-indexer +c:\users\valesz\documents\crce\modules\crce-webui: crce-modules-parent -> crce-webui +c:\users\valesz\documents\crce\modules\pom: compiled-bundle-settings -> crce-modules-parent +c:\users\valesz\documents\crce\modules\provision: crce-modules-parent -> provision +c:\users\valesz\documents\crce\pom: crce-parent +c:\users\valesz\documents\crce\third-party\httpclient: wrapper-bundle-settings -> org.apache.httpcomponents.httpclient +c:\users\valesz\documents\crce\third-party\httpcore: wrapper-bundle-settings -> org.apache.httpcomponents.httpcore +c:\users\valesz\documents\crce\third-party\jna-platform: wrapper-bundle-settings -> net.java.dev.jna.jna-platform +c:\users\valesz\documents\crce\third-party\lpsolve: compiled-bundle-settings -> com.datumbox.lpsolve +c:\users\valesz\documents\crce\third-party\plexus-component-annotations: wrapper-bundle-settings -> org.codehaus.plexus.plexus-component-annotations +c:\users\valesz\documents\crce\third-party\plexus-interpolation: wrapper-bundle-settings -> org.codehaus.plexus.plexus-interpolation +c:\users\valesz\documents\crce\third-party\plexus-utils: wrapper-bundle-settings -> org.codehaus.plexus.plexus-utils diff --git a/build-code.bash b/build-code.bash new file mode 100755 index 00000000..703b8e56 --- /dev/null +++ b/build-code.bash @@ -0,0 +1,61 @@ +#!/bin/bash + +echo "Building crce-parent in ./pom" +cd pom +mvn clean install +retVal=$? +cd .. +if [ $retVal -ne 0 ]; then + echo "Error"; + exit $retVal; +fi + +#============================================================== + +echo "Building shared-build-settings in ./build" +cd build +mvn clean install +retVal=$? +cd .. +if [ $retVal -ne 0 ]; then + echo "Error"; + exit $retVal; +fi + +#============================================================== + +echo "Building third party libraries in ./third-party" +cd third-party +for d in * ; do cd $d ; mvn clean install ; cd .. ; done +retVal=$? +cd .. +if [ $retVal -ne 0 ]; then + echo "Error"; + exit $retVal; +fi + +#============================================================== + +echo "Building crce-core-reactor in ./core" +cd core +mvn clean install +retVal=$? +cd .. +if [ $retVal -ne 0 ]; then + echo "Error"; + exit $retVal; +fi + +#============================================================== + +echo "Building crce-modules-reactor in ./modules" +cd modules +mvn clean install +retVal=$? +cd .. +if [ $retVal -ne 0 ]; then + echo "Error"; + exit $retVal; +fi + +echo "Done building" diff --git a/build/compiled/pom.xml b/build/compiled/pom.xml index c0ceda26..43761936 100644 --- a/build/compiled/pom.xml +++ b/build/compiled/pom.xml @@ -29,6 +29,10 @@ org.apache.maven.plugins maven-compiler-plugin + + 10 + 10 + <_include>-osgi.bnd + <_noee>true @@ -75,6 +80,8 @@ findbugs-maven-plugin true + true + @@ -125,6 +132,20 @@ true provided + + + + javax.ws.rs + javax.ws.rs-api + + + org.glassfish.jersey.containers + jersey-container-servlet-core + + + org.glassfish.jersey.media + jersey-media-multipart + diff --git a/build/pom.xml b/build/pom.xml index 64f28433..6e8db05f 100644 --- a/build/pom.xml +++ b/build/pom.xml @@ -6,7 +6,7 @@ cz.zcu.kiv.crce crce-parent - 2.1.0 + 2.1.1-SNAPSHOT @@ -19,17 +19,21 @@ cz.zcu.kiv.crce - 1.7 + 11 3.0.4 2.13.3 0.8.1-incubator 4.3.1 - 3.0.3 + 7.3.3 1.0.0.Final 3.2.0 - 2.6.1 + 3.2.0 + 2.9.9 + 2.29 1.9.13 1.7.7 + 4.14 + 2.29 @@ -50,7 +54,7 @@ org.ops4j maven-pax-plugin - 1.5 + 1.6.0 true org.apache.maven.plugins maven-compiler-plugin - 3.2 + 3.8.0 ${version.jdk} ${version.jdk} + ${version.jdk} ${project.build.sourceEncoding} + + + org.ow2.asm + asm + 7.1 + + org.apache.maven.plugins @@ -106,7 +119,7 @@ - ${version.jdk} + 10 ${version.maven} @@ -118,17 +131,19 @@ maven-war-plugin - 2.5 + 2.6 org.apache.maven.plugins maven-pmd-plugin - 3.1 + 3.11.0 + + org.codehaus.mojo findbugs-maven-plugin - 3.0.0 + 3.0.5 org.apache.felix @@ -161,17 +176,22 @@ - + + + javax.ws.rs + javax.ws.rs-api + 2.0 + + + org.glassfish.jersey.containers + jersey-container-servlet-core + ${version.jersey} + + + org.glassfish.jersey.media + jersey-media-multipart + ${version.jersey} + @@ -203,29 +223,41 @@ - org.ops4j.pax.web - pax-web-extender-war - ${version.org.ops4j.pax.web} - provided - - - org.ops4j.pax.web - pax-web-jetty-bundle - ${version.org.ops4j.pax.web} - provided - - - org.ops4j.pax.web - pax-web-jsp - ${version.org.ops4j.pax.web} + javax.servlet + servlet-api + 2.5 provided - org.ops4j.pax.web - pax-web-spi - ${version.org.ops4j.pax.web} - provided - + org.ops4j.pax.web + pax-web-jetty-bundle + ${version.org.ops4j.pax.web} + provided + + + org.ops4j.pax.web + pax-web-spi + ${version.org.ops4j.pax.web} + provided + + + org.ops4j.pax.web + pax-web-api + ${version.org.ops4j.pax.web} + provided + + + org.ops4j.pax.web + pax-web-extender-war + ${version.org.ops4j.pax.web} + provided + + + org.ops4j.pax.web + pax-web-descriptor + ${version.org.ops4j.pax.web} + provided + @@ -307,13 +339,12 @@ org.apache.felix org.apache.felix.dependencymanager.shell ${version.org.apache.felix.dependencymanager} - provided org.apache.felix org.apache.felix.dependencymanager.annotation - ${version.org.apache.felix.dependencymanager} + ${version.org.apache.felix.dependencymanager.annotation} compile @@ -387,21 +418,6 @@ true - - - - javax.servlet - servlet-api - 2.5 - provided - - - javax.servlet - jsp-api - 2.0 - provided - - org.apache.ace @@ -501,8 +517,8 @@ org.ow2.asm - asm-all - 4.1 + asm + 7.1 org.apache.servicemix.bundles @@ -558,17 +574,21 @@ 20080701 provided - + + + org.apache.xbean xbean-finder - 3.13 - + ${version.xbean} provided org.apache.xbean xbean-bundleutils - 3.13 + ${version.xbean} @@ -671,6 +691,13 @@ test + + + org.json + json + 20180813 + + diff --git a/modules/crce-compatibility-api/osgi.bnd b/core/crce-compatibility-api/osgi.bnd similarity index 97% rename from modules/crce-compatibility-api/osgi.bnd rename to core/crce-compatibility-api/osgi.bnd index fb96e5f2..cf6ca00e 100644 --- a/modules/crce-compatibility-api/osgi.bnd +++ b/core/crce-compatibility-api/osgi.bnd @@ -1,5 +1,5 @@ -#----------------------------------------------------------------- -# Use this file to add customized Bnd instructions for the bundle -#----------------------------------------------------------------- - -Private-Package: +#----------------------------------------------------------------- +# Use this file to add customized Bnd instructions for the bundle +#----------------------------------------------------------------- + +Private-Package: diff --git a/core/crce-compatibility-api/pom.xml b/core/crce-compatibility-api/pom.xml new file mode 100644 index 00000000..8b20177b --- /dev/null +++ b/core/crce-compatibility-api/pom.xml @@ -0,0 +1,62 @@ + + + + 4.0.0 + + + + org.apache.maven.plugins + maven-compiler-plugin + + 10 + 10 + + + + + + + cz.zcu.kiv.crce + compiled-bundle-settings + 2.1.2-SNAPSHOT + + + + crce-compatibility-api + bundle + + CRCE - Compatibility API + + + ${namespace}.compatibility.api + ${namespace}.compatibility + + + + + + ${project.groupId} + crce-metadata-api + 3.0.1-SNAPSHOT + + + + + + + javax.xml.bind + jaxb-api + 2.3.0 + + + + junit + junit + test + + + + \ No newline at end of file diff --git a/modules/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/Compatibility.java b/core/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/Compatibility.java similarity index 100% rename from modules/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/Compatibility.java rename to core/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/Compatibility.java diff --git a/modules/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/CompatibilityFactory.java b/core/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/CompatibilityFactory.java similarity index 90% rename from modules/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/CompatibilityFactory.java rename to core/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/CompatibilityFactory.java index a8070374..5b432d0e 100644 --- a/modules/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/CompatibilityFactory.java +++ b/core/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/CompatibilityFactory.java @@ -1,9 +1,9 @@ package cz.zcu.kiv.crce.compatibility; -import java.util.List; - import cz.zcu.kiv.crce.metadata.type.Version; +import java.util.List; + /** * Factory interface for Compatibility. * @@ -15,7 +15,7 @@ public interface CompatibilityFactory { /** * - * Factory method for complete initialization of Compability implementation. + * Factory method for complete initialization of Compatibility implementation. * * @param id unique id * @param resourceName compared resource name (crce.identity) @@ -32,7 +32,7 @@ Compatibility createCompatibility(String id, String resourceName, Version resour /** * - * Factory method for complete initialization of Compability implementation. Base name is set to the same + * Factory method for complete initialization of Compatibility implementation. Base name is set to the same * value as resource name. * * @param id unique id diff --git a/modules/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/CompatibilityVersionComparator.java b/core/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/CompatibilityVersionComparator.java similarity index 100% rename from modules/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/CompatibilityVersionComparator.java rename to core/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/CompatibilityVersionComparator.java diff --git a/modules/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/Contract.java b/core/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/Contract.java similarity index 90% rename from modules/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/Contract.java rename to core/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/Contract.java index 16f9e25c..4fa8652a 100644 --- a/modules/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/Contract.java +++ b/core/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/Contract.java @@ -14,7 +14,7 @@ public enum Contract { private final String value; - private Contract(String value) { + Contract(String value) { this.value = value; } diff --git a/modules/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/Diff.java b/core/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/Diff.java similarity index 100% rename from modules/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/Diff.java rename to core/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/Diff.java diff --git a/modules/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/Difference.java b/core/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/Difference.java similarity index 98% rename from modules/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/Difference.java rename to core/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/Difference.java index 933e95de..45eae19b 100644 --- a/modules/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/Difference.java +++ b/core/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/Difference.java @@ -31,7 +31,7 @@ public enum Difference { private String name; - private Difference(String name) { + Difference(String name) { this.name = name; } diff --git a/modules/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/DifferenceLevel.java b/core/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/DifferenceLevel.java similarity index 95% rename from modules/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/DifferenceLevel.java rename to core/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/DifferenceLevel.java index ddacf7a1..f9b8b9c0 100644 --- a/modules/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/DifferenceLevel.java +++ b/core/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/DifferenceLevel.java @@ -31,7 +31,7 @@ public enum DifferenceLevel { private final String value; - private DifferenceLevel(String value) { + DifferenceLevel(String value) { this.value = value; } diff --git a/modules/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/DifferenceRole.java b/core/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/DifferenceRole.java similarity index 93% rename from modules/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/DifferenceRole.java rename to core/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/DifferenceRole.java index 3fd10d45..32c45d0b 100644 --- a/modules/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/DifferenceRole.java +++ b/core/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/DifferenceRole.java @@ -21,7 +21,7 @@ public enum DifferenceRole { private final String value; - private DifferenceRole(String value) { + DifferenceRole(String value) { this.value = value; } diff --git a/core/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/impl/DefaultCompatibilityFactoryImpl.java b/core/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/impl/DefaultCompatibilityFactoryImpl.java new file mode 100644 index 00000000..45afe423 --- /dev/null +++ b/core/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/impl/DefaultCompatibilityFactoryImpl.java @@ -0,0 +1,27 @@ +package cz.zcu.kiv.crce.compatibility.impl; + +import cz.zcu.kiv.crce.compatibility.*; +import cz.zcu.kiv.crce.metadata.type.Version; + +import java.util.List; + +/** + * Factory which creates default implementations of Compatibility interfaces. + */ +public class DefaultCompatibilityFactoryImpl implements CompatibilityFactory { + + @Override + public Compatibility createCompatibility(String id, String resourceName, Version resourceVersion, String baseName, Version baseVersion, Difference diffValue, List diffValues, Contract contract) { + return new DefaultCompatibilityImpl(id, resourceName, resourceVersion, baseName, baseVersion, diffValue, diffValues, contract); + } + + @Override + public Compatibility createCompatibility(String id, String resourceName, Version resourceVersion, Version baseVersion, Difference diffValue, List diffValues, Contract contract) { + return new DefaultCompatibilityImpl(id, resourceName, resourceVersion, resourceName, baseVersion, diffValue, diffValues, contract); + } + + @Override + public Diff createEmptyDiff() { + return new DefaultDiffImpl(); + } +} diff --git a/core/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/impl/DefaultCompatibilityImpl.java b/core/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/impl/DefaultCompatibilityImpl.java new file mode 100644 index 00000000..f82d5a5a --- /dev/null +++ b/core/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/impl/DefaultCompatibilityImpl.java @@ -0,0 +1,167 @@ +package cz.zcu.kiv.crce.compatibility.impl; + +import cz.zcu.kiv.crce.compatibility.Compatibility; +import cz.zcu.kiv.crce.compatibility.Contract; +import cz.zcu.kiv.crce.compatibility.Diff; +import cz.zcu.kiv.crce.compatibility.Difference; +import cz.zcu.kiv.crce.metadata.type.Version; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.List; + +/** + * Default implementation of Compatibility interface. Serves as a starting point + * for other implementations. + */ +public class DefaultCompatibilityImpl implements Compatibility { + + private String id; + private String resourceName; + private Version resourceVersion; + private String baseResourceName; + private Version baseResourceVersion; + private Difference diffValue; + private List diffDetails; + private Contract contract; + + /** + * Default constructor. Leaves all fields empty. + */ + public DefaultCompatibilityImpl() { + } + + /** + * Fully initialized instance. + * @param id + * @param resourceName + * @param resourceVersion + * @param baseResourceName + * @param baseResourceVersion + * @param diffValue + * @param diffDetails + * @param contract + */ + public DefaultCompatibilityImpl(String id, String resourceName, Version resourceVersion, String baseResourceName, Version baseResourceVersion, Difference diffValue, List diffDetails, Contract contract) { + this.id = id; + this.resourceName = resourceName; + this.resourceVersion = resourceVersion; + this.baseResourceName = baseResourceName; + this.baseResourceVersion = baseResourceVersion; + this.diffValue = diffValue; + this.diffDetails = diffDetails; + this.contract = contract; + } + + @Override + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + @Nonnull + @Override + public String getResourceName() { + return resourceName; + } + + public void setResourceName(String resourceName) { + this.resourceName = resourceName; + } + + @Nonnull + @Override + public Version getResourceVersion() { + return resourceVersion; + } + + public void setResourceVersion(Version resourceVersion) { + this.resourceVersion = resourceVersion; + } + + @Nullable + @Override + public String getBaseResourceName() { + return baseResourceName; + } + + public void setBaseResourceName(String baseResourceName) { + this.baseResourceName = baseResourceName; + } + + @Nonnull + @Override + public Version getBaseResourceVersion() { + return baseResourceVersion; + } + + public void setBaseResourceVersion(Version baseResourceVersion) { + this.baseResourceVersion = baseResourceVersion; + } + + @Nonnull + @Override + public Difference getDiffValue() { + return diffValue; + } + + public void setDiffValue(Difference diffValue) { + this.diffValue = diffValue; + } + + @Nullable + @Override + public List getDiffDetails() { + return diffDetails; + } + + public void setDiffDetails(List diffDetails) { + this.diffDetails = diffDetails; + } + + @Nonnull + @Override + public Contract getContract() { + return contract; + } + + public void setContract(Contract contract) { + this.contract = contract; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + DefaultCompatibilityImpl that = (DefaultCompatibilityImpl) o; + + if (baseResourceName != null ? !baseResourceName.equals(that.baseResourceName) : that.baseResourceName != null) + return false; + if (baseResourceVersion != null ? !baseResourceVersion.equals(that.baseResourceVersion) : that.baseResourceVersion != null) + return false; + if (diffDetails != null ? !diffDetails.equals(that.diffDetails) : that.diffDetails != null) return false; + if (diffValue != that.diffValue) return false; + if (contract != that.contract) return false; + if (resourceName != null ? !resourceName.equals(that.resourceName) : that.resourceName != null) return false; + if (resourceVersion != null ? !resourceVersion.equals(that.resourceVersion) : that.resourceVersion != null) + return false; + + return true; + } + + @Override + public int hashCode() { + int result = resourceName != null ? resourceName.hashCode() : 0; + result = 31 * result + (resourceVersion != null ? resourceVersion.hashCode() : 0); + result = 31 * result + (baseResourceName != null ? baseResourceName.hashCode() : 0); + result = 31 * result + (baseResourceVersion != null ? baseResourceVersion.hashCode() : 0); + result = 31 * result + (diffValue != null ? diffValue.hashCode() : 0); + result = 31 * result + (diffDetails != null ? diffDetails.hashCode() : 0); + result = 31 * result + (contract != null ? contract.hashCode() : 0); + return result; + } +} diff --git a/core/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/impl/DefaultDiffImpl.java b/core/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/impl/DefaultDiffImpl.java new file mode 100644 index 00000000..e465914a --- /dev/null +++ b/core/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/impl/DefaultDiffImpl.java @@ -0,0 +1,115 @@ +package cz.zcu.kiv.crce.compatibility.impl; + +import cz.zcu.kiv.crce.compatibility.Diff; +import cz.zcu.kiv.crce.compatibility.Difference; +import cz.zcu.kiv.crce.compatibility.DifferenceLevel; +import cz.zcu.kiv.crce.compatibility.DifferenceRole; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.List; + +/** + * Default implementation of Diff interface. Serves as a starting point for future + * implementations. + */ +public class DefaultDiffImpl implements Diff { + + private String name; + private Difference value; + private DifferenceLevel level; + private DifferenceRole role; + private List children; + private String namespace; + private String syntax; + + public DefaultDiffImpl() { + this.children = new ArrayList<>(); + this.name = ""; + this.value = Difference.UNK; + this.level = DifferenceLevel.UNKNOWN; + } + + @Nonnull + @Override + public DifferenceLevel getLevel() { + return level; + } + + @Override + public void setLevel(@Nonnull DifferenceLevel level) { + this.level = level; + } + + @Nonnull + @Override + public String getName() { + return name; + } + + @Override + public void setName(@Nonnull String name) { + this.name = name; + } + + @Nonnull + @Override + public Difference getValue() { + return value; + } + + @Override + public void setValue(@Nonnull Difference value) { + this.value = value; + } + + @Nonnull + @Override + public List getChildren() { + return children; + } + + @Override + public void addChild(@Nonnull Diff child) { + this.children.add(child); + } + + @Override + public void addChildren(@Nonnull List children) { + this.children.addAll(children); + } + + @Nullable + @Override + public DifferenceRole getRole() { + return role; + } + + @Override + public void setRole(@Nullable DifferenceRole role) { + this.role = role; + } + + @Nullable + @Override + public String getNamespace() { + return namespace; + } + + @Override + public void setNamespace(@Nullable String namespace) { + this.namespace = namespace; + } + + @Nullable + @Override + public String getSyntax() { + return syntax; + } + + @Override + public void setSyntax(@Nullable String syntax) { + this.syntax = syntax; + } +} diff --git a/modules/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/namespace/NsCrceCompatibility.java b/core/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/namespace/NsCrceCompatibility.java similarity index 100% rename from modules/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/namespace/NsCrceCompatibility.java rename to core/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/namespace/NsCrceCompatibility.java diff --git a/modules/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/service/CompatibilitySearchService.java b/core/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/service/CompatibilitySearchService.java similarity index 100% rename from modules/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/service/CompatibilitySearchService.java rename to core/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/service/CompatibilitySearchService.java diff --git a/modules/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/service/CompatibilityService.java b/core/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/service/CompatibilityService.java similarity index 100% rename from modules/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/service/CompatibilityService.java rename to core/crce-compatibility-api/src/main/java/cz/zcu/kiv/crce/compatibility/service/CompatibilityService.java diff --git a/modules/crce-compatibility-api/src/main/resources/cz/zcu/kiv/crce/compatibility/schema/v1_0_0/compatibility.xsd b/core/crce-compatibility-api/src/main/resources/cz/zcu/kiv/crce/compatibility/schema/v1_0_0/compatibility.xsd similarity index 100% rename from modules/crce-compatibility-api/src/main/resources/cz/zcu/kiv/crce/compatibility/schema/v1_0_0/compatibility.xsd rename to core/crce-compatibility-api/src/main/resources/cz/zcu/kiv/crce/compatibility/schema/v1_0_0/compatibility.xsd diff --git a/core/crce-compatibility-api/src/test/java/cz.zcu.kiv.crce.compatibility/DefaultCompatibilityImplTest.java b/core/crce-compatibility-api/src/test/java/cz.zcu.kiv.crce.compatibility/DefaultCompatibilityImplTest.java new file mode 100644 index 00000000..32842b09 --- /dev/null +++ b/core/crce-compatibility-api/src/test/java/cz.zcu.kiv.crce.compatibility/DefaultCompatibilityImplTest.java @@ -0,0 +1,72 @@ +package cz.zcu.kiv.crce.compatibility; + +import cz.zcu.kiv.crce.compatibility.impl.DefaultCompatibilityFactoryImpl; +import cz.zcu.kiv.crce.compatibility.impl.DefaultDiffImpl; +import cz.zcu.kiv.crce.metadata.type.Version; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +/** + * Test of default implementation of {@link Compatibility} interface. + */ +public class DefaultCompatibilityImplTest { + + private static CompatibilityFactory factory; + + @BeforeClass + public static void beforeClass() { + factory = new DefaultCompatibilityFactoryImpl(); + } + + /** + * Test that factory returns correct compatibility. + */ + @Test + public void factoryTest() { + final String id = "id"; + final String resourceName = "resourceName"; + final Version resourceVersion = new Version(1,0,0); + final String baseName = "baseName"; + final Version baseVersion = new Version(1,0,0); + final Difference diffValue = Difference.NON; + final List diffValues = new ArrayList<>(); + diffValues.add(new DefaultDiffImpl()); + final Contract contract = Contract.SYNTAX; + + // create compatibilities + Compatibility c1 = factory.createCompatibility(id, + resourceName, resourceVersion, baseName, + baseVersion, diffValue, diffValues, contract); + + Compatibility c2 = factory.createCompatibility(id, + resourceName, resourceVersion, baseVersion, + diffValue, diffValues, contract); + + // checks + checkCompatibility(c1, id, resourceName, resourceVersion, baseName, + baseVersion, diffValue, diffValues, contract); + checkCompatibility(c2, id, resourceName, resourceVersion, resourceName, + baseVersion, diffValue, diffValues, contract); + } + + /** + * Checks that the compatibility is not null and all necessary fields are set correctly. + */ + private void checkCompatibility(Compatibility toCheck, String id, String resourceName, Version resourceVersion, String baseName, + Version baseVersion, Difference diffValue, List diffValues, Contract contract) { + assertNotNull("Compatibility is null!", toCheck ); + assertEquals("Wrong id!", id, toCheck.getId()); + assertEquals("Wrong resource name!", resourceName, toCheck.getResourceName()); + assertEquals("Wrong base name!", baseName, toCheck.getBaseResourceName()); + assertEquals("Wrong base version!", baseVersion, toCheck.getBaseResourceVersion()); + assertEquals("Wrong difference value!", diffValue, toCheck.getDiffValue()); + assertEquals("Wrong number of difference values!", diffValues.size(), toCheck.getDiffDetails().size()); + assertEquals("Wrong contract!", contract, toCheck.getContract()); + } +} diff --git a/modules/crce-concurrency/osgi.bnd b/core/crce-concurrency/osgi.bnd similarity index 100% rename from modules/crce-concurrency/osgi.bnd rename to core/crce-concurrency/osgi.bnd diff --git a/modules/crce-concurrency/pom.xml b/core/crce-concurrency/pom.xml similarity index 61% rename from modules/crce-concurrency/pom.xml rename to core/crce-concurrency/pom.xml index 48c4f427..aa87e2f1 100644 --- a/modules/crce-concurrency/pom.xml +++ b/core/crce-concurrency/pom.xml @@ -2,12 +2,24 @@ 4.0.0 + + + + org.apache.maven.plugins + maven-compiler-plugin + + 10 + 10 + + + + - ../pom - cz.zcu.kiv.crce - crce-modules-parent - 2.1.1-SNAPSHOT + cz.zcu.kiv.crce + compiled-bundle-settings + 2.1.2-SNAPSHOT + crce-concurrency diff --git a/modules/crce-concurrency/src/main/java/cz/zcu/kiv/crce/concurrency/internal/Activator.java b/core/crce-concurrency/src/main/java/cz/zcu/kiv/crce/concurrency/internal/Activator.java similarity index 100% rename from modules/crce-concurrency/src/main/java/cz/zcu/kiv/crce/concurrency/internal/Activator.java rename to core/crce-concurrency/src/main/java/cz/zcu/kiv/crce/concurrency/internal/Activator.java diff --git a/modules/crce-concurrency/src/main/java/cz/zcu/kiv/crce/concurrency/internal/TaskRunner.java b/core/crce-concurrency/src/main/java/cz/zcu/kiv/crce/concurrency/internal/TaskRunner.java similarity index 100% rename from modules/crce-concurrency/src/main/java/cz/zcu/kiv/crce/concurrency/internal/TaskRunner.java rename to core/crce-concurrency/src/main/java/cz/zcu/kiv/crce/concurrency/internal/TaskRunner.java diff --git a/modules/crce-concurrency/src/main/java/cz/zcu/kiv/crce/concurrency/model/ChainableTask.java b/core/crce-concurrency/src/main/java/cz/zcu/kiv/crce/concurrency/model/ChainableTask.java similarity index 100% rename from modules/crce-concurrency/src/main/java/cz/zcu/kiv/crce/concurrency/model/ChainableTask.java rename to core/crce-concurrency/src/main/java/cz/zcu/kiv/crce/concurrency/model/ChainableTask.java diff --git a/modules/crce-concurrency/src/main/java/cz/zcu/kiv/crce/concurrency/model/Task.java b/core/crce-concurrency/src/main/java/cz/zcu/kiv/crce/concurrency/model/Task.java similarity index 100% rename from modules/crce-concurrency/src/main/java/cz/zcu/kiv/crce/concurrency/model/Task.java rename to core/crce-concurrency/src/main/java/cz/zcu/kiv/crce/concurrency/model/Task.java diff --git a/modules/crce-concurrency/src/main/java/cz/zcu/kiv/crce/concurrency/model/TaskState.java b/core/crce-concurrency/src/main/java/cz/zcu/kiv/crce/concurrency/model/TaskState.java similarity index 100% rename from modules/crce-concurrency/src/main/java/cz/zcu/kiv/crce/concurrency/model/TaskState.java rename to core/crce-concurrency/src/main/java/cz/zcu/kiv/crce/concurrency/model/TaskState.java diff --git a/modules/crce-concurrency/src/main/java/cz/zcu/kiv/crce/concurrency/service/TaskRunnerService.java b/core/crce-concurrency/src/main/java/cz/zcu/kiv/crce/concurrency/service/TaskRunnerService.java similarity index 100% rename from modules/crce-concurrency/src/main/java/cz/zcu/kiv/crce/concurrency/service/TaskRunnerService.java rename to core/crce-concurrency/src/main/java/cz/zcu/kiv/crce/concurrency/service/TaskRunnerService.java diff --git a/modules/crce-concurrency/src/main/java/cz/zcu/kiv/crce/concurrency/service/internal/TaskRunnerServiceImpl.java b/core/crce-concurrency/src/main/java/cz/zcu/kiv/crce/concurrency/service/internal/TaskRunnerServiceImpl.java similarity index 100% rename from modules/crce-concurrency/src/main/java/cz/zcu/kiv/crce/concurrency/service/internal/TaskRunnerServiceImpl.java rename to core/crce-concurrency/src/main/java/cz/zcu/kiv/crce/concurrency/service/internal/TaskRunnerServiceImpl.java diff --git a/modules/crce-concurrency/src/main/resources/OSGi-INF/service.xml b/core/crce-concurrency/src/main/resources/OSGi-INF/service.xml similarity index 100% rename from modules/crce-concurrency/src/main/resources/OSGi-INF/service.xml rename to core/crce-concurrency/src/main/resources/OSGi-INF/service.xml diff --git a/modules/crce-concurrency/src/test/java/cz/zcu/kiv/crce/concurrency/internal/TaskRunnerTest.java b/core/crce-concurrency/src/test/java/cz/zcu/kiv/crce/concurrency/internal/TaskRunnerTest.java similarity index 100% rename from modules/crce-concurrency/src/test/java/cz/zcu/kiv/crce/concurrency/internal/TaskRunnerTest.java rename to core/crce-concurrency/src/test/java/cz/zcu/kiv/crce/concurrency/internal/TaskRunnerTest.java diff --git a/core/crce-core/pom.xml b/core/crce-core/pom.xml index 1811c2a2..e9cfac4e 100644 --- a/core/crce-core/pom.xml +++ b/core/crce-core/pom.xml @@ -6,7 +6,7 @@ cz.zcu.kiv.crce crce-parent - 2.1.0 + 2.1.1-SNAPSHOT @@ -47,22 +47,22 @@ ${project.groupId} crce-metadata-indexer-impl - 2.1.0 + 2.1.1-SNAPSHOT ${project.groupId} crce-metadata-indexer-api - 2.1.0 + 2.1.1-SNAPSHOT ${project.groupId} crce-metadata-json-api - 2.1.0 + 2.1.1-SNAPSHOT ${project.groupId} crce-metadata-json-impl - 3.0.0 + 3.0.1-SNAPSHOT ${project.groupId} @@ -99,6 +99,17 @@ crce-resolver-impl 2.2.0-SNAPSHOT + + ${project.groupId} + crce-compatibility-api + 2.1.2-SNAPSHOT + + + + + + + diff --git a/core/crce-metadata-api/.classpath b/core/crce-metadata-api/.classpath new file mode 100644 index 00000000..83fc9ed7 --- /dev/null +++ b/core/crce-metadata-api/.classpath @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/crce-metadata-api/.project b/core/crce-metadata-api/.project new file mode 100644 index 00000000..12b7d3a4 --- /dev/null +++ b/core/crce-metadata-api/.project @@ -0,0 +1,55 @@ + + + crce-metadata-api + + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.fusesource.ide.project.RiderProjectBuilder + + + + + org.jboss.tools.jst.web.kb.kbbuilder + + + + + org.jboss.tools.cdi.core.cdibuilder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.pde.PluginNature + org.fusesource.ide.project.RiderProjectNature + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + org.eclipse.wst.common.project.facet.core.nature + org.jboss.tools.jst.web.kb.kbnature + org.jboss.tools.cdi.core.cdinature + + diff --git a/core/crce-metadata-api/pom.xml b/core/crce-metadata-api/pom.xml index 303c5ec3..2bc3821e 100644 --- a/core/crce-metadata-api/pom.xml +++ b/core/crce-metadata-api/pom.xml @@ -6,7 +6,7 @@ cz.zcu.kiv.crce compiled-bundle-settings - 2.1.1 + 2.1.2-SNAPSHOT @@ -47,6 +47,14 @@ + + org.apache.maven.plugins + maven-compiler-plugin + + 10 + 10 + + diff --git a/core/crce-metadata-api/src/main/java/cz/zcu/kiv/crce/metadata/Operator.java b/core/crce-metadata-api/src/main/java/cz/zcu/kiv/crce/metadata/Operator.java index 750b735c..75d52bad 100644 --- a/core/crce-metadata-api/src/main/java/cz/zcu/kiv/crce/metadata/Operator.java +++ b/core/crce-metadata-api/src/main/java/cz/zcu/kiv/crce/metadata/Operator.java @@ -19,7 +19,7 @@ public enum Operator { private final String value; - private Operator(String value) { + Operator(String value) { this.value = value; } diff --git a/core/crce-metadata-dao-api/.classpath b/core/crce-metadata-dao-api/.classpath new file mode 100644 index 00000000..dfdb3d58 --- /dev/null +++ b/core/crce-metadata-dao-api/.classpath @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/crce-metadata-dao-api/.project b/core/crce-metadata-dao-api/.project new file mode 100644 index 00000000..7b6f96fd --- /dev/null +++ b/core/crce-metadata-dao-api/.project @@ -0,0 +1,55 @@ + + + crce-metadata-dao-api + + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.fusesource.ide.project.RiderProjectBuilder + + + + + org.jboss.tools.jst.web.kb.kbbuilder + + + + + org.jboss.tools.cdi.core.cdibuilder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.pde.PluginNature + org.fusesource.ide.project.RiderProjectNature + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + org.eclipse.wst.common.project.facet.core.nature + org.jboss.tools.jst.web.kb.kbnature + org.jboss.tools.cdi.core.cdinature + + diff --git a/core/crce-metadata-dao-api/pom.xml b/core/crce-metadata-dao-api/pom.xml index 483bcd54..f18db8d3 100644 --- a/core/crce-metadata-dao-api/pom.xml +++ b/core/crce-metadata-dao-api/pom.xml @@ -2,11 +2,23 @@ 4.0.0 + + + + org.apache.maven.plugins + maven-compiler-plugin + + 10 + 10 + + + + cz.zcu.kiv.crce compiled-bundle-settings - 2.1.1-SNAPSHOT + 2.1.2-SNAPSHOT @@ -35,7 +47,7 @@ ${project.groupId} crce-metadata-api - 3.0.0 + 3.0.1-SNAPSHOT diff --git a/core/crce-metadata-dao-impl/pom.xml b/core/crce-metadata-dao-impl/pom.xml index 84a14837..46ca58d3 100644 --- a/core/crce-metadata-dao-impl/pom.xml +++ b/core/crce-metadata-dao-impl/pom.xml @@ -6,7 +6,7 @@ cz.zcu.kiv.crce compiled-bundle-settings - 2.1.1 + 2.1.2-SNAPSHOT diff --git a/core/crce-metadata-dao-mongodb/.classpath b/core/crce-metadata-dao-mongodb/.classpath new file mode 100644 index 00000000..dfdb3d58 --- /dev/null +++ b/core/crce-metadata-dao-mongodb/.classpath @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/crce-metadata-dao-mongodb/.project b/core/crce-metadata-dao-mongodb/.project new file mode 100644 index 00000000..b4cc7d47 --- /dev/null +++ b/core/crce-metadata-dao-mongodb/.project @@ -0,0 +1,55 @@ + + + crce-metadata-dao-mongodb + + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.fusesource.ide.project.RiderProjectBuilder + + + + + org.jboss.tools.jst.web.kb.kbbuilder + + + + + org.jboss.tools.cdi.core.cdibuilder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.pde.PluginNature + org.fusesource.ide.project.RiderProjectNature + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + org.eclipse.wst.common.project.facet.core.nature + org.jboss.tools.jst.web.kb.kbnature + org.jboss.tools.cdi.core.cdinature + + diff --git a/core/crce-metadata-dao-mongodb/pom.xml b/core/crce-metadata-dao-mongodb/pom.xml index 44029c5f..4fc28439 100644 --- a/core/crce-metadata-dao-mongodb/pom.xml +++ b/core/crce-metadata-dao-mongodb/pom.xml @@ -34,6 +34,14 @@ org.apache.felix org.apache.felix.dependencymanager.annotation + + org.apache.maven.plugins + maven-compiler-plugin + + 10 + 10 + + diff --git a/core/crce-metadata-dao-mongodb/src/main/java/cz/zcu/kiv/crce/metadata/dao/mongodb/DbContext.java b/core/crce-metadata-dao-mongodb/src/main/java/cz/zcu/kiv/crce/metadata/dao/mongodb/DbContext.java index c2599b61..a0752f50 100644 --- a/core/crce-metadata-dao-mongodb/src/main/java/cz/zcu/kiv/crce/metadata/dao/mongodb/DbContext.java +++ b/core/crce-metadata-dao-mongodb/src/main/java/cz/zcu/kiv/crce/metadata/dao/mongodb/DbContext.java @@ -1,8 +1,9 @@ package cz.zcu.kiv.crce.metadata.dao.mongodb; -import java.net.UnknownHostException; - import com.mongodb.MongoClient; +import com.mongodb.MongoClientURI; + +import java.net.UnknownHostException; /** * Context class responsible for connection management to MongoDB. @@ -20,17 +21,37 @@ public class DbContext { */ public static final String DEFAULT_DB_NAME = "crce"; + /** + * Default connection string for mongo database. + */ + private static final String DEFAULT_CONNECTION = "mongodb://localhost:27017"; + + /** + * Name of environment variable to store connection string. + */ + private static final String ENV_CONNECTION = "mongo_connection"; + + /** + * Field for cache client instance + */ private static MongoClient client; /** * Singleton instance of Mongo connection driver. Client holds its own connection pool and therefore - * should be used as singleton within the application - */ + * should be used as singleton within the application. + * Method try to read environment property which contains connection string {@link DbContext#ENV_CONNECTION} + * for database. + * @see MongoClientURI + * */ public static MongoClient getConnection() throws UnknownHostException { if (client == null) { - client = new MongoClient("localhost", 27017); + String connectionString = DEFAULT_CONNECTION; + if(System.getenv().containsKey(ENV_CONNECTION)) { + connectionString = System.getenv().get(ENV_CONNECTION); + } + MongoClientURI connectionParams = new MongoClientURI(connectionString); + client = new MongoClient(connectionParams); } - return client; } diff --git a/core/crce-metadata-impl/.classpath b/core/crce-metadata-impl/.classpath new file mode 100644 index 00000000..dfdb3d58 --- /dev/null +++ b/core/crce-metadata-impl/.classpath @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/crce-metadata-impl/.project b/core/crce-metadata-impl/.project new file mode 100644 index 00000000..851b7d39 --- /dev/null +++ b/core/crce-metadata-impl/.project @@ -0,0 +1,55 @@ + + + crce-metadata-impl + + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.fusesource.ide.project.RiderProjectBuilder + + + + + org.jboss.tools.jst.web.kb.kbbuilder + + + + + org.jboss.tools.cdi.core.cdibuilder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.pde.PluginNature + org.fusesource.ide.project.RiderProjectNature + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + org.eclipse.wst.common.project.facet.core.nature + org.jboss.tools.jst.web.kb.kbnature + org.jboss.tools.cdi.core.cdinature + + diff --git a/core/crce-metadata-impl/pom.xml b/core/crce-metadata-impl/pom.xml index 1f6c4228..070f3042 100644 --- a/core/crce-metadata-impl/pom.xml +++ b/core/crce-metadata-impl/pom.xml @@ -6,7 +6,7 @@ cz.zcu.kiv.crce compiled-bundle-settings - 2.1.1 + 2.1.2-SNAPSHOT @@ -34,6 +34,14 @@ org.apache.felix org.apache.felix.dependencymanager.annotation + + org.apache.maven.plugins + maven-compiler-plugin + + 10 + 10 + + @@ -46,7 +54,7 @@ ${project.groupId} crce-metadata-json-api - 2.1.0 + 2.1.1-SNAPSHOT true diff --git a/core/crce-metadata-indexer-api/.classpath b/core/crce-metadata-indexer-api/.classpath new file mode 100644 index 00000000..b8b4abe0 --- /dev/null +++ b/core/crce-metadata-indexer-api/.classpath @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/crce-metadata-indexer-api/.project b/core/crce-metadata-indexer-api/.project new file mode 100644 index 00000000..8bf2e807 --- /dev/null +++ b/core/crce-metadata-indexer-api/.project @@ -0,0 +1,30 @@ + + + crce-metadata-indexer-api + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.fusesource.ide.project.RiderProjectBuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.pde.PluginNature + org.fusesource.ide.project.RiderProjectNature + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/core/crce-metadata-indexer-api/pom.xml b/core/crce-metadata-indexer-api/pom.xml index 3524afeb..92ae2340 100644 --- a/core/crce-metadata-indexer-api/pom.xml +++ b/core/crce-metadata-indexer-api/pom.xml @@ -2,11 +2,23 @@ 4.0.0 + + + + org.apache.maven.plugins + maven-compiler-plugin + + 10 + 10 + + + + cz.zcu.kiv.crce compiled-bundle-settings - 2.1.1 + 2.1.2-SNAPSHOT @@ -32,12 +44,12 @@ ${project.groupId} crce-plugin-api - 2.1.0 + 2.1.1-SNAPSHOT ${project.groupId} crce-metadata-api - 3.0.0 + 3.0.1-SNAPSHOT diff --git a/core/crce-metadata-indexer-api/src/main/java/cz/zcu/kiv/crce/metadata/indexer/AbstractResourceIndexer.java b/core/crce-metadata-indexer-api/src/main/java/cz/zcu/kiv/crce/metadata/indexer/AbstractResourceIndexer.java index 843e74d3..3eed5a59 100644 --- a/core/crce-metadata-indexer-api/src/main/java/cz/zcu/kiv/crce/metadata/indexer/AbstractResourceIndexer.java +++ b/core/crce-metadata-indexer-api/src/main/java/cz/zcu/kiv/crce/metadata/indexer/AbstractResourceIndexer.java @@ -1,9 +1,11 @@ package cz.zcu.kiv.crce.metadata.indexer; +import cz.zcu.kiv.crce.metadata.AttributeType; +import cz.zcu.kiv.crce.plugin.AbstractPlugin; + import java.util.Collections; import java.util.List; - -import cz.zcu.kiv.crce.plugin.AbstractPlugin; +import java.util.Map; /** * Abstract implementation of ResourceIndexer which can be extended @@ -31,4 +33,9 @@ public List getPluginKeywords() { public String getPluginDescription() { return "ResourceIndexer plugin implementation"; } + + @Override + public Map> getIndexedAttributes() { + return Collections.emptyMap(); + } } diff --git a/core/crce-metadata-indexer-api/src/main/java/cz/zcu/kiv/crce/metadata/indexer/ResourceIndexer.java b/core/crce-metadata-indexer-api/src/main/java/cz/zcu/kiv/crce/metadata/indexer/ResourceIndexer.java index 5e1b251f..f1369ecf 100644 --- a/core/crce-metadata-indexer-api/src/main/java/cz/zcu/kiv/crce/metadata/indexer/ResourceIndexer.java +++ b/core/crce-metadata-indexer-api/src/main/java/cz/zcu/kiv/crce/metadata/indexer/ResourceIndexer.java @@ -1,13 +1,14 @@ package cz.zcu.kiv.crce.metadata.indexer; -import java.io.InputStream; -import java.util.List; - -import javax.annotation.ParametersAreNonnullByDefault; - +import cz.zcu.kiv.crce.metadata.AttributeType; import cz.zcu.kiv.crce.metadata.Resource; import cz.zcu.kiv.crce.plugin.Plugin; +import javax.annotation.ParametersAreNonnullByDefault; +import java.io.InputStream; +import java.util.List; +import java.util.Map; + /** * Resource indexer indexes content of an artifact and stores obtained metadata * into Resource object. @@ -56,4 +57,12 @@ public interface ResourceIndexer extends Plugin { * @return */ List getRequiredCategories(); + + /** + * Returns a map of namespaces and relevant attributes this components indexes. + * + * @return Collection of attributes this component is capable of indexing. Each collection + * is mapped to its respective namespace. + */ + Map> getIndexedAttributes(); } diff --git a/core/crce-metadata-indexer-impl/.classpath b/core/crce-metadata-indexer-impl/.classpath new file mode 100644 index 00000000..b8b4abe0 --- /dev/null +++ b/core/crce-metadata-indexer-impl/.classpath @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/crce-metadata-indexer-impl/.project b/core/crce-metadata-indexer-impl/.project new file mode 100644 index 00000000..0daf5752 --- /dev/null +++ b/core/crce-metadata-indexer-impl/.project @@ -0,0 +1,30 @@ + + + crce-metadata-indexer-impl + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.fusesource.ide.project.RiderProjectBuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.pde.PluginNature + org.fusesource.ide.project.RiderProjectNature + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/core/crce-metadata-indexer-impl/pom.xml b/core/crce-metadata-indexer-impl/pom.xml index 4e115979..f52fb9a2 100644 --- a/core/crce-metadata-indexer-impl/pom.xml +++ b/core/crce-metadata-indexer-impl/pom.xml @@ -2,11 +2,23 @@ 4.0.0 + + + + org.apache.maven.plugins + maven-compiler-plugin + + 10 + 10 + + + + cz.zcu.kiv.crce compiled-bundle-settings - 2.1.1 + 2.1.2-SNAPSHOT @@ -32,22 +44,22 @@ ${project.groupId} crce-plugin-api - 2.1.0 + 2.1.1-SNAPSHOT ${project.groupId} crce-metadata-api - 3.0.0 + 3.0.1-SNAPSHOT ${project.groupId} crce-metadata-service-api - 3.0.0 + 3.0.1-SNAPSHOT ${project.groupId} crce-metadata-indexer-api - 2.1.0 + 2.1.1-SNAPSHOT diff --git a/core/crce-metadata-json-api/.classpath b/core/crce-metadata-json-api/.classpath new file mode 100644 index 00000000..b8b4abe0 --- /dev/null +++ b/core/crce-metadata-json-api/.classpath @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/crce-metadata-json-api/.project b/core/crce-metadata-json-api/.project new file mode 100644 index 00000000..88425d52 --- /dev/null +++ b/core/crce-metadata-json-api/.project @@ -0,0 +1,30 @@ + + + crce-metadata-json-api + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.fusesource.ide.project.RiderProjectBuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.pde.PluginNature + org.fusesource.ide.project.RiderProjectNature + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/core/crce-metadata-json-api/pom.xml b/core/crce-metadata-json-api/pom.xml index 60b02a3c..b860c353 100644 --- a/core/crce-metadata-json-api/pom.xml +++ b/core/crce-metadata-json-api/pom.xml @@ -2,11 +2,23 @@ 4.0.0 + + + + org.apache.maven.plugins + maven-compiler-plugin + + 10 + 10 + + + + cz.zcu.kiv.crce compiled-bundle-settings - 2.1.1-SNAPSHOT + 2.1.2-SNAPSHOT @@ -32,7 +44,7 @@ ${project.groupId} crce-metadata-api - 2.1.0 + 3.0.1-SNAPSHOT diff --git a/core/crce-metadata-json-impl/.classpath b/core/crce-metadata-json-impl/.classpath new file mode 100644 index 00000000..b8b4abe0 --- /dev/null +++ b/core/crce-metadata-json-impl/.classpath @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/crce-metadata-json-impl/.project b/core/crce-metadata-json-impl/.project new file mode 100644 index 00000000..4cb3aeed --- /dev/null +++ b/core/crce-metadata-json-impl/.project @@ -0,0 +1,30 @@ + + + crce-metadata-json-impl + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.fusesource.ide.project.RiderProjectBuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.pde.PluginNature + org.fusesource.ide.project.RiderProjectNature + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/core/crce-metadata-json-impl/pom.xml b/core/crce-metadata-json-impl/pom.xml index ed874835..9f230303 100644 --- a/core/crce-metadata-json-impl/pom.xml +++ b/core/crce-metadata-json-impl/pom.xml @@ -6,7 +6,7 @@ cz.zcu.kiv.crce compiled-bundle-settings - 2.1.1 + 2.1.2-SNAPSHOT @@ -34,6 +34,14 @@ org.apache.felix org.apache.felix.dependencymanager.annotation + + org.apache.maven.plugins + maven-compiler-plugin + + 10 + 10 + + @@ -55,12 +63,12 @@ ${project.groupId} crce-metadata-api - 3.0.0 + 3.0.1-SNAPSHOT ${project.groupId} crce-metadata-json-api - 2.1.0 + 2.1.1-SNAPSHOT diff --git a/core/crce-metadata-service-api/.classpath b/core/crce-metadata-service-api/.classpath new file mode 100644 index 00000000..dfdb3d58 --- /dev/null +++ b/core/crce-metadata-service-api/.classpath @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/crce-metadata-service-api/.project b/core/crce-metadata-service-api/.project new file mode 100644 index 00000000..70e77ad8 --- /dev/null +++ b/core/crce-metadata-service-api/.project @@ -0,0 +1,55 @@ + + + crce-metadata-service-api + + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.fusesource.ide.project.RiderProjectBuilder + + + + + org.jboss.tools.jst.web.kb.kbbuilder + + + + + org.jboss.tools.cdi.core.cdibuilder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.pde.PluginNature + org.fusesource.ide.project.RiderProjectNature + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + org.eclipse.wst.common.project.facet.core.nature + org.jboss.tools.jst.web.kb.kbnature + org.jboss.tools.cdi.core.cdinature + + diff --git a/core/crce-metadata-service-api/pom.xml b/core/crce-metadata-service-api/pom.xml index 9205a403..d2b11fe6 100644 --- a/core/crce-metadata-service-api/pom.xml +++ b/core/crce-metadata-service-api/pom.xml @@ -2,11 +2,23 @@ 4.0.0 + + + + org.apache.maven.plugins + maven-compiler-plugin + + 10 + 10 + + + + cz.zcu.kiv.crce compiled-bundle-settings - 2.1.1 + 2.1.2-SNAPSHOT @@ -32,7 +44,7 @@ ${project.groupId} crce-metadata-api - 3.0.0 + 3.0.1-SNAPSHOT diff --git a/core/crce-metadata-service-impl/.classpath b/core/crce-metadata-service-impl/.classpath new file mode 100644 index 00000000..dfdb3d58 --- /dev/null +++ b/core/crce-metadata-service-impl/.classpath @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/crce-metadata-service-impl/.project b/core/crce-metadata-service-impl/.project new file mode 100644 index 00000000..a50b870e --- /dev/null +++ b/core/crce-metadata-service-impl/.project @@ -0,0 +1,55 @@ + + + crce-metadata-service-impl + + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.fusesource.ide.project.RiderProjectBuilder + + + + + org.jboss.tools.jst.web.kb.kbbuilder + + + + + org.jboss.tools.cdi.core.cdibuilder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.pde.PluginNature + org.fusesource.ide.project.RiderProjectNature + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + org.eclipse.wst.common.project.facet.core.nature + org.jboss.tools.jst.web.kb.kbnature + org.jboss.tools.cdi.core.cdinature + + diff --git a/core/crce-metadata-service-impl/pom.xml b/core/crce-metadata-service-impl/pom.xml index 64ccfaad..57ba8d95 100644 --- a/core/crce-metadata-service-impl/pom.xml +++ b/core/crce-metadata-service-impl/pom.xml @@ -6,7 +6,7 @@ cz.zcu.kiv.crce compiled-bundle-settings - 2.1.1 + 2.1.2-SNAPSHOT @@ -34,6 +34,14 @@ org.apache.felix org.apache.felix.dependencymanager.annotation + + org.apache.maven.plugins + maven-compiler-plugin + + 10 + 10 + + @@ -44,7 +52,7 @@ ${project.groupId} crce-metadata-api - 3.0.0 + 3.0.1-SNAPSHOT ${project.groupId} diff --git a/core/crce-plugin-api/.classpath b/core/crce-plugin-api/.classpath new file mode 100644 index 00000000..dfdb3d58 --- /dev/null +++ b/core/crce-plugin-api/.classpath @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/crce-plugin-api/.project b/core/crce-plugin-api/.project new file mode 100644 index 00000000..b8fae5ac --- /dev/null +++ b/core/crce-plugin-api/.project @@ -0,0 +1,55 @@ + + + crce-plugin-api + + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.fusesource.ide.project.RiderProjectBuilder + + + + + org.jboss.tools.jst.web.kb.kbbuilder + + + + + org.jboss.tools.cdi.core.cdibuilder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.pde.PluginNature + org.fusesource.ide.project.RiderProjectNature + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + org.eclipse.wst.common.project.facet.core.nature + org.jboss.tools.jst.web.kb.kbnature + org.jboss.tools.cdi.core.cdinature + + diff --git a/core/crce-plugin-api/pom.xml b/core/crce-plugin-api/pom.xml index 7a20350d..68618484 100644 --- a/core/crce-plugin-api/pom.xml +++ b/core/crce-plugin-api/pom.xml @@ -2,11 +2,23 @@ 4.0.0 + + + + org.apache.maven.plugins + maven-compiler-plugin + + 10 + 10 + + + + cz.zcu.kiv.crce compiled-bundle-settings - 2.1.1-SNAPSHOT + 2.1.2-SNAPSHOT diff --git a/core/crce-repository-api/.classpath b/core/crce-repository-api/.classpath new file mode 100644 index 00000000..dfdb3d58 --- /dev/null +++ b/core/crce-repository-api/.classpath @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/crce-repository-api/.project b/core/crce-repository-api/.project new file mode 100644 index 00000000..dbe9c738 --- /dev/null +++ b/core/crce-repository-api/.project @@ -0,0 +1,55 @@ + + + crce-repository-api + + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.fusesource.ide.project.RiderProjectBuilder + + + + + org.jboss.tools.jst.web.kb.kbbuilder + + + + + org.jboss.tools.cdi.core.cdibuilder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.pde.PluginNature + org.fusesource.ide.project.RiderProjectNature + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + org.eclipse.wst.common.project.facet.core.nature + org.jboss.tools.jst.web.kb.kbnature + org.jboss.tools.cdi.core.cdinature + + diff --git a/core/crce-repository-api/pom.xml b/core/crce-repository-api/pom.xml index df6f9e58..f68bcbdf 100644 --- a/core/crce-repository-api/pom.xml +++ b/core/crce-repository-api/pom.xml @@ -2,11 +2,23 @@ 4.0.0 + + + + org.apache.maven.plugins + maven-compiler-plugin + + 10 + 10 + + + + cz.zcu.kiv.crce compiled-bundle-settings - 2.1.1 + 2.1.2-SNAPSHOT @@ -35,12 +47,12 @@ ${project.groupId} crce-metadata-api - 3.0.0 + 3.0.1-SNAPSHOT ${project.groupId} crce-plugin-api - 2.1.0 + 2.1.1-SNAPSHOT diff --git a/core/crce-repository-impl/.classpath b/core/crce-repository-impl/.classpath new file mode 100644 index 00000000..dfdb3d58 --- /dev/null +++ b/core/crce-repository-impl/.classpath @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/crce-repository-impl/.project b/core/crce-repository-impl/.project new file mode 100644 index 00000000..823a8880 --- /dev/null +++ b/core/crce-repository-impl/.project @@ -0,0 +1,55 @@ + + + crce-repository-impl + + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.fusesource.ide.project.RiderProjectBuilder + + + + + org.jboss.tools.jst.web.kb.kbbuilder + + + + + org.jboss.tools.cdi.core.cdibuilder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.pde.PluginNature + org.fusesource.ide.project.RiderProjectNature + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + org.eclipse.wst.common.project.facet.core.nature + org.jboss.tools.jst.web.kb.kbnature + org.jboss.tools.cdi.core.cdinature + + diff --git a/core/crce-repository-impl/pom.xml b/core/crce-repository-impl/pom.xml index dc50f4aa..6b4675e6 100644 --- a/core/crce-repository-impl/pom.xml +++ b/core/crce-repository-impl/pom.xml @@ -6,7 +6,7 @@ cz.zcu.kiv.crce compiled-bundle-settings - 2.1.1 + 2.1.2-SNAPSHOT @@ -34,6 +34,14 @@ org.apache.felix org.apache.felix.dependencymanager.annotation + + org.apache.maven.plugins + maven-compiler-plugin + + 10 + 10 + + @@ -58,12 +66,12 @@ ${project.groupId} crce-metadata-api - 3.0.0 + 3.0.1-SNAPSHOT ${project.groupId} crce-metadata-service-api - 3.0.0 + 3.0.1-SNAPSHOT ${project.groupId} @@ -73,7 +81,7 @@ ${project.groupId} crce-plugin-api - 2.1.0 + 2.1.1-SNAPSHOT ${project.groupId} @@ -88,7 +96,7 @@ ${project.groupId} crce-metadata-indexer-api - 2.1.0 + 2.1.1-SNAPSHOT diff --git a/core/crce-repository-impl/src/main/java/cz/zcu/kiv/crce/repository/filebased/internal/BufferImpl.java b/core/crce-repository-impl/src/main/java/cz/zcu/kiv/crce/repository/filebased/internal/BufferImpl.java index e66271b6..e7903997 100644 --- a/core/crce-repository-impl/src/main/java/cz/zcu/kiv/crce/repository/filebased/internal/BufferImpl.java +++ b/core/crce-repository-impl/src/main/java/cz/zcu/kiv/crce/repository/filebased/internal/BufferImpl.java @@ -421,6 +421,6 @@ private boolean isInBuffer(Resource resource) { if (!"file".equals(uri.getScheme())) { return false; } - return new File(uri).getPath().startsWith(baseDir.getAbsolutePath()); + return true; // rpesek edit: return new File(uri).getPath().startsWith(baseDir.getAbsolutePath()); } } diff --git a/core/crce-repository-impl/src/main/java/cz/zcu/kiv/crce/repository/filebased/internal/FilebasedStoreImpl.java b/core/crce-repository-impl/src/main/java/cz/zcu/kiv/crce/repository/filebased/internal/FilebasedStoreImpl.java index 668bc101..d787f0a9 100644 --- a/core/crce-repository-impl/src/main/java/cz/zcu/kiv/crce/repository/filebased/internal/FilebasedStoreImpl.java +++ b/core/crce-repository-impl/src/main/java/cz/zcu/kiv/crce/repository/filebased/internal/FilebasedStoreImpl.java @@ -285,7 +285,9 @@ public Resource getResource(String uid, boolean withDetails) { @Override public synchronized List getResources() { try { - return metadataDao.loadResources(repository, false); + // Edit rpesek - For webui-v2 retrieval of resources including details (capabilities, requirements) + // return metadataDao.loadResources(repository, false); + return metadataDao.loadResources(repository, true); } catch (IOException e) { logger.error("Could not load resources of repository {}.", baseDir.toURI(), e); } diff --git a/core/crce-resolver-api/.classpath b/core/crce-resolver-api/.classpath new file mode 100644 index 00000000..dfdb3d58 --- /dev/null +++ b/core/crce-resolver-api/.classpath @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/crce-resolver-api/.project b/core/crce-resolver-api/.project new file mode 100644 index 00000000..11cff5eb --- /dev/null +++ b/core/crce-resolver-api/.project @@ -0,0 +1,55 @@ + + + crce-resolver-api + + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.fusesource.ide.project.RiderProjectBuilder + + + + + org.jboss.tools.jst.web.kb.kbbuilder + + + + + org.jboss.tools.cdi.core.cdibuilder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.pde.PluginNature + org.fusesource.ide.project.RiderProjectNature + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + org.eclipse.wst.common.project.facet.core.nature + org.jboss.tools.jst.web.kb.kbnature + org.jboss.tools.cdi.core.cdinature + + diff --git a/core/crce-resolver-api/pom.xml b/core/crce-resolver-api/pom.xml index 1f77b8a8..83cc5426 100644 --- a/core/crce-resolver-api/pom.xml +++ b/core/crce-resolver-api/pom.xml @@ -2,11 +2,23 @@ 4.0.0 + + + + org.apache.maven.plugins + maven-compiler-plugin + + 10 + 10 + + + + cz.zcu.kiv.crce compiled-bundle-settings - 2.1.1 + 2.1.2-SNAPSHOT @@ -35,7 +47,7 @@ ${project.groupId} crce-metadata-api - 3.0.0 + 3.0.1-SNAPSHOT diff --git a/core/crce-resolver-impl/.classpath b/core/crce-resolver-impl/.classpath new file mode 100644 index 00000000..dfdb3d58 --- /dev/null +++ b/core/crce-resolver-impl/.classpath @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/crce-resolver-impl/.project b/core/crce-resolver-impl/.project new file mode 100644 index 00000000..4dec77e2 --- /dev/null +++ b/core/crce-resolver-impl/.project @@ -0,0 +1,55 @@ + + + crce-resolver-impl + + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.fusesource.ide.project.RiderProjectBuilder + + + + + org.jboss.tools.jst.web.kb.kbbuilder + + + + + org.jboss.tools.cdi.core.cdibuilder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.pde.PluginNature + org.fusesource.ide.project.RiderProjectNature + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + org.eclipse.wst.common.project.facet.core.nature + org.jboss.tools.jst.web.kb.kbnature + org.jboss.tools.cdi.core.cdinature + + diff --git a/core/crce-resolver-impl/pom.xml b/core/crce-resolver-impl/pom.xml index 6e0e1cb1..b0e0d0f3 100644 --- a/core/crce-resolver-impl/pom.xml +++ b/core/crce-resolver-impl/pom.xml @@ -6,7 +6,7 @@ cz.zcu.kiv.crce compiled-bundle-settings - 2.1.1 + 2.1.2-SNAPSHOT @@ -34,6 +34,14 @@ org.apache.felix org.apache.felix.dependencymanager.annotation + + org.apache.maven.plugins + maven-compiler-plugin + + 10 + 10 + + diff --git a/modules/crce-webui/osgi.bnd b/core/crce-webui/osgi.bnd similarity index 100% rename from modules/crce-webui/osgi.bnd rename to core/crce-webui/osgi.bnd diff --git a/modules/crce-webui/pom.xml b/core/crce-webui/pom.xml similarity index 76% rename from modules/crce-webui/pom.xml rename to core/crce-webui/pom.xml index 12df6c30..8cd9e1d8 100644 --- a/modules/crce-webui/pom.xml +++ b/core/crce-webui/pom.xml @@ -4,13 +4,14 @@ 4.0.0 - ../pom cz.zcu.kiv.crce - crce-modules-parent - 2.1.1-SNAPSHOT + compiled-bundle-settings + 2.1.2-SNAPSHOT + crce-webui + 2.1.2-SNAPSHOT war CRCE - Web UI @@ -18,6 +19,7 @@ ${namespace}.webui ${namespace}.webui + 2.1.2-SNAPSHOT @@ -87,6 +89,14 @@ + + org.apache.maven.plugins + maven-compiler-plugin + + 10 + 10 + + @@ -132,21 +142,37 @@ + + + + + + + ${project.groupId} - crce-core - pom + crce-compatibility-api + ${compatibility.api.version} - - ${project.groupId} - crce-metadata-osgi-bundle - ${project.version} + cz.zcu.kiv.crce + crce-metadata-dao-api + 3.0.0-SNAPSHOT - ${project.groupId} - crce-compatibility-api - ${project.version} + cz.zcu.kiv.crce + crce-plugin-api + 2.1.1-SNAPSHOT + + + cz.zcu.kiv.crce + crce-repository-api + 2.2.0-SNAPSHOT + + + cz.zcu.kiv.crce + crce-metadata-service-api + 3.0.1-SNAPSHOT @@ -167,14 +193,21 @@ javax.ws.rs javax.ws.rs-api + 2.0 org.glassfish.jersey.containers jersey-container-servlet-core + 2.9.1 org.glassfish.jersey.media jersey-media-multipart + 2.9.1 + + + org.apache.felix + org.apache.felix.bundlerepository diff --git a/modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/Activator.java b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/Activator.java similarity index 100% rename from modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/Activator.java rename to core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/Activator.java diff --git a/modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/CheckServlet.java b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/CheckServlet.java similarity index 97% rename from modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/CheckServlet.java rename to core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/CheckServlet.java index 124026df..f075e75f 100644 --- a/modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/CheckServlet.java +++ b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/CheckServlet.java @@ -1,80 +1,80 @@ -package cz.zcu.kiv.crce.webui.internal; - -import java.io.IOException; -import java.util.Collections; -import java.util.List; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -//import cz.zcu.kiv.crce.metadata.Resolver; -import cz.zcu.kiv.crce.metadata.Resource; -//import cz.zcu.kiv.crce.metadata.ResourceCreator; - -public class CheckServlet extends HttpServlet { - - private static final Logger logger = LoggerFactory.getLogger(CheckServlet.class); - - private static final long serialVersionUID = -6116518932972052481L; - - @Override - protected void doPost(HttpServletRequest req, HttpServletResponse resp) - throws ServletException, IOException { - List res = chooseFrom(req); - if (res == null) { - req.getRequestDispatcher("resource").forward(req, resp); - } else { - String source = (String) req.getSession().getAttribute("source"); - req.getSession().setAttribute(source, res); - req.getSession().removeAttribute("source"); - req.getRequestDispatcher("jsp/" + source + ".jsp").forward(req, resp); - } - - } - - private List chooseFrom(HttpServletRequest req) { - String source = (String) req.getSession().getAttribute("source"); - if (source == null) { - return null; - } else if (source.equals("buffer")) { - return doCheck(Activator.instance().getBuffer(req).getResources()); - } else if (source.equals("store")) { - return doCheck(Activator.instance().getStore(null).getResources()); - } else { - return null; - } - } - - private List doCheck(List resources) { - logger.warn("Resolver is not designed yet in new Metadata API, returning empty list of resources. Checked resource: {}", resources); -// Resource[] resources = repository.getResources(); -// Resource[] cloned = new Resource[resources.length]; -// System.arraycopy(resources, 0, cloned, 0, resources.length); -// ArrayList ext = new ArrayList<>(); -// HashMap extMap = new HashMap<>(); -// ResourceCreator rc = Activator.instance().getCreator(); -// Resolver resolver = rc.createResolver(repository); -// for (Resource r : cloned) { -// resolver.add(r); -// r.getUri(); -// extMap.put(r.getUri(), new ResourceExt(r)); -// ext.add(new ResourceExt(r)); -// } -// if (!resolver.resolve()) { -// for (Reason r : resolver.getUnsatisfiedRequirements()) { -// if (extMap.containsKey(r.getResource().getUri())) { -// extMap.get(r.getResource().getUri()).addRequirement(r.getRequirement()); -// } -// -// } -// return extMap.values().toArray(new Resource[extMap.values().size()]); -// } else { -// return resources; -// } - return Collections.emptyList(); - } -} +package cz.zcu.kiv.crce.webui.internal; + +import java.io.IOException; +import java.util.Collections; +import java.util.List; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +//import cz.zcu.kiv.crce.metadata.Resolver; +import cz.zcu.kiv.crce.metadata.Resource; +//import cz.zcu.kiv.crce.metadata.ResourceCreator; + +public class CheckServlet extends HttpServlet { + + private static final Logger logger = LoggerFactory.getLogger(CheckServlet.class); + + private static final long serialVersionUID = -6116518932972052481L; + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + List res = chooseFrom(req); + if (res == null) { + req.getRequestDispatcher("resource").forward(req, resp); + } else { + String source = (String) req.getSession().getAttribute("source"); + req.getSession().setAttribute(source, res); + req.getSession().removeAttribute("source"); + req.getRequestDispatcher("jsp/" + source + ".jsp").forward(req, resp); + } + + } + + private List chooseFrom(HttpServletRequest req) { + String source = (String) req.getSession().getAttribute("source"); + if (source == null) { + return null; + } else if (source.equals("buffer")) { + return doCheck(Activator.instance().getBuffer(req).getResources()); + } else if (source.equals("store")) { + return doCheck(Activator.instance().getStore(null).getResources()); + } else { + return null; + } + } + + private List doCheck(List resources) { + logger.warn("Resolver is not designed yet in new Metadata API, returning empty list of resources. Checked resource: {}", resources); +// Resource[] resources = repository.getResources(); +// Resource[] cloned = new Resource[resources.length]; +// System.arraycopy(resources, 0, cloned, 0, resources.length); +// ArrayList ext = new ArrayList<>(); +// HashMap extMap = new HashMap<>(); +// ResourceCreator rc = Activator.instance().getCreator(); +// Resolver resolver = rc.createResolver(repository); +// for (Resource r : cloned) { +// resolver.add(r); +// r.getUri(); +// extMap.put(r.getUri(), new ResourceExt(r)); +// ext.add(new ResourceExt(r)); +// } +// if (!resolver.resolve()) { +// for (Reason r : resolver.getUnsatisfiedRequirements()) { +// if (extMap.containsKey(r.getResource().getUri())) { +// extMap.get(r.getResource().getUri()).addRequirement(r.getRequirement()); +// } +// +// } +// return extMap.values().toArray(new Resource[extMap.values().size()]); +// } else { +// return resources; +// } + return Collections.emptyList(); + } +} diff --git a/modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/DownloadServlet.java b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/DownloadServlet.java similarity index 97% rename from modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/DownloadServlet.java rename to core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/DownloadServlet.java index 0f68ce99..983e1328 100644 --- a/modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/DownloadServlet.java +++ b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/DownloadServlet.java @@ -1,132 +1,132 @@ -package cz.zcu.kiv.crce.webui.internal; - -import java.io.DataInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.List; - -import javax.servlet.ServletContext; -import javax.servlet.ServletException; -import javax.servlet.ServletOutputStream; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import cz.zcu.kiv.crce.metadata.Resource; -import cz.zcu.kiv.crce.webui.internal.custom.ResourceExt; - -public class DownloadServlet extends HttpServlet { - - private static final long serialVersionUID = 6399102910617353070L; - - private static final Logger logger = LoggerFactory.getLogger(DownloadServlet.class); - - private static final int BUFSIZE = 128; - - @Override - protected void doPost(HttpServletRequest req, HttpServletResponse resp) - throws ServletException, IOException { - boolean success; - String message; - @SuppressWarnings("unchecked") - List buffer = (List) req.getSession().getAttribute("buffer"); - List list = Activator.instance().getBuffer(req).commit(true); - if (list.size() == buffer.size()) { - success = true; - message = "All resources commited successfully"; - } else { - success = false; - message = "Not all resources commited successfully"; - } - req.getSession().setAttribute("source", "commit"); - ResourceServlet.setError(req.getSession(), success, message); - req.getRequestDispatcher("resource?link=store").forward(req, resp); - } - - @Override - protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - boolean failed = false; - String message; - if (req.getParameter("uri") != null) { - String link = (String) req.getSession().getAttribute("source"); - String uri = req.getParameter("uri"); - try { - URI fileUri = new URI(uri); - if (link != null) { - switch (link) { - case "store": { - List resources = Activator.instance().getStore(null).getResources(); - Resource found = EditServlet.findResource(fileUri, resources); - doDownload(req, resp, found); - break; - } - case "buffer": { - List resources = Activator.instance().getBuffer(req).getResources(); - Resource found = EditServlet.findResource(fileUri, resources); - logger.debug("Found!" + Activator.instance().getMetadataService().getPresentationName(found)); - doDownload(req, resp, found); - break; - } - default: - failed = true; - break; - } - } else { - failed = true; - } - - } catch (IOException e) { - failed = true; - logger.error("Failed to download resource: {}", uri, e); - } catch (URISyntaxException e) { - failed = true; - logger.error("Failed to download resource, invalid URI: {}", uri, e); - } - } else { - failed = true; - } - - if (failed) { - message = "Download failed"; - } else { - message = "Download successful"; - } - ResourceServlet.setError(req.getSession(), !failed, message); - - } - - private void doDownload(HttpServletRequest req, HttpServletResponse resp, Resource found) throws IOException { // NOPMD req would be used in the future - - File f = new File(Activator.instance().getMetadataService().getUri(found)); - int length = 0; - try (ServletOutputStream op = resp.getOutputStream()) { - ServletContext context = getServletConfig().getServletContext(); - String mimetype = context.getMimeType(Activator.instance().getMetadataService().getUri(found).toString()); - - // - // Set the response and go! - // - // - resp.setContentType((mimetype != null) ? mimetype : "application/octet-stream"); - resp.setContentLength((int) f.length()); - resp.setHeader("Content-Disposition", "attachment; filename=\"" + Activator.instance().getMetadataService().getFileName(found) + "\""); - - // - // Stream to the requester. - // - byte[] bbuf = new byte[BUFSIZE]; - try (DataInputStream in = new DataInputStream(new FileInputStream(f))) { - while (in != null && (length = in.read(bbuf)) != -1) { - op.write(bbuf, 0, length); - } - op.flush(); - } - } - } -} +package cz.zcu.kiv.crce.webui.internal; + +import java.io.DataInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.List; + +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import cz.zcu.kiv.crce.metadata.Resource; +import cz.zcu.kiv.crce.webui.internal.custom.ResourceExt; + +public class DownloadServlet extends HttpServlet { + + private static final long serialVersionUID = 6399102910617353070L; + + private static final Logger logger = LoggerFactory.getLogger(DownloadServlet.class); + + private static final int BUFSIZE = 128; + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + boolean success; + String message; + @SuppressWarnings("unchecked") + List buffer = (List) req.getSession().getAttribute("buffer"); + List list = Activator.instance().getBuffer(req).commit(true); + if (list.size() == buffer.size()) { + success = true; + message = "All resources commited successfully"; + } else { + success = false; + message = "Not all resources commited successfully"; + } + req.getSession().setAttribute("source", "commit"); + ResourceServlet.setError(req.getSession(), success, message); + req.getRequestDispatcher("resource?link=store").forward(req, resp); + } + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + boolean failed = false; + String message; + if (req.getParameter("uri") != null) { + String link = (String) req.getSession().getAttribute("source"); + String uri = req.getParameter("uri"); + try { + URI fileUri = new URI(uri); + if (link != null) { + switch (link) { + case "store": { + List resources = Activator.instance().getStore(null).getResources(); + Resource found = EditServlet.findResource(fileUri, resources); + doDownload(req, resp, found); + break; + } + case "buffer": { + List resources = Activator.instance().getBuffer(req).getResources(); + Resource found = EditServlet.findResource(fileUri, resources); + logger.debug("Found!" + Activator.instance().getMetadataService().getPresentationName(found)); + doDownload(req, resp, found); + break; + } + default: + failed = true; + break; + } + } else { + failed = true; + } + + } catch (IOException e) { + failed = true; + logger.error("Failed to download resource: {}", uri, e); + } catch (URISyntaxException e) { + failed = true; + logger.error("Failed to download resource, invalid URI: {}", uri, e); + } + } else { + failed = true; + } + + if (failed) { + message = "Download failed"; + } else { + message = "Download successful"; + } + ResourceServlet.setError(req.getSession(), !failed, message); + + } + + private void doDownload(HttpServletRequest req, HttpServletResponse resp, Resource found) throws IOException { // NOPMD req would be used in the future + + File f = new File(Activator.instance().getMetadataService().getUri(found)); + int length = 0; + try (ServletOutputStream op = resp.getOutputStream()) { + ServletContext context = getServletConfig().getServletContext(); + String mimetype = context.getMimeType(Activator.instance().getMetadataService().getUri(found).toString()); + + // + // Set the response and go! + // + // + resp.setContentType((mimetype != null) ? mimetype : "application/octet-stream"); + resp.setContentLength((int) f.length()); + resp.setHeader("Content-Disposition", "attachment; filename=\"" + Activator.instance().getMetadataService().getFileName(found) + "\""); + + // + // Stream to the requester. + // + byte[] bbuf = new byte[BUFSIZE]; + try (DataInputStream in = new DataInputStream(new FileInputStream(f))) { + while (in != null && (length = in.read(bbuf)) != -1) { + op.write(bbuf, 0, length); + } + op.flush(); + } + } + } +} diff --git a/modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/EditServlet.java b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/EditServlet.java similarity index 97% rename from modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/EditServlet.java rename to core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/EditServlet.java index 801e5898..3121fba0 100644 --- a/modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/EditServlet.java +++ b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/EditServlet.java @@ -1,1023 +1,1023 @@ -package cz.zcu.kiv.crce.webui.internal; - -import java.io.FileNotFoundException; -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.List; -import java.util.Map; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import cz.zcu.kiv.crce.metadata.Attribute; -import cz.zcu.kiv.crce.metadata.Capability; -import cz.zcu.kiv.crce.metadata.Requirement; -import cz.zcu.kiv.crce.metadata.Resource; -import cz.zcu.kiv.crce.metadata.impl.GenericAttributeType; -import cz.zcu.kiv.crce.webui.internal.legacy.Type; - -public class EditServlet extends HttpServlet { - - private static final long serialVersionUID = -4949620462179710290L; - - private static final Logger logger = LoggerFactory.getLogger(EditServlet.class); - - @Override - protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - - boolean success = false; - Map parameters = req.getParameterMap(); - String form = null; - - if (parameters.containsKey("form")) { - form = ((String[]) parameters.get("form"))[0]; - } - if (form != null) { - switch (form) { - case "addCategory": - if (addCategory(req, resp, parameters)) { - success = editCategories(req, resp); - if (!success) { - ResourceServlet.setError(req.getSession(), false, "Cannot add category."); - success = true; - } - } else { - ResourceServlet.setError(req.getSession(), false, "Cannot add category."); - success = true; - } - break; - - case "requirements": - if (saveRequirements(req, resp, parameters)) { - success = editRequirements(req, resp, parameters); - if (!success) { - ResourceServlet.setError(req.getSession(), false, "Cannot save requirements."); - success = true; - } - } - break; - - case "addRequirement": - if (!addRequirementForm(req, resp, parameters)) { - ResourceServlet.setError(req.getSession(), false, "Cannot add requirement."); - } - success = editRequirements(req, resp, parameters); - if (!success) { - ResourceServlet.setError(req.getSession(), false, "Cannot add requirement."); - success = true; - } - break; - - case "capabilities": - if (saveCapabilities(req, resp, parameters)) { - success = editCapabilities(req, resp, parameters); - if (!success) { - ResourceServlet.setError(req.getSession(), false, "Cannot save capabilities."); - success = true; - } - - } else { - ResourceServlet.setError(req.getSession(), false, "Cannot save capabilities."); - success = true; - } - break; - - case "capability": - if (saveCapability(req, resp, parameters)) { - success = editCapabilities(req, resp, parameters, true); - if (!success) { - ResourceServlet.setError(req.getSession(), false, "Cannot add capability."); - success = true; - } - } else { - ResourceServlet.setError(req.getSession(), false, "Cannot add capability."); - success = true; - } - break; - - case "property": - if (!saveProperty(req, resp, parameters)) { - ResourceServlet.setError(req.getSession(), false, "Cannot add property."); - } - success = editCapabilities(req, resp, parameters, true); - if (!success) { - ResourceServlet.setError(req.getSession(), false, "Error while loading capabilities."); - success = true; - } - break; - - case "editProperties": - if (!saveResourceProperty(req, resp, parameters)) { - ResourceServlet.setError(req.getSession(), false, "Cannot change properties."); - } - success = editProperties(req, resp, parameters); - if (!success) { - ResourceServlet.setError(req.getSession(), false, "Error while loading capabilities."); - success = true; - } - break; - - default: - } - } - if (!success) { - resp.sendError(HttpServletResponse.SC_ACCEPTED, "NOT FOUND OR FAILED TO PROCEED"); - } - } - - private boolean saveResourceProperty(HttpServletRequest req, HttpServletResponse resp, Map parameters) { // NOPMD resp would be used in the future - String uri; - if (parameters.containsKey("uri")) { - uri = ((String[]) parameters.get("uri"))[0]; - } else { - return false; - } - try { - URI resURI = new URI(uri); - String link = (String) req.getSession().getAttribute("source"); - List resources = getResources(req, link); - if (resources == null) { - return false; - } - Resource resource = findResource(resURI, resources); - // TODO why was the following here: -// String symbolicName = ((String[]) parameters.get("symbolicName"))[0]; -// String version = ((String[]) parameters.get("version"))[0]; - -// LegacyMetadataHelper.setVersion(Activator.instance().getMetadataFactory(), resource, new Version(version)); -// LegacyMetadataHelper.setSymbolicName(Activator.instance().getMetadataFactory(), resource, symbolicName); - - Activator.instance().getMetadataDao().saveResource(resource); - } catch (URISyntaxException e) { - logger.warn("Can't save resource property: {}", e.getMessage()); - return false; - } catch (FileNotFoundException e) { - logger.error("Can't save resource property, file not found: {}", uri); - return false; - } catch (IOException e) { - logger.error("Can't save resource property", e); - return false; - } - - return true; - } - - private boolean saveProperty(HttpServletRequest req, HttpServletResponse resp, Map parameters) { // NOPMD resp would be used in the future - String uri; - String id; - if (parameters.containsKey("uri") && parameters.containsKey("capabilityId")) { - uri = ((String[]) parameters.get("uri"))[0]; - id = ((String[]) parameters.get("capabilityId"))[0]; - } else { - return false; - } - try { - URI resURI = new URI(uri); - String link = (String) req.getSession().getAttribute("source"); - List array = getResources(req, link); - if (array == null) { - return false; - } - Resource resource = findResource(resURI, array); - Capability capability = resource.getCapabilities().get(Integer.parseInt(id) - 1); - String name = ((String[]) parameters.get("name"))[0]; - String type = ((String[]) parameters.get("propertyType"))[0]; - Object value = ((String[]) parameters.get("value"))[0]; - - try { - capability.setAttribute(new GenericAttributeType(name, type), value); - } catch (IllegalArgumentException e) { - return false; - } - Activator.instance().getMetadataDao().saveResource(resource); - - } catch (URISyntaxException e) { - logger.warn("Can't save property: {}", e.getMessage()); - return false; - } catch (FileNotFoundException e) { - logger.error("Can't save property, file not found: {}", uri); - return false; - } catch (IOException e) { - logger.error("Can't save property", e); - return false; - } - - return true; - } - - private boolean editCapabilities(HttpServletRequest req, - HttpServletResponse resp, Map parameters) { - return editCapabilities(req, resp, parameters, false); - } - - private boolean saveCapability(HttpServletRequest req, - HttpServletResponse resp, Map parameters) { - String uri; - String capabilityName; - if (parameters.containsKey("uri") - && parameters.containsKey("capability")) { - uri = ((String[]) parameters.get("uri"))[0]; - capabilityName = ((String[]) parameters.get("capability"))[0]; - } else { - return false; - } - try { - URI resURI = new URI(uri); - String link = (String) req.getSession().getAttribute("source"); - List array = getResources(req, link); - if (array == null) { - return false; - } - Resource resource = findResource(resURI, array); - int lengthBefore = resource.getCapabilities().size(); - resource.addCapability(Activator.instance().getMetadataFactory().createCapability(capabilityName)); - if (lengthBefore == resource.getCapabilities().size()) { - resp.sendRedirect("resource"); - return false; - } - - Activator.instance().getMetadataDao().saveResource(resource); - - req.setAttribute("capabilityId", String.valueOf(resource.getCapabilities().size())); - } catch (URISyntaxException e) { - logger.warn("Can't save capability: {}", e.getMessage()); - return false; - } catch (FileNotFoundException e) { - logger.error("Can't save capability, file not found: {}", uri); - return false; - } catch (IOException e) { - logger.error("Can't save capability", e); - return false; - } - - return true; - } - - private boolean addRequirementForm(HttpServletRequest req, HttpServletResponse resp, Map parameters) { // NOPMD resp would be used in the future - String uri; - if (parameters.containsKey("uri")) { - uri = ((String[]) parameters.get("uri"))[0]; - } else { - return false; - } - - try { - URI resURI = new URI(uri); - String link = (String) req.getSession().getAttribute("source"); - List array = getResources(req, link); - if (array == null) { - return false; - } - Resource resource = findResource(resURI, array); - String name = null; - Requirement requir = null; - String filter = null; - boolean multiple = false; - boolean extend = false; - boolean optional = false; - Requirement requirBefore = null; - if (parameters.containsKey("name") - && parameters.containsKey("filter")) { - name = ((String[]) parameters.get("name"))[0]; - filter = ((String[]) parameters.get("filter"))[0]; - if (parameters.containsKey("multiple")) { - multiple = ((String[]) parameters.get("multiple"))[0].equals("on"); - } - if (parameters.containsKey("optional")) { - optional = ((String[]) parameters.get("optional"))[0].equals("on"); - } - if (parameters.containsKey("extend")) { - extend = ((String[]) parameters.get("extend"))[0].equals("on"); - } - String comment = null; - if (parameters.containsKey("comment")) { - comment = ((String[]) parameters.get("comment"))[0]; - } - int lengthBefore = resource.getRequirements().size(); - requir = Activator.instance().getMetadataFactory().createRequirement(name); - resource.addRequirement(requir); - if (lengthBefore == resource.getRequirements().size()) { - req.getSession().setAttribute("success", false); - req.getSession().setAttribute("message", "Cannot add requirement."); - return false; - } - try { - logger.warn("OSGi filter is not supported yet with new Metadata API, setting as a directive to track it's usage: {}", filter); - requir.setDirective("filter", filter); - } catch (IllegalArgumentException e) { - resource.removeRequirement(requir); - resource.addRequirement(requirBefore); - } - requir.setDirective("multiple", String.valueOf(multiple)); - requir.setDirective("optional", String.valueOf(optional)); - requir.setDirective("extend", String.valueOf(extend)); - requir.setDirective("comment", comment); - } - Activator.instance().getMetadataDao().saveResource(resource); - } catch (URISyntaxException e) { - logger.warn("Can't add requirement: {}", e.getMessage()); - return false; - } catch (FileNotFoundException e) { - logger.error("Can't add requirement, file not found: {}", uri); - return false; - } catch (IOException e) { - logger.error("Can't requirement", e); - return false; - } - - req.getSession().setAttribute("success", true); - return true; - - } - - private boolean saveCapabilities(HttpServletRequest req, HttpServletResponse resp, Map parameters) { // NOPMD resp would be used in the future - int capabilityId = -1; - String uri; - if (parameters.containsKey("uri") && parameters.containsKey("capabilityId")) { - uri = ((String[]) parameters.get("uri"))[0]; - capabilityId = Integer.parseInt(((String[]) parameters.get("capabilityId"))[0]); - } else { - return false; - } - - try { - URI resURI = new URI(uri); - String link = (String) req.getSession().getAttribute("source"); - List array = getResources(req, link); - if (array == null) { - return false; - } - Resource resource = findResource(resURI, array); - - Capability capability = resource.getCapabilities().get(capabilityId - 1); - List> attributes = capability.getAttributes(); -// Property[] properties = capability.getProperties(); - for (int i = 0; i < attributes.size(); i++) { - String name = ((String[]) parameters.get("name_" + (i + 1)))[0]; - String type = ((String[]) parameters.get("type_" + (i + 1)))[0]; - String value = ((String[]) parameters.get("value_" + (i + 1)))[0]; - Attribute propBefore = attributes.get(i); - int propertiesLengthBefore = attributes.size(); - capability.removeAttribute(attributes.get(i).getAttributeType()); - - if (propertiesLengthBefore == capability.getAttributes().size()) { - req.getSession().setAttribute("success", false); - req.getSession().setAttribute("message", "Cannot change property."); - logger.debug("Cannot change property, resource: {}", resource); - continue; - } - - try { - capability.setAttribute(new GenericAttributeType(name, type), value); - } catch (IllegalArgumentException e) { - capability.setAttribute(propBefore); - req.getSession().setAttribute("success", false); - req.getSession().setAttribute("message", "Cannot change property."); - logger.warn("Cannot change property, resource: {}, capability: {}", resource, capability); - } - } - Activator.instance().getMetadataDao().saveResource(resource); - } catch (URISyntaxException e) { - logger.warn("Can't save capabilities: {}", e.getMessage()); - return false; - } catch (FileNotFoundException e) { - logger.error("Can't save capabilities, file not found: {}", uri); - return false; - } catch (IOException e) { - logger.error("Can't save capabilities", e); - return false; - } - return true; - } - - private boolean saveRequirements(HttpServletRequest req, HttpServletResponse resp, Map parameters) { // NOPMD resp would be used in the future - String uri; - if (parameters.containsKey("uri")) { - uri = ((String[]) parameters.get("uri"))[0]; - } else { - return false; - } - - try { - URI resURI = new URI(uri); - String link = (String) req.getSession().getAttribute("source"); - List array = getResources(req, link); - if (array == null) { - return false; - } - Resource resource = findResource(resURI, array); - - List requirements = resource.getRequirements(); - int requirLengthBefore = 0; - String name = null; - Requirement requir = null; - String filter = null; - String comment = null; - boolean multiple = false; - boolean extend = false; - boolean optional = false; - Requirement requirBefore = null; - for (int i = 0; i < requirements.size(); i++) { - - if (parameters.containsKey("name_" + (i + 1)) - && parameters.containsKey("filter_" + (i + 1))) { - - name = ((String[]) parameters.get("name_" + (i + 1)))[0]; - filter = ((String[]) parameters.get("filter_" + (i + 1)))[0]; - - if (parameters.containsKey("multiple_" + (i + 1))) { - multiple = ((String[]) parameters.get("multiple_" + (i + 1)))[0].equals("on"); - } - if (parameters.containsKey("optional_" + (i + 1))) { - optional = ((String[]) parameters.get("optional_" + (i + 1)))[0].equals("on"); - } - if (parameters.containsKey("extend_" + (i + 1))) { - extend = ((String[]) parameters.get("extend_" + (i + 1)))[0].equals("on"); - } - if (parameters.containsKey("comment_" + (i + 1))) { - comment = ((String[]) parameters.get("comment_" + (i + 1)))[0]; - } -// requirBefore = requirements[i]; - requirLengthBefore = requirements.size(); - resource.removeRequirement(requirements.get(i)); - if (requirLengthBefore == resource.getRequirements().size()) { -//TODO req.getSession().setAttribute("success", false); -//TODO req.getSession().setAttribute("message", "Cannot change requirement."); - continue; - } - requir = Activator.instance().getMetadataFactory().createRequirement(name); - resource.addRequirement(requir); - try { - logger.warn("OSGi filter is not supported yet with new Metadata API, setting as a directive to track it's usage: {}", filter); - requir.setDirective("filter", filter); - } catch (IllegalArgumentException e) { -//TODO req.getSession().setAttribute("success", false); -//TODO req.getSession().setAttribute("message", "Cannot change requirement."); - resource.removeRequirement(requir); - resource.addRequirement(requirBefore); - continue; - } - requir.setDirective("multiple", String.valueOf(multiple)); - requir.setDirective("optional", String.valueOf(optional)); - requir.setDirective("extend", String.valueOf(extend)); - requir.setDirective("comment", comment); -// resource.addRequirement(requir); - } - } - Activator.instance().getMetadataDao().saveResource(resource); - } catch (URISyntaxException e) { - logger.warn("Can't save requirements: {}", e.getMessage()); - return false; - } catch (FileNotFoundException e) { - logger.error("Can't save requirements, file not found: {}", uri); - return false; - } catch (IOException e) { - logger.error("Can't save requirements", e); - return false; - } - return true; - } - - private boolean addCategory(HttpServletRequest req, HttpServletResponse resp, Map parameters) { // NOPMD resp would be used in the future - String category = null; - String uri = null; - if (parameters.containsKey("category") - && parameters.containsKey("uri")) { - category = ((String[]) parameters.get("category"))[0]; - uri = ((String[]) parameters.get("uri"))[0]; - - } else { - return false; - } - - try { - URI resURI = new URI(uri); - String link = (String) req.getSession().getAttribute("source"); - List array = getResources(req, link); - if (array == null) { - return false; - } - Resource resource = findResource(resURI, array); - - - int categoriesLengthBefore = Activator.instance().getMetadataService().getCategories(resource).size(); - Activator.instance().getMetadataService().addCategory(resource, category); - - // check that category was really added - if (categoriesLengthBefore >= Activator.instance().getMetadataService().getCategories(resource).size()) { - req.getSession().setAttribute("success", false); - req.getSession().setAttribute("message", "Cannot add category."); - } - - Activator.instance().getMetadataDao().saveResource(resource); - - } catch (URISyntaxException e) { - logger.warn("Can't add category: {}", e.getMessage()); - return false; - } catch (FileNotFoundException e) { - logger.error("Can't add category, file not found: {}", uri); - return false; - } catch (IOException e) { - logger.error("Can't add category", e); - return false; - } - return true; - } - - @Override - protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - cleanSession(req.getSession()); - - req.getSession().removeAttribute("success"); - boolean success = false; - Map parameters = (Map) req.getParameterMap(); - - String type = null; - if (parameters.containsKey("type")) { - type = ((String[]) parameters.get("type"))[0]; - } - if (type != null) { - switch (type) { - case "deleteCompoment": - success = deleteComponent(req, resp, parameters); - if (!success) { - ResourceServlet.setError(req.getSession(), false, "Cannot delete component."); - success = true; - } - break; - - case "category": - success = editCategories(req, resp); - if (!success) { - ResourceServlet.setError(req.getSession(), false, "Cannot edit category."); - success = true; - } - break; - - case "deleteCategory": - if (!deleteCategory(req, resp, parameters)) { - ResourceServlet.setError(req.getSession(), false, "Cannot delete category."); - success = true; - } - success = editCategories(req, resp); - break; - - case "addCategory": - success = addCategories(req, resp, parameters); - if (!success) { - ResourceServlet.setError(req.getSession(), false, "Cannot add category."); - success = true; - } - break; - - case "addCapability": - success = addCapabilities(req, resp, parameters); - if (!success) { - ResourceServlet.setError(req.getSession(), false, "Cannot add capability."); - success = true; - } - break; - - case "addCapabilityProperty": - success = addCapabilityProperty(req, resp, parameters); - if (!success) { - ResourceServlet.setError(req.getSession(), false, "Cannot add capability."); - success = true; - } - break; - - case "capability": - success = editCapabilities(req, resp, parameters); - if (!success) { - ResourceServlet.setError(req.getSession(), false, "Cannot edit capabilities."); - success = true; - } - break; - - case "requirement": - success = editRequirements(req, resp, parameters); - if (!success) { - ResourceServlet.setError(req.getSession(), false, "Cannot edit requirements."); - success = true; - } - break; - - case "addRequirement": - success = addRequirement(req, resp, parameters); - if (!success) { - ResourceServlet.setError(req.getSession(), false, "Cannot add requirement."); - success = true; - } - break; - - case "properties": - success = editProperties(req, resp, parameters); - if (!success) { - ResourceServlet.setError(req.getSession(), false, "Cannot add requirement."); - success = true; - } - break; - default: - success = false; - break; - } - } - if (!success) { - resp.sendError(HttpServletResponse.SC_ACCEPTED, "NOT FOUND OR FAILED TO PROCEED"); - } - } - - private boolean editProperties(HttpServletRequest req, HttpServletResponse resp, Map parameters) { // NOPMD parameters would be used in the future - String link = (String) req.getSession().getAttribute("source"); - List array = getResources(req, link); - if (array == null) { - return false; - } - String uri = req.getParameter("uri"); - try { - URI resURI = new URI(uri); - Resource resource = findResource(resURI, array); - req.getSession().setAttribute("resource", resource); - req.getRequestDispatcher("jsp/forms/propertiesForm.jsp").forward(req, resp); // FIXME hardcoded - } catch (URISyntaxException e) { - logger.warn("Can't edit properties: {}", e.getMessage()); - return false; - } catch (FileNotFoundException e) { - logger.error("Can't edit properties, file not found: {}", uri); - return false; - } catch (IOException e) { - logger.error("Can't edit properties", e); - return false; - } catch (ServletException e) { - logger.error("Can't forward", e); - return false; - } - return true; - } - - private boolean addCapabilityProperty(HttpServletRequest req, HttpServletResponse resp, Map parameters) { // NOPMD parameters would be used in the future - String link = (String) req.getSession().getAttribute("source"); - List array = getResources(req, link); - if (array == null) { - return false; - } - String uri = req.getParameter("uri"); - try { - URI resURI = new URI(uri); - Resource resource = findResource(resURI, array); - req.getSession().setAttribute("resource", resource); - req.getSession().setAttribute("capabilityId", req.getParameter("capabilityId")); - req.getRequestDispatcher("jsp/forms/propertyForm.jsp").forward(req, resp); // FIXME hardcoded - } catch (URISyntaxException e) { - logger.warn("Can't add capability property: {}", e.getMessage()); - return false; - } catch (FileNotFoundException e) { - logger.error("Can't add capability property, file not found: {}", uri); - return false; - } catch (IOException e) { - logger.error("Can't add capability property", e); - return false; - } catch (ServletException e) { - logger.error("Can't forward", e); - return false; - } - - return true; - } - - private boolean addRequirement(HttpServletRequest req, HttpServletResponse resp, Map parameters) { // NOPMD parameters would be used in the future - - String link = (String) req.getSession().getAttribute("source"); - List array = getResources(req, link); - if (array == null) { - return false; - } - String uri = req.getParameter("uri"); - try { - URI resURI = new URI(uri); - Resource resource = findResource(resURI, array); - req.getSession().setAttribute("resource", resource); - req.getRequestDispatcher("jsp/forms/requirementForm.jsp").forward(req, resp); // FIXME hardcoded - } catch (URISyntaxException e) { - logger.warn("Can't add requirement: {}", e.getMessage()); - return false; - } catch (FileNotFoundException e) { - logger.error("Can't add requirement, file not found: {}", uri); - return false; - } catch (IOException e) { - logger.error("Can't add requirement", e); - return false; - } catch (ServletException e) { - logger.error("Can't forward", e); - return false; - } - - return true; - } - - private boolean editRequirements(HttpServletRequest req, HttpServletResponse resp, Map parameters) { // NOPMD parameters would be used in the future - - String link = (String) req.getSession().getAttribute("source"); - List array = getResources(req, link); - if (array == null) { - return false; - } - - String uri = req.getParameter("uri"); - - try { - URI resURI = new URI(uri); - Resource resource = findResource(resURI, array); - req.getSession().setAttribute("resource", resource); - req.getRequestDispatcher("jsp/forms/requirementsForm.jsp").forward(req, resp); // FIXME hardcoded - } catch (URISyntaxException e) { - logger.warn("Can't edit requirement: {}", e.getMessage()); - return false; - } catch (FileNotFoundException e) { - logger.error("Can't edit requirement, file not found: {}", uri); - return false; - } catch (IOException e) { - logger.error("Can't edit requirement", e); - return false; - } catch (ServletException e) { - logger.error("Can't forward", e); - return false; - } - return true; - } - - private boolean addCapabilities(HttpServletRequest req, HttpServletResponse resp, Map parameters) { // NOPMD parameters would be used in the future - String link = (String) req.getSession().getAttribute("source"); - List array = getResources(req, link); - if (array == null) { - return false; - } - - String uri = req.getParameter("uri"); - - try { - URI resURI = new URI(uri); - Resource resource = findResource(resURI, array); - req.getSession().setAttribute("resource", resource); - req.getSession().setAttribute("types", Type.values()); - req.getRequestDispatcher("jsp/forms/capabilityForm.jsp").forward(req, resp); // FIXME hardcoded - } catch (URISyntaxException e) { - logger.warn("Can't add capabilities: {}", e.getMessage()); - return false; - } catch (FileNotFoundException e) { - logger.error("Can't add capabilities, file not found: {}", uri); - return false; - } catch (IOException e) { - logger.error("Can't add capabilities", e); - return false; - } catch (ServletException e) { - logger.error("Can't forward", e); - return false; - } - - return true; - } - - private boolean editCapabilities(HttpServletRequest req, HttpServletResponse resp, Map parameters, boolean b) { - String link = (String) req.getSession().getAttribute("source"); - List array = getResources(req, link); - if (array == null) { - return false; - } - - String uri = null; - try { - String id = null; - if (b && parameters.containsKey("uri") && req.getAttribute("capabilityId") != null) { - uri = ((String[]) parameters.get("uri"))[0]; - id = (String) req.getAttribute("capabilityId"); - } else if (parameters.containsKey("capabilityId") && parameters.containsKey("uri")) { - uri = ((String[]) parameters.get("uri"))[0]; - id = ((String[]) parameters.get("capabilityId"))[0]; - } else { - return false; - } - Resource resource = findResource(new URI(uri), array); - - req.getSession().setAttribute("resource", resource); - req.getSession().setAttribute("types", Type.values()); - req.getSession().setAttribute("capability", resource.getCapabilities().get(Integer.parseInt(id) - 1)); - req.getSession().setAttribute("capabilityId", id); - req.getRequestDispatcher("jsp/forms/capabilitiesForm.jsp").forward(req, resp); // FIXME hardcoded - } catch (URISyntaxException e) { - logger.warn("Can't edit capabilities: {}", e.getMessage()); - return false; - } catch (FileNotFoundException e) { - logger.error("Can't edit capabilities, file not found: {}", uri); - return false; - } catch (IOException e) { - logger.error("Can't edit capabilities", e); - return false; - } catch (ServletException e) { - logger.error("Can't forward", e); - return false; - } - - return true; - } - - private boolean addCategories(HttpServletRequest req, HttpServletResponse resp, Map parameters) { // NOPMD parameters would be used in the future - - String link = (String) req.getSession().getAttribute("source"); - List array = getResources(req, link); - if (array == null) { - return false; - } - - String uri = req.getParameter("uri"); - try { - URI resURI = new URI(uri); - Resource resource = findResource(resURI, array); - req.getSession().setAttribute("resource", resource); - req.getRequestDispatcher("jsp/forms/categoryForm.jsp").forward(req, resp); // FIXME hardcoded - } catch (URISyntaxException e) { - logger.warn("Can't add capabilities: {}", e.getMessage()); - return false; - } catch (FileNotFoundException e) { - logger.error("Can't add capabilities, file not found: {}", uri); - return false; - } catch (IOException e) { - logger.error("Can't add capabilities", e); - return false; - } catch (ServletException e) { - logger.error("Can't forward", e); - return false; - } - - return true; - } - - private boolean editCategories(HttpServletRequest req, HttpServletResponse resp) { - String link = (String) req.getSession().getAttribute("source"); - List array = getResources(req, link); - if (array == null) { - return false; - } - - String uri = req.getParameter("uri"); - try { - URI resURI = new URI(uri); - Resource resource = findResource(resURI, array); - req.getSession().setAttribute("resource", resource); - req.getRequestDispatcher("jsp/forms/categoriesForm.jsp").forward(req, resp); // FIXME hardcoded - } catch (URISyntaxException e) { - logger.warn("Can't edit categories: {}", e.getMessage()); - return false; - } catch (FileNotFoundException e) { - logger.error("Can't edit categories, file not found: {}", uri); - return false; - } catch (IOException e) { - logger.error("Can't edit categories", e); - return false; - } catch (ServletException e) { - logger.error("Can't forward", e); - return false; - } - - return true; - } - - private boolean deleteCategory(HttpServletRequest req, HttpServletResponse resp, Map parameters) { // NOPMD resp would be used in the future - String category = null; - String uri = null; - if (parameters.containsKey("category") - && parameters.containsKey("uri")) { - category = ((String[]) parameters.get("category"))[0]; - uri = ((String[]) parameters.get("uri"))[0]; - - } else { - return false; - } - try { - URI resURI = new URI(uri); - String link = (String) req.getSession().getAttribute("source"); - List array = getResources(req, link); - if (array == null) { - return false; - } - - Resource resource = findResource(resURI, array); - - int categoriesLengthBefore = Activator.instance().getMetadataService().getCategories(resource).size(); - Activator.instance().getMetadataService().removeCategory(resource, category); - -// Zjištění zda kategorie byla odstraněna. - if (categoriesLengthBefore == Activator.instance().getMetadataService().getCategories(resource).size()) { - return false; - } - - Activator.instance().getMetadataDao().saveResource(resource); - - } catch (URISyntaxException e) { - logger.warn("Can't delete category: {}", e.getMessage()); - return false; - } catch (FileNotFoundException e) { - logger.error("Can't delete category, file not found: {}", uri); - return false; - } catch (IOException e) { - logger.error("Can't delete category", e); - return false; - } - - return true; - } - - private boolean deleteComponent(HttpServletRequest req, HttpServletResponse resp, final Map parameters) { - String link = null; - String uri = null; - if (parameters.containsKey("link") - && parameters.containsKey("uri")) { - link = ((String[]) parameters.get("link"))[0]; - uri = ((String[]) parameters.get("uri"))[0]; - - } else { - return false; - } - try { - URI fileUri = new URI(uri); - if ("store".equals(link)) { - List array = Activator.instance().getStore(getRepositoryId(req)).getResources(); - Resource found = findResource(fileUri, array); - Activator.instance().getStore(getRepositoryId(req)).remove(found); - } else if ("buffer".equals(link)) { - List array = Activator.instance().getBuffer(req).getResources(); - Resource found = findResource(fileUri, array); - if (!Activator.instance().getBuffer(req).remove(found)) { - logger.warn("Buffer didn't contain removed resource: {}", found); - } - } else { - return false; - } - - req.getRequestDispatcher("resource").forward(req, resp); - - } catch (URISyntaxException e) { - logger.warn("Can't delete component: {}", e.getMessage()); - return false; - } catch (FileNotFoundException e) { - logger.error("Can't delete component, file not found: {}", uri); - return false; - } catch (IOException e) { - logger.error("Can't delete component", e); - return false; - } catch (ServletException e) { - logger.error("Can't forward", e); - return false; - } - return true; - } - - public static Resource findResource(URI uri, List array) throws FileNotFoundException { - Resource found = null; - for (Resource r : array) { - if (Activator.instance().getMetadataService().getUri(r).equals(uri)) { - found = r; - break; - } - } - if (found == null) { - throw new FileNotFoundException(); - } - return found; - } - - private static void cleanSession(HttpSession session) { - session.removeAttribute("resource"); - } - - private List getResources(HttpServletRequest req, String link) { - switch (link) { - case "store": - return Activator.instance().getStore(getRepositoryId(req)).getResources(); - case "buffer": - return Activator.instance().getBuffer(req).getResources(); - default: - return null; - } - } - - private String getRepositoryId(HttpServletRequest req) { - String id = req.getParameter("repositoryId"); - if (id == null) { - Map stores = Activator.instance().getRepositories(); - if (stores.isEmpty()) { - return null; - } - id = stores.keySet().iterator().next(); - logger.trace("Store ID not specified, using the first store found: " + id); - } - return id; - } -} +package cz.zcu.kiv.crce.webui.internal; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.List; +import java.util.Map; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import cz.zcu.kiv.crce.metadata.Attribute; +import cz.zcu.kiv.crce.metadata.Capability; +import cz.zcu.kiv.crce.metadata.Requirement; +import cz.zcu.kiv.crce.metadata.Resource; +import cz.zcu.kiv.crce.metadata.impl.GenericAttributeType; +import cz.zcu.kiv.crce.webui.internal.legacy.Type; + +public class EditServlet extends HttpServlet { + + private static final long serialVersionUID = -4949620462179710290L; + + private static final Logger logger = LoggerFactory.getLogger(EditServlet.class); + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + + boolean success = false; + Map parameters = req.getParameterMap(); + String form = null; + + if (parameters.containsKey("form")) { + form = ((String[]) parameters.get("form"))[0]; + } + if (form != null) { + switch (form) { + case "addCategory": + if (addCategory(req, resp, parameters)) { + success = editCategories(req, resp); + if (!success) { + ResourceServlet.setError(req.getSession(), false, "Cannot add category."); + success = true; + } + } else { + ResourceServlet.setError(req.getSession(), false, "Cannot add category."); + success = true; + } + break; + + case "requirements": + if (saveRequirements(req, resp, parameters)) { + success = editRequirements(req, resp, parameters); + if (!success) { + ResourceServlet.setError(req.getSession(), false, "Cannot save requirements."); + success = true; + } + } + break; + + case "addRequirement": + if (!addRequirementForm(req, resp, parameters)) { + ResourceServlet.setError(req.getSession(), false, "Cannot add requirement."); + } + success = editRequirements(req, resp, parameters); + if (!success) { + ResourceServlet.setError(req.getSession(), false, "Cannot add requirement."); + success = true; + } + break; + + case "capabilities": + if (saveCapabilities(req, resp, parameters)) { + success = editCapabilities(req, resp, parameters); + if (!success) { + ResourceServlet.setError(req.getSession(), false, "Cannot save capabilities."); + success = true; + } + + } else { + ResourceServlet.setError(req.getSession(), false, "Cannot save capabilities."); + success = true; + } + break; + + case "capability": + if (saveCapability(req, resp, parameters)) { + success = editCapabilities(req, resp, parameters, true); + if (!success) { + ResourceServlet.setError(req.getSession(), false, "Cannot add capability."); + success = true; + } + } else { + ResourceServlet.setError(req.getSession(), false, "Cannot add capability."); + success = true; + } + break; + + case "property": + if (!saveProperty(req, resp, parameters)) { + ResourceServlet.setError(req.getSession(), false, "Cannot add property."); + } + success = editCapabilities(req, resp, parameters, true); + if (!success) { + ResourceServlet.setError(req.getSession(), false, "Error while loading capabilities."); + success = true; + } + break; + + case "editProperties": + if (!saveResourceProperty(req, resp, parameters)) { + ResourceServlet.setError(req.getSession(), false, "Cannot change properties."); + } + success = editProperties(req, resp, parameters); + if (!success) { + ResourceServlet.setError(req.getSession(), false, "Error while loading capabilities."); + success = true; + } + break; + + default: + } + } + if (!success) { + resp.sendError(HttpServletResponse.SC_ACCEPTED, "NOT FOUND OR FAILED TO PROCEED"); + } + } + + private boolean saveResourceProperty(HttpServletRequest req, HttpServletResponse resp, Map parameters) { // NOPMD resp would be used in the future + String uri; + if (parameters.containsKey("uri")) { + uri = ((String[]) parameters.get("uri"))[0]; + } else { + return false; + } + try { + URI resURI = new URI(uri); + String link = (String) req.getSession().getAttribute("source"); + List resources = getResources(req, link); + if (resources == null) { + return false; + } + Resource resource = findResource(resURI, resources); + // TODO why was the following here: +// String symbolicName = ((String[]) parameters.get("symbolicName"))[0]; +// String version = ((String[]) parameters.get("version"))[0]; + +// LegacyMetadataHelper.setVersion(Activator.instance().getMetadataFactory(), resource, new Version(version)); +// LegacyMetadataHelper.setSymbolicName(Activator.instance().getMetadataFactory(), resource, symbolicName); + + Activator.instance().getMetadataDao().saveResource(resource); + } catch (URISyntaxException e) { + logger.warn("Can't save resource property: {}", e.getMessage()); + return false; + } catch (FileNotFoundException e) { + logger.error("Can't save resource property, file not found: {}", uri); + return false; + } catch (IOException e) { + logger.error("Can't save resource property", e); + return false; + } + + return true; + } + + private boolean saveProperty(HttpServletRequest req, HttpServletResponse resp, Map parameters) { // NOPMD resp would be used in the future + String uri; + String id; + if (parameters.containsKey("uri") && parameters.containsKey("capabilityId")) { + uri = ((String[]) parameters.get("uri"))[0]; + id = ((String[]) parameters.get("capabilityId"))[0]; + } else { + return false; + } + try { + URI resURI = new URI(uri); + String link = (String) req.getSession().getAttribute("source"); + List array = getResources(req, link); + if (array == null) { + return false; + } + Resource resource = findResource(resURI, array); + Capability capability = resource.getCapabilities().get(Integer.parseInt(id) - 1); + String name = ((String[]) parameters.get("name"))[0]; + String type = ((String[]) parameters.get("propertyType"))[0]; + Object value = ((String[]) parameters.get("value"))[0]; + + try { + capability.setAttribute(new GenericAttributeType(name, type), value); + } catch (IllegalArgumentException e) { + return false; + } + Activator.instance().getMetadataDao().saveResource(resource); + + } catch (URISyntaxException e) { + logger.warn("Can't save property: {}", e.getMessage()); + return false; + } catch (FileNotFoundException e) { + logger.error("Can't save property, file not found: {}", uri); + return false; + } catch (IOException e) { + logger.error("Can't save property", e); + return false; + } + + return true; + } + + private boolean editCapabilities(HttpServletRequest req, + HttpServletResponse resp, Map parameters) { + return editCapabilities(req, resp, parameters, false); + } + + private boolean saveCapability(HttpServletRequest req, + HttpServletResponse resp, Map parameters) { + String uri; + String capabilityName; + if (parameters.containsKey("uri") + && parameters.containsKey("capability")) { + uri = ((String[]) parameters.get("uri"))[0]; + capabilityName = ((String[]) parameters.get("capability"))[0]; + } else { + return false; + } + try { + URI resURI = new URI(uri); + String link = (String) req.getSession().getAttribute("source"); + List array = getResources(req, link); + if (array == null) { + return false; + } + Resource resource = findResource(resURI, array); + int lengthBefore = resource.getCapabilities().size(); + resource.addCapability(Activator.instance().getMetadataFactory().createCapability(capabilityName)); + if (lengthBefore == resource.getCapabilities().size()) { + resp.sendRedirect("resource"); + return false; + } + + Activator.instance().getMetadataDao().saveResource(resource); + + req.setAttribute("capabilityId", String.valueOf(resource.getCapabilities().size())); + } catch (URISyntaxException e) { + logger.warn("Can't save capability: {}", e.getMessage()); + return false; + } catch (FileNotFoundException e) { + logger.error("Can't save capability, file not found: {}", uri); + return false; + } catch (IOException e) { + logger.error("Can't save capability", e); + return false; + } + + return true; + } + + private boolean addRequirementForm(HttpServletRequest req, HttpServletResponse resp, Map parameters) { // NOPMD resp would be used in the future + String uri; + if (parameters.containsKey("uri")) { + uri = ((String[]) parameters.get("uri"))[0]; + } else { + return false; + } + + try { + URI resURI = new URI(uri); + String link = (String) req.getSession().getAttribute("source"); + List array = getResources(req, link); + if (array == null) { + return false; + } + Resource resource = findResource(resURI, array); + String name = null; + Requirement requir = null; + String filter = null; + boolean multiple = false; + boolean extend = false; + boolean optional = false; + Requirement requirBefore = null; + if (parameters.containsKey("name") + && parameters.containsKey("filter")) { + name = ((String[]) parameters.get("name"))[0]; + filter = ((String[]) parameters.get("filter"))[0]; + if (parameters.containsKey("multiple")) { + multiple = ((String[]) parameters.get("multiple"))[0].equals("on"); + } + if (parameters.containsKey("optional")) { + optional = ((String[]) parameters.get("optional"))[0].equals("on"); + } + if (parameters.containsKey("extend")) { + extend = ((String[]) parameters.get("extend"))[0].equals("on"); + } + String comment = null; + if (parameters.containsKey("comment")) { + comment = ((String[]) parameters.get("comment"))[0]; + } + int lengthBefore = resource.getRequirements().size(); + requir = Activator.instance().getMetadataFactory().createRequirement(name); + resource.addRequirement(requir); + if (lengthBefore == resource.getRequirements().size()) { + req.getSession().setAttribute("success", false); + req.getSession().setAttribute("message", "Cannot add requirement."); + return false; + } + try { + logger.warn("OSGi filter is not supported yet with new Metadata API, setting as a directive to track it's usage: {}", filter); + requir.setDirective("filter", filter); + } catch (IllegalArgumentException e) { + resource.removeRequirement(requir); + resource.addRequirement(requirBefore); + } + requir.setDirective("multiple", String.valueOf(multiple)); + requir.setDirective("optional", String.valueOf(optional)); + requir.setDirective("extend", String.valueOf(extend)); + requir.setDirective("comment", comment); + } + Activator.instance().getMetadataDao().saveResource(resource); + } catch (URISyntaxException e) { + logger.warn("Can't add requirement: {}", e.getMessage()); + return false; + } catch (FileNotFoundException e) { + logger.error("Can't add requirement, file not found: {}", uri); + return false; + } catch (IOException e) { + logger.error("Can't requirement", e); + return false; + } + + req.getSession().setAttribute("success", true); + return true; + + } + + private boolean saveCapabilities(HttpServletRequest req, HttpServletResponse resp, Map parameters) { // NOPMD resp would be used in the future + int capabilityId = -1; + String uri; + if (parameters.containsKey("uri") && parameters.containsKey("capabilityId")) { + uri = ((String[]) parameters.get("uri"))[0]; + capabilityId = Integer.parseInt(((String[]) parameters.get("capabilityId"))[0]); + } else { + return false; + } + + try { + URI resURI = new URI(uri); + String link = (String) req.getSession().getAttribute("source"); + List array = getResources(req, link); + if (array == null) { + return false; + } + Resource resource = findResource(resURI, array); + + Capability capability = resource.getCapabilities().get(capabilityId - 1); + List> attributes = capability.getAttributes(); +// Property[] properties = capability.getProperties(); + for (int i = 0; i < attributes.size(); i++) { + String name = ((String[]) parameters.get("name_" + (i + 1)))[0]; + String type = ((String[]) parameters.get("type_" + (i + 1)))[0]; + String value = ((String[]) parameters.get("value_" + (i + 1)))[0]; + Attribute propBefore = attributes.get(i); + int propertiesLengthBefore = attributes.size(); + capability.removeAttribute(attributes.get(i).getAttributeType()); + + if (propertiesLengthBefore == capability.getAttributes().size()) { + req.getSession().setAttribute("success", false); + req.getSession().setAttribute("message", "Cannot change property."); + logger.debug("Cannot change property, resource: {}", resource); + continue; + } + + try { + capability.setAttribute(new GenericAttributeType(name, type), value); + } catch (IllegalArgumentException e) { + capability.setAttribute(propBefore); + req.getSession().setAttribute("success", false); + req.getSession().setAttribute("message", "Cannot change property."); + logger.warn("Cannot change property, resource: {}, capability: {}", resource, capability); + } + } + Activator.instance().getMetadataDao().saveResource(resource); + } catch (URISyntaxException e) { + logger.warn("Can't save capabilities: {}", e.getMessage()); + return false; + } catch (FileNotFoundException e) { + logger.error("Can't save capabilities, file not found: {}", uri); + return false; + } catch (IOException e) { + logger.error("Can't save capabilities", e); + return false; + } + return true; + } + + private boolean saveRequirements(HttpServletRequest req, HttpServletResponse resp, Map parameters) { // NOPMD resp would be used in the future + String uri; + if (parameters.containsKey("uri")) { + uri = ((String[]) parameters.get("uri"))[0]; + } else { + return false; + } + + try { + URI resURI = new URI(uri); + String link = (String) req.getSession().getAttribute("source"); + List array = getResources(req, link); + if (array == null) { + return false; + } + Resource resource = findResource(resURI, array); + + List requirements = resource.getRequirements(); + int requirLengthBefore = 0; + String name = null; + Requirement requir = null; + String filter = null; + String comment = null; + boolean multiple = false; + boolean extend = false; + boolean optional = false; + Requirement requirBefore = null; + for (int i = 0; i < requirements.size(); i++) { + + if (parameters.containsKey("name_" + (i + 1)) + && parameters.containsKey("filter_" + (i + 1))) { + + name = ((String[]) parameters.get("name_" + (i + 1)))[0]; + filter = ((String[]) parameters.get("filter_" + (i + 1)))[0]; + + if (parameters.containsKey("multiple_" + (i + 1))) { + multiple = ((String[]) parameters.get("multiple_" + (i + 1)))[0].equals("on"); + } + if (parameters.containsKey("optional_" + (i + 1))) { + optional = ((String[]) parameters.get("optional_" + (i + 1)))[0].equals("on"); + } + if (parameters.containsKey("extend_" + (i + 1))) { + extend = ((String[]) parameters.get("extend_" + (i + 1)))[0].equals("on"); + } + if (parameters.containsKey("comment_" + (i + 1))) { + comment = ((String[]) parameters.get("comment_" + (i + 1)))[0]; + } +// requirBefore = requirements[i]; + requirLengthBefore = requirements.size(); + resource.removeRequirement(requirements.get(i)); + if (requirLengthBefore == resource.getRequirements().size()) { +//TODO req.getSession().setAttribute("success", false); +//TODO req.getSession().setAttribute("message", "Cannot change requirement."); + continue; + } + requir = Activator.instance().getMetadataFactory().createRequirement(name); + resource.addRequirement(requir); + try { + logger.warn("OSGi filter is not supported yet with new Metadata API, setting as a directive to track it's usage: {}", filter); + requir.setDirective("filter", filter); + } catch (IllegalArgumentException e) { +//TODO req.getSession().setAttribute("success", false); +//TODO req.getSession().setAttribute("message", "Cannot change requirement."); + resource.removeRequirement(requir); + resource.addRequirement(requirBefore); + continue; + } + requir.setDirective("multiple", String.valueOf(multiple)); + requir.setDirective("optional", String.valueOf(optional)); + requir.setDirective("extend", String.valueOf(extend)); + requir.setDirective("comment", comment); +// resource.addRequirement(requir); + } + } + Activator.instance().getMetadataDao().saveResource(resource); + } catch (URISyntaxException e) { + logger.warn("Can't save requirements: {}", e.getMessage()); + return false; + } catch (FileNotFoundException e) { + logger.error("Can't save requirements, file not found: {}", uri); + return false; + } catch (IOException e) { + logger.error("Can't save requirements", e); + return false; + } + return true; + } + + private boolean addCategory(HttpServletRequest req, HttpServletResponse resp, Map parameters) { // NOPMD resp would be used in the future + String category = null; + String uri = null; + if (parameters.containsKey("category") + && parameters.containsKey("uri")) { + category = ((String[]) parameters.get("category"))[0]; + uri = ((String[]) parameters.get("uri"))[0]; + + } else { + return false; + } + + try { + URI resURI = new URI(uri); + String link = (String) req.getSession().getAttribute("source"); + List array = getResources(req, link); + if (array == null) { + return false; + } + Resource resource = findResource(resURI, array); + + + int categoriesLengthBefore = Activator.instance().getMetadataService().getCategories(resource).size(); + Activator.instance().getMetadataService().addCategory(resource, category); + + // check that category was really added + if (categoriesLengthBefore >= Activator.instance().getMetadataService().getCategories(resource).size()) { + req.getSession().setAttribute("success", false); + req.getSession().setAttribute("message", "Cannot add category."); + } + + Activator.instance().getMetadataDao().saveResource(resource); + + } catch (URISyntaxException e) { + logger.warn("Can't add category: {}", e.getMessage()); + return false; + } catch (FileNotFoundException e) { + logger.error("Can't add category, file not found: {}", uri); + return false; + } catch (IOException e) { + logger.error("Can't add category", e); + return false; + } + return true; + } + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + cleanSession(req.getSession()); + + req.getSession().removeAttribute("success"); + boolean success = false; + Map parameters = (Map) req.getParameterMap(); + + String type = null; + if (parameters.containsKey("type")) { + type = ((String[]) parameters.get("type"))[0]; + } + if (type != null) { + switch (type) { + case "deleteCompoment": + success = deleteComponent(req, resp, parameters); + if (!success) { + ResourceServlet.setError(req.getSession(), false, "Cannot delete component."); + success = true; + } + break; + + case "category": + success = editCategories(req, resp); + if (!success) { + ResourceServlet.setError(req.getSession(), false, "Cannot edit category."); + success = true; + } + break; + + case "deleteCategory": + if (!deleteCategory(req, resp, parameters)) { + ResourceServlet.setError(req.getSession(), false, "Cannot delete category."); + success = true; + } + success = editCategories(req, resp); + break; + + case "addCategory": + success = addCategories(req, resp, parameters); + if (!success) { + ResourceServlet.setError(req.getSession(), false, "Cannot add category."); + success = true; + } + break; + + case "addCapability": + success = addCapabilities(req, resp, parameters); + if (!success) { + ResourceServlet.setError(req.getSession(), false, "Cannot add capability."); + success = true; + } + break; + + case "addCapabilityProperty": + success = addCapabilityProperty(req, resp, parameters); + if (!success) { + ResourceServlet.setError(req.getSession(), false, "Cannot add capability."); + success = true; + } + break; + + case "capability": + success = editCapabilities(req, resp, parameters); + if (!success) { + ResourceServlet.setError(req.getSession(), false, "Cannot edit capabilities."); + success = true; + } + break; + + case "requirement": + success = editRequirements(req, resp, parameters); + if (!success) { + ResourceServlet.setError(req.getSession(), false, "Cannot edit requirements."); + success = true; + } + break; + + case "addRequirement": + success = addRequirement(req, resp, parameters); + if (!success) { + ResourceServlet.setError(req.getSession(), false, "Cannot add requirement."); + success = true; + } + break; + + case "properties": + success = editProperties(req, resp, parameters); + if (!success) { + ResourceServlet.setError(req.getSession(), false, "Cannot add requirement."); + success = true; + } + break; + default: + success = false; + break; + } + } + if (!success) { + resp.sendError(HttpServletResponse.SC_ACCEPTED, "NOT FOUND OR FAILED TO PROCEED"); + } + } + + private boolean editProperties(HttpServletRequest req, HttpServletResponse resp, Map parameters) { // NOPMD parameters would be used in the future + String link = (String) req.getSession().getAttribute("source"); + List array = getResources(req, link); + if (array == null) { + return false; + } + String uri = req.getParameter("uri"); + try { + URI resURI = new URI(uri); + Resource resource = findResource(resURI, array); + req.getSession().setAttribute("resource", resource); + req.getRequestDispatcher("jsp/forms/propertiesForm.jsp").forward(req, resp); // FIXME hardcoded + } catch (URISyntaxException e) { + logger.warn("Can't edit properties: {}", e.getMessage()); + return false; + } catch (FileNotFoundException e) { + logger.error("Can't edit properties, file not found: {}", uri); + return false; + } catch (IOException e) { + logger.error("Can't edit properties", e); + return false; + } catch (ServletException e) { + logger.error("Can't forward", e); + return false; + } + return true; + } + + private boolean addCapabilityProperty(HttpServletRequest req, HttpServletResponse resp, Map parameters) { // NOPMD parameters would be used in the future + String link = (String) req.getSession().getAttribute("source"); + List array = getResources(req, link); + if (array == null) { + return false; + } + String uri = req.getParameter("uri"); + try { + URI resURI = new URI(uri); + Resource resource = findResource(resURI, array); + req.getSession().setAttribute("resource", resource); + req.getSession().setAttribute("capabilityId", req.getParameter("capabilityId")); + req.getRequestDispatcher("jsp/forms/propertyForm.jsp").forward(req, resp); // FIXME hardcoded + } catch (URISyntaxException e) { + logger.warn("Can't add capability property: {}", e.getMessage()); + return false; + } catch (FileNotFoundException e) { + logger.error("Can't add capability property, file not found: {}", uri); + return false; + } catch (IOException e) { + logger.error("Can't add capability property", e); + return false; + } catch (ServletException e) { + logger.error("Can't forward", e); + return false; + } + + return true; + } + + private boolean addRequirement(HttpServletRequest req, HttpServletResponse resp, Map parameters) { // NOPMD parameters would be used in the future + + String link = (String) req.getSession().getAttribute("source"); + List array = getResources(req, link); + if (array == null) { + return false; + } + String uri = req.getParameter("uri"); + try { + URI resURI = new URI(uri); + Resource resource = findResource(resURI, array); + req.getSession().setAttribute("resource", resource); + req.getRequestDispatcher("jsp/forms/requirementForm.jsp").forward(req, resp); // FIXME hardcoded + } catch (URISyntaxException e) { + logger.warn("Can't add requirement: {}", e.getMessage()); + return false; + } catch (FileNotFoundException e) { + logger.error("Can't add requirement, file not found: {}", uri); + return false; + } catch (IOException e) { + logger.error("Can't add requirement", e); + return false; + } catch (ServletException e) { + logger.error("Can't forward", e); + return false; + } + + return true; + } + + private boolean editRequirements(HttpServletRequest req, HttpServletResponse resp, Map parameters) { // NOPMD parameters would be used in the future + + String link = (String) req.getSession().getAttribute("source"); + List array = getResources(req, link); + if (array == null) { + return false; + } + + String uri = req.getParameter("uri"); + + try { + URI resURI = new URI(uri); + Resource resource = findResource(resURI, array); + req.getSession().setAttribute("resource", resource); + req.getRequestDispatcher("jsp/forms/requirementsForm.jsp").forward(req, resp); // FIXME hardcoded + } catch (URISyntaxException e) { + logger.warn("Can't edit requirement: {}", e.getMessage()); + return false; + } catch (FileNotFoundException e) { + logger.error("Can't edit requirement, file not found: {}", uri); + return false; + } catch (IOException e) { + logger.error("Can't edit requirement", e); + return false; + } catch (ServletException e) { + logger.error("Can't forward", e); + return false; + } + return true; + } + + private boolean addCapabilities(HttpServletRequest req, HttpServletResponse resp, Map parameters) { // NOPMD parameters would be used in the future + String link = (String) req.getSession().getAttribute("source"); + List array = getResources(req, link); + if (array == null) { + return false; + } + + String uri = req.getParameter("uri"); + + try { + URI resURI = new URI(uri); + Resource resource = findResource(resURI, array); + req.getSession().setAttribute("resource", resource); + req.getSession().setAttribute("types", Type.values()); + req.getRequestDispatcher("jsp/forms/capabilityForm.jsp").forward(req, resp); // FIXME hardcoded + } catch (URISyntaxException e) { + logger.warn("Can't add capabilities: {}", e.getMessage()); + return false; + } catch (FileNotFoundException e) { + logger.error("Can't add capabilities, file not found: {}", uri); + return false; + } catch (IOException e) { + logger.error("Can't add capabilities", e); + return false; + } catch (ServletException e) { + logger.error("Can't forward", e); + return false; + } + + return true; + } + + private boolean editCapabilities(HttpServletRequest req, HttpServletResponse resp, Map parameters, boolean b) { + String link = (String) req.getSession().getAttribute("source"); + List array = getResources(req, link); + if (array == null) { + return false; + } + + String uri = null; + try { + String id = null; + if (b && parameters.containsKey("uri") && req.getAttribute("capabilityId") != null) { + uri = ((String[]) parameters.get("uri"))[0]; + id = (String) req.getAttribute("capabilityId"); + } else if (parameters.containsKey("capabilityId") && parameters.containsKey("uri")) { + uri = ((String[]) parameters.get("uri"))[0]; + id = ((String[]) parameters.get("capabilityId"))[0]; + } else { + return false; + } + Resource resource = findResource(new URI(uri), array); + + req.getSession().setAttribute("resource", resource); + req.getSession().setAttribute("types", Type.values()); + req.getSession().setAttribute("capability", resource.getCapabilities().get(Integer.parseInt(id) - 1)); + req.getSession().setAttribute("capabilityId", id); + req.getRequestDispatcher("jsp/forms/capabilitiesForm.jsp").forward(req, resp); // FIXME hardcoded + } catch (URISyntaxException e) { + logger.warn("Can't edit capabilities: {}", e.getMessage()); + return false; + } catch (FileNotFoundException e) { + logger.error("Can't edit capabilities, file not found: {}", uri); + return false; + } catch (IOException e) { + logger.error("Can't edit capabilities", e); + return false; + } catch (ServletException e) { + logger.error("Can't forward", e); + return false; + } + + return true; + } + + private boolean addCategories(HttpServletRequest req, HttpServletResponse resp, Map parameters) { // NOPMD parameters would be used in the future + + String link = (String) req.getSession().getAttribute("source"); + List array = getResources(req, link); + if (array == null) { + return false; + } + + String uri = req.getParameter("uri"); + try { + URI resURI = new URI(uri); + Resource resource = findResource(resURI, array); + req.getSession().setAttribute("resource", resource); + req.getRequestDispatcher("jsp/forms/categoryForm.jsp").forward(req, resp); // FIXME hardcoded + } catch (URISyntaxException e) { + logger.warn("Can't add capabilities: {}", e.getMessage()); + return false; + } catch (FileNotFoundException e) { + logger.error("Can't add capabilities, file not found: {}", uri); + return false; + } catch (IOException e) { + logger.error("Can't add capabilities", e); + return false; + } catch (ServletException e) { + logger.error("Can't forward", e); + return false; + } + + return true; + } + + private boolean editCategories(HttpServletRequest req, HttpServletResponse resp) { + String link = (String) req.getSession().getAttribute("source"); + List array = getResources(req, link); + if (array == null) { + return false; + } + + String uri = req.getParameter("uri"); + try { + URI resURI = new URI(uri); + Resource resource = findResource(resURI, array); + req.getSession().setAttribute("resource", resource); + req.getRequestDispatcher("jsp/forms/categoriesForm.jsp").forward(req, resp); // FIXME hardcoded + } catch (URISyntaxException e) { + logger.warn("Can't edit categories: {}", e.getMessage()); + return false; + } catch (FileNotFoundException e) { + logger.error("Can't edit categories, file not found: {}", uri); + return false; + } catch (IOException e) { + logger.error("Can't edit categories", e); + return false; + } catch (ServletException e) { + logger.error("Can't forward", e); + return false; + } + + return true; + } + + private boolean deleteCategory(HttpServletRequest req, HttpServletResponse resp, Map parameters) { // NOPMD resp would be used in the future + String category = null; + String uri = null; + if (parameters.containsKey("category") + && parameters.containsKey("uri")) { + category = ((String[]) parameters.get("category"))[0]; + uri = ((String[]) parameters.get("uri"))[0]; + + } else { + return false; + } + try { + URI resURI = new URI(uri); + String link = (String) req.getSession().getAttribute("source"); + List array = getResources(req, link); + if (array == null) { + return false; + } + + Resource resource = findResource(resURI, array); + + int categoriesLengthBefore = Activator.instance().getMetadataService().getCategories(resource).size(); + Activator.instance().getMetadataService().removeCategory(resource, category); + +// Zjištění zda kategorie byla odstraněna. + if (categoriesLengthBefore == Activator.instance().getMetadataService().getCategories(resource).size()) { + return false; + } + + Activator.instance().getMetadataDao().saveResource(resource); + + } catch (URISyntaxException e) { + logger.warn("Can't delete category: {}", e.getMessage()); + return false; + } catch (FileNotFoundException e) { + logger.error("Can't delete category, file not found: {}", uri); + return false; + } catch (IOException e) { + logger.error("Can't delete category", e); + return false; + } + + return true; + } + + private boolean deleteComponent(HttpServletRequest req, HttpServletResponse resp, final Map parameters) { + String link = null; + String uri = null; + if (parameters.containsKey("link") + && parameters.containsKey("uri")) { + link = ((String[]) parameters.get("link"))[0]; + uri = ((String[]) parameters.get("uri"))[0]; + + } else { + return false; + } + try { + URI fileUri = new URI(uri); + if ("store".equals(link)) { + List array = Activator.instance().getStore(getRepositoryId(req)).getResources(); + Resource found = findResource(fileUri, array); + Activator.instance().getStore(getRepositoryId(req)).remove(found); + } else if ("buffer".equals(link)) { + List array = Activator.instance().getBuffer(req).getResources(); + Resource found = findResource(fileUri, array); + if (!Activator.instance().getBuffer(req).remove(found)) { + logger.warn("Buffer didn't contain removed resource: {}", found); + } + } else { + return false; + } + + req.getRequestDispatcher("resource").forward(req, resp); + + } catch (URISyntaxException e) { + logger.warn("Can't delete component: {}", e.getMessage()); + return false; + } catch (FileNotFoundException e) { + logger.error("Can't delete component, file not found: {}", uri); + return false; + } catch (IOException e) { + logger.error("Can't delete component", e); + return false; + } catch (ServletException e) { + logger.error("Can't forward", e); + return false; + } + return true; + } + + public static Resource findResource(URI uri, List array) throws FileNotFoundException { + Resource found = null; + for (Resource r : array) { + if (Activator.instance().getMetadataService().getUri(r).equals(uri)) { + found = r; + break; + } + } + if (found == null) { + throw new FileNotFoundException(); + } + return found; + } + + private static void cleanSession(HttpSession session) { + session.removeAttribute("resource"); + } + + private List getResources(HttpServletRequest req, String link) { + switch (link) { + case "store": + return Activator.instance().getStore(getRepositoryId(req)).getResources(); + case "buffer": + return Activator.instance().getBuffer(req).getResources(); + default: + return null; + } + } + + private String getRepositoryId(HttpServletRequest req) { + String id = req.getParameter("repositoryId"); + if (id == null) { + Map stores = Activator.instance().getRepositories(); + if (stores.isEmpty()) { + return null; + } + id = stores.keySet().iterator().next(); + logger.trace("Store ID not specified, using the first store found: " + id); + } + return id; + } +} diff --git a/modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/Helper.java b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/Helper.java similarity index 100% rename from modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/Helper.java rename to core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/Helper.java diff --git a/modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/ResourceServlet.java b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/ResourceServlet.java similarity index 95% rename from modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/ResourceServlet.java rename to core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/ResourceServlet.java index 77aef538..3919ecfd 100644 --- a/modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/ResourceServlet.java +++ b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/ResourceServlet.java @@ -15,6 +15,8 @@ import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; +import cz.zcu.kiv.crce.metadata.AttributeType; +import cz.zcu.kiv.crce.metadata.impl.SimpleAttributeType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -22,7 +24,6 @@ import cz.zcu.kiv.crce.compatibility.CompatibilityVersionComparator; import cz.zcu.kiv.crce.metadata.Requirement; import cz.zcu.kiv.crce.metadata.Resource; -import cz.zcu.kiv.crce.metadata.osgi.namespace.NsOsgiIdentity; import cz.zcu.kiv.crce.metadata.type.Version; import cz.zcu.kiv.crce.plugin.Plugin; import cz.zcu.kiv.crce.webui.internal.bean.Category; @@ -34,6 +35,13 @@ public class ResourceServlet extends HttpServlet { private static final Logger logger = LoggerFactory.getLogger(ResourceServlet.class); + // loose coupling with crce-metadata-osgi-bundle module + // see namespace package in crce-metadata-osgi-bundle + // same variables are declared there + private static final String OSG_IDENTITY_NAMESPACE = "osgi.identity"; + private static final AttributeType ATTRIBUTE_SYMBOLIC_NAME = new SimpleAttributeType<>("symbolic-name", String.class); + public static final AttributeType ATTRIBUTE_VERSION = new SimpleAttributeType<>(org.apache.felix.bundlerepository.Resource.VERSION, Version.class); + @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { @@ -230,10 +238,10 @@ private boolean fillSession(String link, HttpServletRequest req, Requirement fil } session.setAttribute("nodata", false); - Requirement resFilter = Activator.instance().getMetadataFactory().createRequirement(NsOsgiIdentity.NAMESPACE__OSGI_IDENTITY); - resFilter.addAttribute(NsOsgiIdentity.ATTRIBUTE__SYMBOLIC_NAME, name); + Requirement resFilter = Activator.instance().getMetadataFactory().createRequirement(OSG_IDENTITY_NAMESPACE); + resFilter.addAttribute(ATTRIBUTE_SYMBOLIC_NAME, name); Version v = new Version(version); - resFilter.addAttribute(NsOsgiIdentity.ATTRIBUTE__VERSION, v); + resFilter.addAttribute(ATTRIBUTE_VERSION, v); List res = Activator.instance().getStore(id).getResources(resFilter, false); if (!res.isEmpty()) { diff --git a/modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/RuntimeServlet.java b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/RuntimeServlet.java similarity index 97% rename from modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/RuntimeServlet.java rename to core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/RuntimeServlet.java index d0bace62..9c3dabf9 100644 --- a/modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/RuntimeServlet.java +++ b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/RuntimeServlet.java @@ -1,111 +1,111 @@ -package cz.zcu.kiv.crce.webui.internal; - -import java.io.FileNotFoundException; -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.ArrayList; -import java.util.List; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import cz.zcu.kiv.crce.metadata.Resource; -import cz.zcu.kiv.crce.repository.plugins.Executable; - -public class RuntimeServlet extends HttpServlet { - - private static final Logger logger = LoggerFactory.getLogger(RuntimeServlet.class); - - /** - * - */ - private static final long serialVersionUID = 1L; - private String message = null; - - @Override - protected void doPost(HttpServletRequest req, HttpServletResponse resp) - throws ServletException, IOException { - - if (isStoreBufferAction(req)) { - if (setSessionForForm(req)) { - req.getRequestDispatcher("jsp/forms/testForm.jsp").forward(req, resp); // FIXME hardcoded - } else { - message = "No bundles selected"; - logger.warn(message); - ResourceServlet.setError(req.getSession(), false, message); - req.getRequestDispatcher("jsp/" + req.getSession().getAttribute("source") + ".jsp").forward(req, resp); - } - } - ResourceServlet.setError(req.getSession(), false, "Wrong params!"); - req.getRequestDispatcher("resource").forward(req, resp); - - } - - private boolean setSessionForForm(HttpServletRequest req) { - Resource[] toTest = parseParams(req); - if (toTest == null) { - return false; - } else { - HttpSession session = req.getSession(); - ResourceServlet.cleanSession(session); - session.setAttribute("resources", toTest); - List testPlugins = Activator.instance().getPluginManager().getPlugins(Executable.class); - // Executable is not Serializable so this workaround is needed - List testPluginIds = new ArrayList<>(testPlugins.size()); - for (Executable executable : testPlugins) { - testPluginIds.add(executable.getPluginId()); - } - session.setAttribute("tests", testPluginIds); - return true; - } - } - - private List fetchRightResources(String source, HttpServletRequest req) { - Activator a = Activator.instance(); - if (source.equals("store")) { - return a.getStore(null).getResources(); - } else { - return a.getBuffer(req).getResources(); - } - } - - private Resource[] parseParams(HttpServletRequest req) { - - - String[] uris = req.getParameterValues("check"); - if (uris == null || uris.length == 0) { - return null; - } - List resources = fetchRightResources((String) req.getSession().getAttribute("source"), req); - Resource[] toTest = new Resource[uris.length]; - for (int i = 0; i < uris.length; i++) { - try { - toTest[i] = EditServlet.findResource(new URI(uris[i]), resources); - } catch (FileNotFoundException e) { - message = "File not found! Please try again!"; - return null; - } catch (URISyntaxException e) { - message = "Malformed URI cant make URI from param!"; - return null; - } - - } - return toTest; - } - - private boolean isStoreBufferAction(HttpServletRequest req) { - String source = (String) req.getSession().getAttribute("source"); - logger.debug("Runtime servlet POST source: {}", source); - if ("buffer".equals(source) || "store".equals(source)) { - return true; - } else { - return false; - } - } -} +package cz.zcu.kiv.crce.webui.internal; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.List; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import cz.zcu.kiv.crce.metadata.Resource; +import cz.zcu.kiv.crce.repository.plugins.Executable; + +public class RuntimeServlet extends HttpServlet { + + private static final Logger logger = LoggerFactory.getLogger(RuntimeServlet.class); + + /** + * + */ + private static final long serialVersionUID = 1L; + private String message = null; + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + + if (isStoreBufferAction(req)) { + if (setSessionForForm(req)) { + req.getRequestDispatcher("jsp/forms/testForm.jsp").forward(req, resp); // FIXME hardcoded + } else { + message = "No bundles selected"; + logger.warn(message); + ResourceServlet.setError(req.getSession(), false, message); + req.getRequestDispatcher("jsp/" + req.getSession().getAttribute("source") + ".jsp").forward(req, resp); + } + } + ResourceServlet.setError(req.getSession(), false, "Wrong params!"); + req.getRequestDispatcher("resource").forward(req, resp); + + } + + private boolean setSessionForForm(HttpServletRequest req) { + Resource[] toTest = parseParams(req); + if (toTest == null) { + return false; + } else { + HttpSession session = req.getSession(); + ResourceServlet.cleanSession(session); + session.setAttribute("resources", toTest); + List testPlugins = Activator.instance().getPluginManager().getPlugins(Executable.class); + // Executable is not Serializable so this workaround is needed + List testPluginIds = new ArrayList<>(testPlugins.size()); + for (Executable executable : testPlugins) { + testPluginIds.add(executable.getPluginId()); + } + session.setAttribute("tests", testPluginIds); + return true; + } + } + + private List fetchRightResources(String source, HttpServletRequest req) { + Activator a = Activator.instance(); + if (source.equals("store")) { + return a.getStore(null).getResources(); + } else { + return a.getBuffer(req).getResources(); + } + } + + private Resource[] parseParams(HttpServletRequest req) { + + + String[] uris = req.getParameterValues("check"); + if (uris == null || uris.length == 0) { + return null; + } + List resources = fetchRightResources((String) req.getSession().getAttribute("source"), req); + Resource[] toTest = new Resource[uris.length]; + for (int i = 0; i < uris.length; i++) { + try { + toTest[i] = EditServlet.findResource(new URI(uris[i]), resources); + } catch (FileNotFoundException e) { + message = "File not found! Please try again!"; + return null; + } catch (URISyntaxException e) { + message = "Malformed URI cant make URI from param!"; + return null; + } + + } + return toTest; + } + + private boolean isStoreBufferAction(HttpServletRequest req) { + String source = (String) req.getSession().getAttribute("source"); + logger.debug("Runtime servlet POST source: {}", source); + if ("buffer".equals(source) || "store".equals(source)) { + return true; + } else { + return false; + } + } +} diff --git a/modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/SessionListener.java b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/SessionListener.java similarity index 100% rename from modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/SessionListener.java rename to core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/SessionListener.java diff --git a/modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/UploadServlet.java b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/UploadServlet.java similarity index 100% rename from modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/UploadServlet.java rename to core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/UploadServlet.java diff --git a/modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/VersionInfo.java b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/VersionInfo.java similarity index 100% rename from modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/VersionInfo.java rename to core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/VersionInfo.java diff --git a/modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/bean/Category.java b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/bean/Category.java similarity index 100% rename from modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/bean/Category.java rename to core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/bean/Category.java diff --git a/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/CapabilityImpl.java b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/CapabilityImpl.java new file mode 100644 index 00000000..33c8e0e6 --- /dev/null +++ b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/CapabilityImpl.java @@ -0,0 +1,131 @@ +package cz.zcu.kiv.crce.webui.internal.custom; + +import cz.zcu.kiv.crce.metadata.Attribute; +import cz.zcu.kiv.crce.metadata.Capability; +import cz.zcu.kiv.crce.metadata.Property; +import cz.zcu.kiv.crce.metadata.type.Version; +import cz.zcu.kiv.crce.webui.internal.legacy.NewProperty; +import cz.zcu.kiv.crce.webui.internal.legacy.Type; + +import java.net.URI; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +public class CapabilityImpl implements cz.zcu.kiv.crce.webui.internal.legacy.Capability { + + private final Capability capability; + + public CapabilityImpl(Capability capability) { + this.capability = capability; + } + + @Override + public String getName() { + return capability.getNamespace(); + } + + @Override + public NewProperty[] getNewProperties() { + List newProperties = capability.getProperties(); + NewProperty[] properties = new NewProperty[newProperties.size()]; + int i = 0; + for (Property newProperty : newProperties) { + properties[i++] = new NewPropertyImpl(newProperty); + } + return properties; + } + + @Override + public cz.zcu.kiv.crce.webui.internal.legacy.Property[] getProperties() { + List> attributes = capability.getAttributes(); + cz.zcu.kiv.crce.webui.internal.legacy.Property[] properties = new cz.zcu.kiv.crce.webui.internal.legacy.Property[attributes.size()]; + int i = 0; + for (Attribute attribute : attributes) { + properties[i++] = new PropertyImpl(attribute); + } + return properties; + } + + @Override + public cz.zcu.kiv.crce.webui.internal.legacy.Property getProperty(String name) { + Attribute attribute = capability.getAttributesMap().get(name); + if (attribute != null) { + return new PropertyImpl(attribute); + } + return null; + } + + @Override + public String getPropertyString(String name) { + Attribute attribute = capability.getAttributesMap().get(name); + if (attribute != null) { + return attribute.getStringValue(); + } + return null; + } + + @Override + @SuppressWarnings("unchecked") + public cz.zcu.kiv.crce.webui.internal.legacy.Capability setProperty(cz.zcu.kiv.crce.webui.internal.legacy.Property property) { + capability.setAttribute(property.getName(), (Class) property.getType().getTypeClass(), property.getConvertedValue()); + return this; + } + + @Override + @SuppressWarnings("unchecked") + public cz.zcu.kiv.crce.webui.internal.legacy.Capability setProperty(String name, String value, Type type) { + capability.setAttribute(name, (Class) type.getTypeClass(), Type.propertyValueFromString(type, value)); + return this; + } + + @Override + public cz.zcu.kiv.crce.webui.internal.legacy.Capability setProperty(String name, String value) { + capability.setAttribute(name, String.class, value); + return this; + } + + @Override + public cz.zcu.kiv.crce.webui.internal.legacy.Capability setProperty(String name, Version version) { + capability.setAttribute(name, Version.class, version); + return this; + } + + @Override + public cz.zcu.kiv.crce.webui.internal.legacy.Capability setProperty(String name, URL url) { + capability.setAttribute(name, String.class, url.toString()); + return this; + } + + @Override + public cz.zcu.kiv.crce.webui.internal.legacy.Capability setProperty(String name, URI uri) { + capability.setAttribute(name, String.class, uri.toString()); + return this; + } + + @Override + public cz.zcu.kiv.crce.webui.internal.legacy.Capability setProperty(String name, long llong) { + capability.setAttribute(name, Long.class, llong); + return this; + } + + @Override + public cz.zcu.kiv.crce.webui.internal.legacy.Capability setProperty(String name, double ddouble) { + capability.setAttribute(name, Double.class, ddouble); + return this; + } + + @Override + @SuppressWarnings("unchecked") + public cz.zcu.kiv.crce.webui.internal.legacy.Capability setProperty(String name, Set values) { + capability.setAttribute(name, List.class, new ArrayList<>(values)); + return this; + } + + @Override + public cz.zcu.kiv.crce.webui.internal.legacy.Capability unsetProperty(String name) { + capability.removeAttribute(name); + return this; + } +} diff --git a/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/NewPropertyImpl.java b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/NewPropertyImpl.java new file mode 100644 index 00000000..1a9c086d --- /dev/null +++ b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/NewPropertyImpl.java @@ -0,0 +1,120 @@ +package cz.zcu.kiv.crce.webui.internal.custom; + +import cz.zcu.kiv.crce.metadata.Attribute; +import cz.zcu.kiv.crce.metadata.type.Version; +import cz.zcu.kiv.crce.webui.internal.legacy.NewProperty; +import cz.zcu.kiv.crce.webui.internal.legacy.Property; +import cz.zcu.kiv.crce.webui.internal.legacy.Type; + +import java.net.URI; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +public class NewPropertyImpl implements NewProperty { + + private final cz.zcu.kiv.crce.metadata.Property property; + + public NewPropertyImpl(cz.zcu.kiv.crce.metadata.Property property) { + this.property = property; + } + + @Override + public String getName() { + return property.getNamespace(); + } + + @Override + public Property[] getProperties() { + List> attributes = property.getAttributes(); + Property[] properties = new Property[attributes.size()]; + int i = 0; + for (Attribute attribute : attributes) { + properties[i++] = new PropertyImpl(attribute); + } + return properties; + } + + @Override + public Property getProperty(String name) { + Attribute attribute = property.getAttributesMap().get(name); + if (attribute != null) { + return new PropertyImpl(attribute); + } + return null; + } + + @Override + public String getPropertyString(String name) { + Attribute attribute = property.getAttributesMap().get(name); + if (attribute != null) { + return attribute.getStringValue(); + } + return null; + } + + @SuppressWarnings("unchecked") + @Override + public NewProperty setProperty(Property property) { + this.property.setAttribute(property.getName(), (Class) property.getType().getTypeClass(), property.getConvertedValue()); + return this; + } + + @SuppressWarnings("unchecked") + @Override + public NewProperty setProperty(String name, String value, Type type) { + this.property.setAttribute(name, (Class) type.getTypeClass(), Type.propertyValueFromString(type, value)); + return this; + } + + @Override + public NewProperty setProperty(String name, String string) { + this.property.setAttribute(name, String.class, string); + return this; + } + + @Override + public NewProperty setProperty(String name, Version version) { + this.property.setAttribute(name, Version.class, version); + return this; + } + + @Override + public NewProperty setProperty(String name, URL url) { + this.property.setAttribute(name, String.class, url.toString()); + return this; + } + + @Override + public NewProperty setProperty(String name, URI uri) { + this.property.setAttribute(name, String.class, uri.toString()); + return this; + } + + @Override + public NewProperty setProperty(String name, long llong) { + this.property.setAttribute(name, Long.class, llong); + return this; + } + + @Override + public NewProperty setProperty(String name, double ddouble) { + this.property.setAttribute(name, Double.class, ddouble); + return this; + } + + @SuppressWarnings("unchecked") + @Override + public NewProperty setProperty(String name, Set values) { + this.property.setAttribute(name, List.class, new ArrayList<>(values)); + return this; + } + + @Override + public NewProperty unsetProperty(String name) { + this.property.removeAttribute(name); + return this; + } + +} \ No newline at end of file diff --git a/modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/Plugin.java b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/Plugin.java similarity index 100% rename from modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/Plugin.java rename to core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/Plugin.java diff --git a/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/PropertyImpl.java b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/PropertyImpl.java new file mode 100644 index 00000000..a62a6933 --- /dev/null +++ b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/PropertyImpl.java @@ -0,0 +1,45 @@ +package cz.zcu.kiv.crce.webui.internal.custom; + +import cz.zcu.kiv.crce.metadata.Attribute; +import cz.zcu.kiv.crce.webui.internal.legacy.Property; +import cz.zcu.kiv.crce.webui.internal.legacy.Type; + +public class PropertyImpl implements Property { + + private final Attribute attribute; + + public PropertyImpl(Attribute attribute) { + this.attribute = attribute; + } + + @Override + public String getName() { + return attribute.getAttributeType().getName(); + } + + @Override + public Type getType() { + return Type.getValue(attribute.getAttributeType().getType().getSimpleName()); + } + + @Override + public String getValue() { + + Object value = attribute.getValue(); + if (value instanceof Double) { + return String.format("%.3f", value); + } + + return attribute.getStringValue(); + } + + @Override + public Object getConvertedValue() { + return attribute.getValue(); + } + + @Override + public boolean isWritable() { + return true; + } +} diff --git a/modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/RequirementAdapter.java b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/RequirementAdapter.java similarity index 95% rename from modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/RequirementAdapter.java rename to core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/RequirementAdapter.java index 47307bb0..2fe19dba 100644 --- a/modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/RequirementAdapter.java +++ b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/RequirementAdapter.java @@ -1,85 +1,85 @@ -package cz.zcu.kiv.crce.webui.internal.custom; - -import cz.zcu.kiv.crce.webui.internal.legacy.Capability; -import cz.zcu.kiv.crce.webui.internal.legacy.Requirement; - -public class RequirementAdapter implements Requirement { - - @Override - public String getName() { - // TODO Auto-generated method stub - return null; - } - - @Override - public String getFilter() { - // TODO Auto-generated method stub - return null; - } - - @Override - public boolean isMultiple() { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean isOptional() { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean isExtend() { - // TODO Auto-generated method stub - return false; - } - - @Override - public String getComment() { - // TODO Auto-generated method stub - return null; - } - - @Override - public boolean isWritable() { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean isSatisfied(Capability capability) { - // TODO Auto-generated method stub - return false; - } - - @Override - public Requirement setFilter(String filter) { - // TODO Auto-generated method stub - return null; - } - - @Override - public Requirement setMultiple(boolean multiple) { - // TODO Auto-generated method stub - return null; - } - - @Override - public Requirement setOptional(boolean optional) { - // TODO Auto-generated method stub - return null; - } - - @Override - public Requirement setExtend(boolean extend) { - // TODO Auto-generated method stub - return null; - } - - @Override - public Requirement setComment(String comment) { - // TODO Auto-generated method stub - return null; - } -} +package cz.zcu.kiv.crce.webui.internal.custom; + +import cz.zcu.kiv.crce.webui.internal.legacy.Capability; +import cz.zcu.kiv.crce.webui.internal.legacy.Requirement; + +public class RequirementAdapter implements Requirement { + + @Override + public String getName() { + // TODO Auto-generated method stub + return null; + } + + @Override + public String getFilter() { + // TODO Auto-generated method stub + return null; + } + + @Override + public boolean isMultiple() { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean isOptional() { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean isExtend() { + // TODO Auto-generated method stub + return false; + } + + @Override + public String getComment() { + // TODO Auto-generated method stub + return null; + } + + @Override + public boolean isWritable() { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean isSatisfied(Capability capability) { + // TODO Auto-generated method stub + return false; + } + + @Override + public Requirement setFilter(String filter) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Requirement setMultiple(boolean multiple) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Requirement setOptional(boolean optional) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Requirement setExtend(boolean extend) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Requirement setComment(String comment) { + // TODO Auto-generated method stub + return null; + } +} diff --git a/modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/RequirementExt.java b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/RequirementExt.java similarity index 95% rename from modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/RequirementExt.java rename to core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/RequirementExt.java index fb7b57bc..10f68e53 100644 --- a/modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/RequirementExt.java +++ b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/RequirementExt.java @@ -1,21 +1,21 @@ -package cz.zcu.kiv.crce.webui.internal.custom; - -import cz.zcu.kiv.crce.metadata.Requirement; - -public class RequirementExt extends RequirementsWrap { - - private boolean satisfied; - - public RequirementExt(Requirement r) { - super(r); - satisfied = false; - } - - public void setSatisfied(boolean satisfied) { - this.satisfied = satisfied; - } - - public boolean getSatisfied() { - return satisfied; - } -} +package cz.zcu.kiv.crce.webui.internal.custom; + +import cz.zcu.kiv.crce.metadata.Requirement; + +public class RequirementExt extends RequirementsWrap { + + private boolean satisfied; + + public RequirementExt(Requirement r) { + super(r); + satisfied = false; + } + + public void setSatisfied(boolean satisfied) { + this.satisfied = satisfied; + } + + public boolean getSatisfied() { + return satisfied; + } +} diff --git a/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/RequirementImpl.java b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/RequirementImpl.java new file mode 100644 index 00000000..57797067 --- /dev/null +++ b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/RequirementImpl.java @@ -0,0 +1,88 @@ +package cz.zcu.kiv.crce.webui.internal.custom; + +import cz.zcu.kiv.crce.metadata.Requirement; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.annotation.Nonnull; + +public class RequirementImpl implements cz.zcu.kiv.crce.webui.internal.legacy.Requirement { + private static final Logger logger = LoggerFactory.getLogger(RequirementImpl.class); + + private final Requirement requirement; + + public RequirementImpl(@Nonnull Requirement requirement) { + this.requirement = requirement; + } + + @Override + public String getName() { + return requirement.getNamespace(); + } + + @Override + public String getFilter() { + return requirement.getDirective("filter"); + } + + @Override + public boolean isMultiple() { + return Boolean.valueOf(requirement.getDirective("multiple")); + } + + @Override + public boolean isOptional() { + return Boolean.valueOf(requirement.getDirective("optional")); + } + + @Override + public boolean isExtend() { + return Boolean.valueOf(requirement.getDirective("extend")); + } + + @Override + public String getComment() { + return requirement.getDirective("comment"); + } + + @Override + public boolean isWritable() { + return true; + } + + @Override + public boolean isSatisfied(cz.zcu.kiv.crce.webui.internal.legacy.Capability capability) { + logger.warn("Method isSatisfied is not supported by new Metadata API, returning false for Capability: {}, Requirement: {}", capability, requirement); + return false; + } + + @Override + public cz.zcu.kiv.crce.webui.internal.legacy.Requirement setFilter(String filter) { + requirement.setDirective("filter", filter); + return this; + } + + @Override + public cz.zcu.kiv.crce.webui.internal.legacy.Requirement setMultiple(boolean multiple) { + requirement.setDirective("multiple", String.valueOf(multiple)); + return this; + } + + @Override + public cz.zcu.kiv.crce.webui.internal.legacy.Requirement setOptional(boolean optional) { + requirement.setDirective("optional", String.valueOf(optional)); + return this; + } + + @Override + public cz.zcu.kiv.crce.webui.internal.legacy.Requirement setExtend(boolean extend) { + requirement.setDirective("extend", String.valueOf(extend)); + return this; + } + + @Override + public cz.zcu.kiv.crce.webui.internal.legacy.Requirement setComment(String comment) { + requirement.setDirective("comment", String.valueOf(comment)); + return this; + } +} diff --git a/modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/RequirementsWrap.java b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/RequirementsWrap.java similarity index 95% rename from modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/RequirementsWrap.java rename to core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/RequirementsWrap.java index a87d1338..2dec5c03 100644 --- a/modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/RequirementsWrap.java +++ b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/RequirementsWrap.java @@ -1,42 +1,42 @@ -package cz.zcu.kiv.crce.webui.internal.custom; - -import cz.zcu.kiv.crce.metadata.Requirement; - -public class RequirementsWrap extends RequirementAdapter { - - protected Requirement requirement; - - public RequirementsWrap(Requirement r) { - this.requirement = r; - } - - @Override - public String getName() { - return requirement.getNamespace(); - } - - @Override - public String getFilter() { - return requirement.getDirective("filter"); // TODO filter is not supported yet - } - - @Override - public boolean isExtend() { - return Boolean.valueOf(requirement.getDirective("extend")); - } - - @Override - public boolean isMultiple() { - return Boolean.valueOf(requirement.getDirective("multiple")); - } - - @Override - public boolean isOptional() { - return Boolean.valueOf(requirement.getDirective("optional")); - } - - @Override - public boolean isWritable() { - return true; - } -} +package cz.zcu.kiv.crce.webui.internal.custom; + +import cz.zcu.kiv.crce.metadata.Requirement; + +public class RequirementsWrap extends RequirementAdapter { + + protected Requirement requirement; + + public RequirementsWrap(Requirement r) { + this.requirement = r; + } + + @Override + public String getName() { + return requirement.getNamespace(); + } + + @Override + public String getFilter() { + return requirement.getDirective("filter"); // TODO filter is not supported yet + } + + @Override + public boolean isExtend() { + return Boolean.valueOf(requirement.getDirective("extend")); + } + + @Override + public boolean isMultiple() { + return Boolean.valueOf(requirement.getDirective("multiple")); + } + + @Override + public boolean isOptional() { + return Boolean.valueOf(requirement.getDirective("optional")); + } + + @Override + public boolean isWritable() { + return true; + } +} diff --git a/modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/ResourceAdapter.java b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/ResourceAdapter.java similarity index 94% rename from modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/ResourceAdapter.java rename to core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/ResourceAdapter.java index 47e4e54d..b7f8f204 100644 --- a/modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/ResourceAdapter.java +++ b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/ResourceAdapter.java @@ -1,341 +1,341 @@ -package cz.zcu.kiv.crce.webui.internal.custom; - -import java.net.URI; -import java.net.URL; -import java.util.Map; -import java.util.Set; - -import cz.zcu.kiv.crce.metadata.type.Version; - -import cz.zcu.kiv.crce.webui.internal.legacy.Capability; -import cz.zcu.kiv.crce.webui.internal.legacy.NewProperty; -import cz.zcu.kiv.crce.webui.internal.legacy.Property; -import cz.zcu.kiv.crce.webui.internal.legacy.Requirement; -import cz.zcu.kiv.crce.webui.internal.legacy.Resource; -import cz.zcu.kiv.crce.webui.internal.legacy.Type; - -public class ResourceAdapter implements Resource { - - @Override - public Property[] getProperties() { - // TODO Auto-generated method stub - return null; - } - - @Override - public Property getProperty(String name) { - // TODO Auto-generated method stub - return null; - } - - @Override - public String getPropertyString(String name) { - // TODO Auto-generated method stub - return null; - } - - @Override - public Resource setProperty(Property property) { - // TODO Auto-generated method stub - return null; - } - - @Override - public Resource setProperty(String name, String value, Type type) { - // TODO Auto-generated method stub - return null; - } - - @Override - public Resource setProperty(String name, String string) { - // TODO Auto-generated method stub - return null; - } - - @Override - public Resource setProperty(String name, Version version) { - // TODO Auto-generated method stub - return null; - } - - @Override - public Resource setProperty(String name, URL url) { - // TODO Auto-generated method stub - return null; - } - - @Override - public Resource setProperty(String name, URI uri) { - // TODO Auto-generated method stub - return null; - } - - @Override - public Resource setProperty(String name, long llong) { - // TODO Auto-generated method stub - return null; - } - - @Override - public Resource setProperty(String name, double ddouble) { - // TODO Auto-generated method stub - return null; - } - - @Override - public Resource setProperty(String name, Set values) { - // TODO Auto-generated method stub - return null; - } - - @Override - public Resource unsetProperty(String name) { - // TODO Auto-generated method stub - return null; - } - - @Override - public String getId() { - // TODO Auto-generated method stub - return null; - } - - @Override - public String getSymbolicName() { - // TODO Auto-generated method stub - return null; - } - - @Override - public Version getVersion() { - // TODO Auto-generated method stub - return null; - } - - @Override - public String getPresentationName() { - // TODO Auto-generated method stub - return null; - } - - @Override - public URI getUri() { - // TODO Auto-generated method stub - return null; - } - - @Override - public URI getRelativeUri() { - // TODO Auto-generated method stub - return null; - } - - @Override - public NewProperty[] getNewProperties() { - // TODO Auto-generated method stub - return null; - } - - @Override - public long getSize() { - // TODO Auto-generated method stub - return 0; - } - - @Override - public String[] getCategories() { - // TODO Auto-generated method stub - return null; - } - - @Override - public Capability[] getCapabilities() { - // TODO Auto-generated method stub - return null; - } - - @Override - public Capability[] getCapabilities(String name) { - // TODO Auto-generated method stub - return null; - } - - @Override - public Requirement[] getRequirements() { - // TODO Auto-generated method stub - return null; - } - - @Override - public Requirement[] getRequirements(String name) { - // TODO Auto-generated method stub - return null; - } - - @Override - public Map getPropertiesMap() { - // TODO Auto-generated method stub - return null; - } - - @Override - public boolean hasCategory(String category) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean hasCapability(Capability capability) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean hasRequirement(Requirement requirement) { - // TODO Auto-generated method stub - return false; - } - - @Override - public void setSymbolicName(String name) { - // TODO Auto-generated method stub - - } - - @Override - public void setSymbolicName(String name, boolean isStatic) { - // TODO Auto-generated method stub - - } - - @Override - public void setPresentationName(String name) { - // TODO Auto-generated method stub - - } - - @Override - public void setVersion(Version version) { - // TODO Auto-generated method stub - - } - - @Override - public void setVersion(Version version, boolean isStatic) { - // TODO Auto-generated method stub - - } - - @Override - public void setVersion(String version) { - // TODO Auto-generated method stub - - } - - @Override - public void setVersion(String version, boolean isStatic) { - // TODO Auto-generated method stub - - } - - @Override - public void addCategory(String category) { - // TODO Auto-generated method stub - - } - - @Override - public void addCapability(Capability capability) { - // TODO Auto-generated method stub - - } - - @Override - public void addRequirement(Requirement requirement) { - // TODO Auto-generated method stub - - } - - @Override - public Capability createCapability(String name) { - // TODO Auto-generated method stub - return null; - } - - @Override - public Requirement createRequirement(String name) { - // TODO Auto-generated method stub - return null; - } - - @Override - public void unsetCategory(String category) { - // TODO Auto-generated method stub - - } - - @Override - public void unsetCapability(Capability capability) { - // TODO Auto-generated method stub - - } - - @Override - public void unsetRequirement(Requirement requirement) { - // TODO Auto-generated method stub - - } - - @Override - public void setSize(long size) { - // TODO Auto-generated method stub - - } - - @Override - public void setUri(URI uri) { - // TODO Auto-generated method stub - - } - - @Override - public boolean isWritable() { - // TODO Auto-generated method stub - return false; - } - - @Override - public void unsetWritable() { - // TODO Auto-generated method stub - - } - - @Override - public boolean isVersionStatic() { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean isSymbolicNameStatic() { - // TODO Auto-generated method stub - return false; - } - - @Override - public String asString() { - // TODO Auto-generated method stub - return null; - } - -// @Override -// public Repository getRepository() { -// // TODO Auto-generated method stub -// return null; -// } -// -// @Override -// public void setRepository(WritableRepository repository) { -// // TODO Auto-generated method stub -// } -} +package cz.zcu.kiv.crce.webui.internal.custom; + +import java.net.URI; +import java.net.URL; +import java.util.Map; +import java.util.Set; + +import cz.zcu.kiv.crce.metadata.type.Version; + +import cz.zcu.kiv.crce.webui.internal.legacy.Capability; +import cz.zcu.kiv.crce.webui.internal.legacy.NewProperty; +import cz.zcu.kiv.crce.webui.internal.legacy.Property; +import cz.zcu.kiv.crce.webui.internal.legacy.Requirement; +import cz.zcu.kiv.crce.webui.internal.legacy.Resource; +import cz.zcu.kiv.crce.webui.internal.legacy.Type; + +public class ResourceAdapter implements Resource { + + @Override + public Property[] getProperties() { + // TODO Auto-generated method stub + return null; + } + + @Override + public Property getProperty(String name) { + // TODO Auto-generated method stub + return null; + } + + @Override + public String getPropertyString(String name) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Resource setProperty(Property property) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Resource setProperty(String name, String value, Type type) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Resource setProperty(String name, String string) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Resource setProperty(String name, Version version) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Resource setProperty(String name, URL url) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Resource setProperty(String name, URI uri) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Resource setProperty(String name, long llong) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Resource setProperty(String name, double ddouble) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Resource setProperty(String name, Set values) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Resource unsetProperty(String name) { + // TODO Auto-generated method stub + return null; + } + + @Override + public String getId() { + // TODO Auto-generated method stub + return null; + } + + @Override + public String getSymbolicName() { + // TODO Auto-generated method stub + return null; + } + + @Override + public Version getVersion() { + // TODO Auto-generated method stub + return null; + } + + @Override + public String getPresentationName() { + // TODO Auto-generated method stub + return null; + } + + @Override + public URI getUri() { + // TODO Auto-generated method stub + return null; + } + + @Override + public URI getRelativeUri() { + // TODO Auto-generated method stub + return null; + } + + @Override + public NewProperty[] getNewProperties() { + // TODO Auto-generated method stub + return null; + } + + @Override + public long getSize() { + // TODO Auto-generated method stub + return 0; + } + + @Override + public String[] getCategories() { + // TODO Auto-generated method stub + return null; + } + + @Override + public Capability[] getCapabilities() { + // TODO Auto-generated method stub + return null; + } + + @Override + public Capability[] getCapabilities(String name) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Requirement[] getRequirements() { + // TODO Auto-generated method stub + return null; + } + + @Override + public Requirement[] getRequirements(String name) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Map getPropertiesMap() { + // TODO Auto-generated method stub + return null; + } + + @Override + public boolean hasCategory(String category) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean hasCapability(Capability capability) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean hasRequirement(Requirement requirement) { + // TODO Auto-generated method stub + return false; + } + + @Override + public void setSymbolicName(String name) { + // TODO Auto-generated method stub + + } + + @Override + public void setSymbolicName(String name, boolean isStatic) { + // TODO Auto-generated method stub + + } + + @Override + public void setPresentationName(String name) { + // TODO Auto-generated method stub + + } + + @Override + public void setVersion(Version version) { + // TODO Auto-generated method stub + + } + + @Override + public void setVersion(Version version, boolean isStatic) { + // TODO Auto-generated method stub + + } + + @Override + public void setVersion(String version) { + // TODO Auto-generated method stub + + } + + @Override + public void setVersion(String version, boolean isStatic) { + // TODO Auto-generated method stub + + } + + @Override + public void addCategory(String category) { + // TODO Auto-generated method stub + + } + + @Override + public void addCapability(Capability capability) { + // TODO Auto-generated method stub + + } + + @Override + public void addRequirement(Requirement requirement) { + // TODO Auto-generated method stub + + } + + @Override + public Capability createCapability(String name) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Requirement createRequirement(String name) { + // TODO Auto-generated method stub + return null; + } + + @Override + public void unsetCategory(String category) { + // TODO Auto-generated method stub + + } + + @Override + public void unsetCapability(Capability capability) { + // TODO Auto-generated method stub + + } + + @Override + public void unsetRequirement(Requirement requirement) { + // TODO Auto-generated method stub + + } + + @Override + public void setSize(long size) { + // TODO Auto-generated method stub + + } + + @Override + public void setUri(URI uri) { + // TODO Auto-generated method stub + + } + + @Override + public boolean isWritable() { + // TODO Auto-generated method stub + return false; + } + + @Override + public void unsetWritable() { + // TODO Auto-generated method stub + + } + + @Override + public boolean isVersionStatic() { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean isSymbolicNameStatic() { + // TODO Auto-generated method stub + return false; + } + + @Override + public String asString() { + // TODO Auto-generated method stub + return null; + } + +// @Override +// public Repository getRepository() { +// // TODO Auto-generated method stub +// return null; +// } +// +// @Override +// public void setRepository(WritableRepository repository) { +// // TODO Auto-generated method stub +// } +} diff --git a/modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/ResourceExt.java b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/ResourceExt.java similarity index 96% rename from modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/ResourceExt.java rename to core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/ResourceExt.java index c5e991c0..8229291b 100644 --- a/modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/ResourceExt.java +++ b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/ResourceExt.java @@ -1,45 +1,45 @@ -package cz.zcu.kiv.crce.webui.internal.custom; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import cz.zcu.kiv.crce.metadata.Resource; -import cz.zcu.kiv.crce.metadata.service.MetadataService; - -public class ResourceExt extends ResourceWrap { - - private static final Logger logger = LoggerFactory.getLogger(ResourceExt.class); - - private boolean satisfied; - - public ResourceExt(Resource r, MetadataService metadataService) { - super(r, metadataService); - this.satisfied = true; - } - - public boolean getSatisfied() { - return satisfied; - } - - @Override - public void addRequirement(cz.zcu.kiv.crce.webui.internal.legacy.Requirement requirement) { - satisfied = false; - logger.warn("Adding legacy requirements is not supported yet with new Metadata API: {}", requirement); // TODO fix functionality -// resource.unsetRequirement(requirement); -// RequirementExt rext = new RequirementExt(requirement); -// resource.addRequirement(rext); - } - - @Override - public boolean equals(Object obj) { - if (obj instanceof cz.zcu.kiv.crce.webui.internal.legacy.Resource) { - return this.getUri().equals(((cz.zcu.kiv.crce.webui.internal.legacy.Resource) obj).getUri()); - } - return super.equals(obj); - } - - @Override - public int hashCode() { - return resource.hashCode(); - } -} +package cz.zcu.kiv.crce.webui.internal.custom; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import cz.zcu.kiv.crce.metadata.Resource; +import cz.zcu.kiv.crce.metadata.service.MetadataService; + +public class ResourceExt extends ResourceWrap { + + private static final Logger logger = LoggerFactory.getLogger(ResourceExt.class); + + private boolean satisfied; + + public ResourceExt(Resource r, MetadataService metadataService) { + super(r, metadataService); + this.satisfied = true; + } + + public boolean getSatisfied() { + return satisfied; + } + + @Override + public void addRequirement(cz.zcu.kiv.crce.webui.internal.legacy.Requirement requirement) { + satisfied = false; + logger.warn("Adding legacy requirements is not supported yet with new Metadata API: {}", requirement); // TODO fix functionality +// resource.unsetRequirement(requirement); +// RequirementExt rext = new RequirementExt(requirement); +// resource.addRequirement(rext); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof cz.zcu.kiv.crce.webui.internal.legacy.Resource) { + return this.getUri().equals(((cz.zcu.kiv.crce.webui.internal.legacy.Resource) obj).getUri()); + } + return super.equals(obj); + } + + @Override + public int hashCode() { + return resource.hashCode(); + } +} diff --git a/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/ResourceWrap.java b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/ResourceWrap.java new file mode 100644 index 00000000..4cc59615 --- /dev/null +++ b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/ResourceWrap.java @@ -0,0 +1,127 @@ +package cz.zcu.kiv.crce.webui.internal.custom; + +import cz.zcu.kiv.crce.metadata.*; +import cz.zcu.kiv.crce.metadata.impl.SimpleAttributeType; +import cz.zcu.kiv.crce.metadata.service.MetadataService; +import cz.zcu.kiv.crce.metadata.type.Version; +import cz.zcu.kiv.crce.webui.internal.legacy.NewProperty; + +import java.net.URI; +import java.util.Collections; +import java.util.List; + +abstract class ResourceWrap extends ResourceAdapter { + + // loose coupling with crce-metadata-osgi-bundle module + private static final String OSG_IDENTITY_NAMESPACE = "osgi.identity"; + private static final AttributeType ATTRIBUTE_SYMBOLIC_NAME = new SimpleAttributeType<>("symbolic-name", String.class); + public static final AttributeType ATTRIBUTE_VERSION = new SimpleAttributeType<>(org.apache.felix.bundlerepository.Resource.VERSION, Version.class); + + protected Resource resource; + private final MetadataService metadataService; + + protected ResourceWrap(Resource r, MetadataService metadataService) { + this.resource = r; + this.metadataService = metadataService; + } + + @Override + public cz.zcu.kiv.crce.webui.internal.legacy.Property[] getProperties() { + cz.zcu.kiv.crce.webui.internal.legacy.Property[] properties; + List crceCapabilities = Collections.singletonList(metadataService.getIdentity(resource)); + + int crceSize = crceCapabilities.isEmpty() ? 0 : crceCapabilities.get(0).getAttributes().size(); + + properties = new cz.zcu.kiv.crce.webui.internal.legacy.Property[crceSize]; + int i = 0; + if (crceSize > 0) { + for (Attribute atr : crceCapabilities.get(0).getAttributes()) { + properties[i++] = new PropertyImpl(atr); + } + } + return properties; + } + + @Override + public NewProperty[] getNewProperties() { + List newProperties = resource.getProperties(); + NewProperty[] properties = new NewProperty[newProperties.size()]; + int i = 0; + for (Property newProperty : newProperties) { + properties[i++] = new NewPropertyImpl(newProperty); + } + return properties; + } + + @Override + public cz.zcu.kiv.crce.webui.internal.legacy.Capability[] getCapabilities() { + List capabilities = resource.getCapabilities(); + cz.zcu.kiv.crce.webui.internal.legacy.Capability[] result = new cz.zcu.kiv.crce.webui.internal.legacy.Capability[capabilities.size()]; + int i = 0; + for (Capability capability : capabilities) { + result[i++] = new CapabilityImpl(capability); + } + return result; + } + + @Override + public String[] getCategories() { + return metadataService.getCategories(resource).toArray(new String[0]); + } + + @Override + public cz.zcu.kiv.crce.webui.internal.legacy.Requirement[] getRequirements() { + List requirements = resource.getRequirements(); + cz.zcu.kiv.crce.webui.internal.legacy.Requirement[] result = new cz.zcu.kiv.crce.webui.internal.legacy.Requirement[requirements.size()]; + int i = 0; + for (Requirement requirement : requirements) { + result[i++] = new RequirementImpl(requirement); + } + return result; + } + + @Override + public String getSymbolicName() { + String name = "unknown-symbolic-name"; + List capabilities = resource.getCapabilities(OSG_IDENTITY_NAMESPACE); + if (!capabilities.isEmpty()) { + name = capabilities.get(0).getAttributeValue(ATTRIBUTE_SYMBOLIC_NAME); + } + return name; + } + + @Override + public String getId() { + return resource.getId(); + } + + @Override + public Version getVersion() { + Version version = null; + List capabilities = resource.getCapabilities(OSG_IDENTITY_NAMESPACE); + if (!capabilities.isEmpty()) { + version = capabilities.get(0).getAttributeValue(ATTRIBUTE_VERSION); + } + return version; + } + + @Override + public String getPresentationName() { + return metadataService.getPresentationName(resource); + } + + @Override + public URI getUri() { + return metadataService.getUri(resource); + } + + @Override + public URI getRelativeUri() { + return metadataService.getUri(resource); + } + + @Override + public long getSize() { + return metadataService.getSize(resource); + } +} diff --git a/modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/filter/CompatibilityAvailabilityFilter.java b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/filter/CompatibilityAvailabilityFilter.java similarity index 100% rename from modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/filter/CompatibilityAvailabilityFilter.java rename to core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/filter/CompatibilityAvailabilityFilter.java diff --git a/modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/legacy/Capability.java b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/legacy/Capability.java similarity index 100% rename from modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/legacy/Capability.java rename to core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/legacy/Capability.java diff --git a/modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/legacy/NewProperty.java b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/legacy/NewProperty.java similarity index 96% rename from modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/legacy/NewProperty.java rename to core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/legacy/NewProperty.java index 1f2b5e1d..c989b1d2 100644 --- a/modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/legacy/NewProperty.java +++ b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/legacy/NewProperty.java @@ -1,13 +1,13 @@ -package cz.zcu.kiv.crce.webui.internal.legacy; - -/** - * A property that can be set to a Resource or a Capability. - * - * This Property corresponds to cz.zcu.kiv.crce.metadata.Property - * - * @author Jan Smajcl (smajcl@students.zcu.cz) - */ -public interface NewProperty extends PropertyProvider { - - String getName(); -} +package cz.zcu.kiv.crce.webui.internal.legacy; + +/** + * A property that can be set to a Resource or a Capability. + * + * This Property corresponds to cz.zcu.kiv.crce.metadata.Property + * + * @author Jan Smajcl (smajcl@students.zcu.cz) + */ +public interface NewProperty extends PropertyProvider { + + String getName(); +} diff --git a/modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/legacy/Property.java b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/legacy/Property.java similarity index 100% rename from modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/legacy/Property.java rename to core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/legacy/Property.java diff --git a/modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/legacy/PropertyProvider.java b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/legacy/PropertyProvider.java similarity index 100% rename from modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/legacy/PropertyProvider.java rename to core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/legacy/PropertyProvider.java diff --git a/modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/legacy/Requirement.java b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/legacy/Requirement.java similarity index 100% rename from modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/legacy/Requirement.java rename to core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/legacy/Requirement.java diff --git a/modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/legacy/Resource.java b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/legacy/Resource.java similarity index 100% rename from modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/legacy/Resource.java rename to core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/legacy/Resource.java diff --git a/modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/legacy/Type.java b/core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/legacy/Type.java similarity index 100% rename from modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/legacy/Type.java rename to core/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/legacy/Type.java diff --git a/modules/crce-webui/src/main/webapp/META-INF/MANIFEST.MF b/core/crce-webui/src/main/webapp/META-INF/MANIFEST.MF similarity index 92% rename from modules/crce-webui/src/main/webapp/META-INF/MANIFEST.MF rename to core/crce-webui/src/main/webapp/META-INF/MANIFEST.MF index 5e949512..254272e1 100644 --- a/modules/crce-webui/src/main/webapp/META-INF/MANIFEST.MF +++ b/core/crce-webui/src/main/webapp/META-INF/MANIFEST.MF @@ -1,3 +1,3 @@ -Manifest-Version: 1.0 -Class-Path: - +Manifest-Version: 1.0 +Class-Path: + diff --git a/modules/crce-webui/src/main/webapp/WEB-INF/web.xml b/core/crce-webui/src/main/webapp/WEB-INF/web.xml similarity index 100% rename from modules/crce-webui/src/main/webapp/WEB-INF/web.xml rename to core/crce-webui/src/main/webapp/WEB-INF/web.xml diff --git a/modules/crce-webui/src/main/webapp/crce.png b/core/crce-webui/src/main/webapp/crce.png similarity index 100% rename from modules/crce-webui/src/main/webapp/crce.png rename to core/crce-webui/src/main/webapp/crce.png diff --git a/modules/crce-webui/src/main/webapp/css/styl.css b/core/crce-webui/src/main/webapp/css/styl.css similarity index 94% rename from modules/crce-webui/src/main/webapp/css/styl.css rename to core/crce-webui/src/main/webapp/css/styl.css index 7d9d8879..c19c4c94 100644 --- a/modules/crce-webui/src/main/webapp/css/styl.css +++ b/core/crce-webui/src/main/webapp/css/styl.css @@ -1,612 +1,612 @@ -/* CSS Document */ - -body { - margin: 0 auto; - text-align: center; - font-family: Verdana; -} - -img { - border: 0; -} - -a { - color: #666; -} - -a:hover { - color: #BBB; -} - -p { - padding: 0 0 5px 15px; -} - -h2 { - color: #464A47; - padding: 0 0 0 10px; - font-size: 1.1em; - font-weight: bold; -} - -h3 { - padding: 0 0 0 15px; - font-size: 0.9em; - font-weight: normal; - color: #464A47; -} - -.konec { - clear: both; - width: 0; - visibility: hidden; - height: 0; - font-size: 0; - display: block; -} - -#stranka { - width: 902px; - margin: 0 auto; - margin-top: 20px; - border: 1px solid #AAA; -} - -/*--------------------HLAVICKA----------------------------------------*/ - -#hlavicka { - /*border: 1px solid black;*/ - width: 100%; - background: url('../graphic/hlavicka_bg.png') no-repeat; - text-align: left; - padding: 26px 0px; -} - -#hlavicka .loga_h { - height: 90px; - background: url('../graphic/hlavicka_loga.png') no-repeat; -} - -#hlavicka .logo_img { - float: left; - width: 600px; - color: red; - /*border: 1px solid black;*/ - margin: 10px 0px 0px 12px; -} - -#hlavicka .nazev { - float: left; - width: 600px; - color: #666; - font-weight: bold; - font-size: 1.6em; - /*border: 1px solid black;*/ - margin: 5px 0px 5px 12px; -} - -#hlavicka .vyhledavani { - float: right; - width: 250px; - text-align: right; - border: 1px solid black; - margin: 10px 15px 0 0; -} - -#hlavicka .vyhledavani .text { - width: 150px; - color: #222; - background-color: #EEE; - border: 1px solid #AAA; -} - -#hlavicka .vyhledavani .tlacitko { - width: 55px; - background-color: #666; - border: 1px solid #AAA; - color: #FFF; - font-weight: bold; -} - -#hlavicka .vyhledavani .tlacitko:hover { - color: #222; - background-color: #BBB; - border: 1px solid #AAA; -} - -/*--------------------MENU----------------------------------------*/ - -#menu .vyhledavani_h { - float: right; - width: 450px; - height: 24px; - /*line-height: 20px;*/ - text-align: right; - margin-right: 6px; - -} - -#menu .vyhledavani_h .text { - width: 150px; - height: 16px; - color: #565c59; - background-color: white; - border: 1px solid black; - margin-top: 2px; - -} - -#menu .vyhledavani_h .tlacitko { - width: 25px; - height: 18px; - background-color: #eeeee5; - color: black; - font-family: Verdana; - font-weight: normal; - line-height: 16px; - font-size: 8pt; -} - -#menu .vyhledavani_h .repository_selection { - width: 250px; -} - -#menu { - background: url('../graphic/menu_bg.png') repeat-x; - height: 24px; - -} - -#menu ul { - padding: 0px; - margin: 0px; - float: left; -} - -#menu li { - display: inline; - list-style: none; - padding: 0px 10px; -} - -#menu li a:link, -#menu li a:visited, -#menu li a:active, -#menu li a:hover { - - text-decoration: none; - color: white; - font-weight: bold; - font-size: 0.7em; -} - -#menu li a:hover { - text-decoration: underline; -} - -#menu li a.aktivni { - color: #c0c0a0; -} - -/* Vycisteni menu */ -.vycisteni:after { - display: block; - clear: both; - visibility: hidden; - height: 0; - font-size: 0; - content: ' '; -} - -.vycisteni { - min-height: 1px; -} - -.vycisteni { - display: inline-block; -} - -/* Backslash hack - nemel by to videt IE/Mac \*/ -.vycisteni { - display: block; -} - -/* Konec hacku */ - -/*-------------------------ZPRAVA USPECH NEUSPECH---------------------------------*/ -#zprava { - color: #FFF; - text-align: center; - width: 100%; - margin: 0 auto; - padding: 3px 0px; - font-weight: bold; - font-size: 0.7em; -} - -.uspech { - background-color: #b2c980; -} - -.neuspech { - background-color: #f86965; -} - -/*--------------------TELO----------------------------------------*/ -#telo { - width: 100%; - padding: 10px 0 10px 0; - text-align: left; - margin: 0 auto; - background-color: #EEEEE5; -} - -.pridat { - width: 880px; - margin: 0 auto; - padding: 10px 0 10px 0; -} - -.komponenta { - width: 880px; - margin: 0 auto; - border: 1px solid #AAA; - overflow: hidden; -} - -.komponenta div.nadpis { - /*border: 1px solid black;*/ - background: url('../graphic/heading-bg.png') repeat-x; - height: 21px; - line-height: 21px; - padding: 0px 10px 0px 10px; - font-weight: bold; - font-size: 0.7em; -} - -.komponenta .nadpis .popis { - width: 740px; - height: 21px; - line-height: 21px; - float: left; - border: 0px solid black; -} - -.komponenta .nadpis .popis a { - width: 100%; - /*padding: 0 0 0 10px;*/ - text-decoration: none; - - /*color: #222;*/ - /*border: 1px solid black;*/ -} - -.komponenta .nadpis .popis a:hover { - text-decoration: underline; -} - -.komponenta .nadpis:hover { - /*background-color: #777;*/ -} - -.komponenta .nadpis .popis .sName { - color: #7b847c; - font-style: italic; - margin-left: 10px; - font-size: 0.9em; -} - -.komponenta .nadpis .popis .version { - color: #464a47; - margin-left: 10px; -} - -.komponenta .nadpis .popis .version_obsah { - color: #7b847c; -} - -.komponenta .nadpis .popis .pName { - color: #464a47; - -} - -.komponenta .nadpis .popis .category { - color: #464a47; -} - -.komponenta .nadpis .popis .category_obsah { - color: #7b847c; -} - -.komponenta .nadpis .nabidka { - float: right; - text-align: right; - margin: 2px 0 0 0; - border: 0px solid black; - width: 120px; - height: 19px; - line-height: 19px; -} - -.komponenta .informace { - /*border: 1px solid black;*/ - /*background-color: #EEE;*/ - padding: 5px 10px 5px 10px; - font-size: 0.8em; -} - -.komponenta .polozka { - color: #464a47; - padding-bottom: 10px; -} - -.komponenta .polozka li { - font-size: 0.9em; -} - -.komponenta a.edit, -.edit-addnew { - text-decoration: underline; - font-size: 0.8em; - color: #464a47; -} - -.komponenta a.edit:hover, -.edit-addnew { - text-decoration: none; -} - -.komponenta .polozka .inline { - margin-bottom: 10px; -} - -.komponenta .polozka .inline li { - float: left; - padding-left: 5px; - list-style: none; -} - -.vsechnykategorie { - /*float:left;*/ - margin-bottom: 20px; -} - -.kategorie { - width: 100px; - margin: 5px 2px 2px 2px; - border: 1px solid #AAA; - overflow: hidden; - height: 21px; - line-height: 21px; - padding: 0px 10px 0px 10px; - font-weight: bold; - font-size: 0.7em; -} - -.komponenty .komponenta { - /*width: 760px;*/ -} - -.komponenty .komponenta .nadpis .popis { - /*width: 640px;*/ -} - -/*--------------------POSKYTUJE-------------------------*/ - -.poskytuje { - padding: 5px; - width: 100%; - margin: 0 auto; - -} - -.poskytuje th { - text-align: left; - font-weight: bold; - -} - -.poskytuje .text { - width: 98%; -} - -.poskytuje .jmeno { - -} - -.poskytuje .typ { - width: 90px; -} - -.poskytuje .hodnota { - max-width: 580px; - width: 580px; -} - -/*-------------------------VYZADUJE------------------------------*/ -.vyzaduje { - padding: 10px; - width: 100%; - margin: 0 auto; - font-size: 0.9em; -} - -.komponenta .vyzaduje { - padding: 0px; - width: 830px; -} - -.vyzaduje input { - width: 98%; - margin: 0 auto; -} - -.vyzaduje th { - text-align: left; - font-weight: bold; - /*background: #f5f5f1;*/ -} - -.vyzaduje .text { - width: 98%; - margin: 0 auto; -} - -.vyzaduje .tlacitko { - width: 150px; -} - -.vyzaduje .komentar { - width: 98%; - padding: 0 0 10px 0; - font-size: 0.9em; - font-style: italic; -} - -.vyzaduje .jmeno { - width: 100px; -} - -.vyzaduje .filter { - width: 600px; -} - -.vyzaduje td.req-neuspech { - color: #f86965; -} - -/*---------------ANIMACNI_ODKAZY---------------------------------------*/ -#animacni_odkazy { - width: 880px; - margin: 0 auto; - font-size: 0.8em; - padding-top: 5px; - text-align: right; - border: 0px solid black; - -} - -/*--------------------PATICKA----------------------------------------*/ -#paticka { - padding-top: 3px; - width: 904px; - font-size: 0.6em; - margin: 0 auto; - /*border: 1px solid black;*/ - background-color: #EEE; - color: #333; -} - -/*-------------TLACITKO----------------------------------------------*/ - -.tlacitko { - text-align: center; - /*background-color: #666;*/ - background: #ddddca; - /*border: 1px solid #AAA;*/ - border: 1px solid #c8b8b5; - color: #000; - font-size: 0.8em; - -} - -.tlacitko:hover { - /*color: #222;*/ - background-color: #FFF; -} - -div.tlac { - float: left; - margin-right: 5px; -} - -/*----------------UPLOAD---------------------------------------------*/ - -div.upload { - background-color: #999; - margin-bottom: 10px; - padding: 5px; -} - -table.upload { - - /*width: 880px;*/ - /*margin: 0 auto;*/ - -} - -.upload td { - text-align: left; - width: 100%; -} - -.upload .text { - width: 400px; - color: #222; - background-color: #FFF; - border: 1px solid #AAA; -} - -.upload .tlacitko { - /*width: 200px;*/ - font-size: 0.8em; -} - -/*--------------------FORMULAR----------------------------------------*/ - -.formular { - padding: 10px; - width: 100%; - text-align: left; - -} - -.formular th { - font-weight: bold; - font-size: 0.8em; - color: #464a47; -} - -.formular td { - text-align: left; - margin: 0 auto; -} - -.formular .text { - width: 500px; - color: #222; - background-color: #FFF; - border: 1px solid #AAA; -} - -.formular .chyba { - color: red; - font-weight: bold; - padding: 0 10px 0 10px; -} - -.formular .tlacitko { - margin: 10px 0 0 0; -} - -.formy th { - font-size: 0.8em; - color: #464a47; -} - -.categorie-edit-ul li { - font-size: 0.8em; - color: #464a47; - -} - -/*-----------------EXECUTE_COMMIT-------------------------*/ - -.execute_commit .tlacitko { - margin: 0 0 10px 10px; -} - -/*------------------COMPATIBILITY-------------------------*/ -.pivot { - background-color: #FCFC55; +/* CSS Document */ + +body { + margin: 0 auto; + text-align: center; + font-family: Verdana; +} + +img { + border: 0; +} + +a { + color: #666; +} + +a:hover { + color: #BBB; +} + +p { + padding: 0 0 5px 15px; +} + +h2 { + color: #464A47; + padding: 0 0 0 10px; + font-size: 1.1em; + font-weight: bold; +} + +h3 { + padding: 0 0 0 15px; + font-size: 0.9em; + font-weight: normal; + color: #464A47; +} + +.konec { + clear: both; + width: 0; + visibility: hidden; + height: 0; + font-size: 0; + display: block; +} + +#stranka { + width: 902px; + margin: 0 auto; + margin-top: 20px; + border: 1px solid #AAA; +} + +/*--------------------HLAVICKA----------------------------------------*/ + +#hlavicka { + /*border: 1px solid black;*/ + width: 100%; + background: url('../graphic/hlavicka_bg.png') no-repeat; + text-align: left; + padding: 26px 0px; +} + +#hlavicka .loga_h { + height: 90px; + background: url('../graphic/hlavicka_loga.png') no-repeat; +} + +#hlavicka .logo_img { + float: left; + width: 600px; + color: red; + /*border: 1px solid black;*/ + margin: 10px 0px 0px 12px; +} + +#hlavicka .nazev { + float: left; + width: 600px; + color: #666; + font-weight: bold; + font-size: 1.6em; + /*border: 1px solid black;*/ + margin: 5px 0px 5px 12px; +} + +#hlavicka .vyhledavani { + float: right; + width: 250px; + text-align: right; + border: 1px solid black; + margin: 10px 15px 0 0; +} + +#hlavicka .vyhledavani .text { + width: 150px; + color: #222; + background-color: #EEE; + border: 1px solid #AAA; +} + +#hlavicka .vyhledavani .tlacitko { + width: 55px; + background-color: #666; + border: 1px solid #AAA; + color: #FFF; + font-weight: bold; +} + +#hlavicka .vyhledavani .tlacitko:hover { + color: #222; + background-color: #BBB; + border: 1px solid #AAA; +} + +/*--------------------MENU----------------------------------------*/ + +#menu .vyhledavani_h { + float: right; + width: 450px; + height: 24px; + /*line-height: 20px;*/ + text-align: right; + margin-right: 6px; + +} + +#menu .vyhledavani_h .text { + width: 150px; + height: 16px; + color: #565c59; + background-color: white; + border: 1px solid black; + margin-top: 2px; + +} + +#menu .vyhledavani_h .tlacitko { + width: 25px; + height: 18px; + background-color: #eeeee5; + color: black; + font-family: Verdana; + font-weight: normal; + line-height: 16px; + font-size: 8pt; +} + +#menu .vyhledavani_h .repository_selection { + width: 250px; +} + +#menu { + background: url('../graphic/menu_bg.png') repeat-x; + height: 24px; + +} + +#menu ul { + padding: 0px; + margin: 0px; + float: left; +} + +#menu li { + display: inline; + list-style: none; + padding: 0px 10px; +} + +#menu li a:link, +#menu li a:visited, +#menu li a:active, +#menu li a:hover { + + text-decoration: none; + color: white; + font-weight: bold; + font-size: 0.7em; +} + +#menu li a:hover { + text-decoration: underline; +} + +#menu li a.aktivni { + color: #c0c0a0; +} + +/* Vycisteni menu */ +.vycisteni:after { + display: block; + clear: both; + visibility: hidden; + height: 0; + font-size: 0; + content: ' '; +} + +.vycisteni { + min-height: 1px; +} + +.vycisteni { + display: inline-block; +} + +/* Backslash hack - nemel by to videt IE/Mac \*/ +.vycisteni { + display: block; +} + +/* Konec hacku */ + +/*-------------------------ZPRAVA USPECH NEUSPECH---------------------------------*/ +#zprava { + color: #FFF; + text-align: center; + width: 100%; + margin: 0 auto; + padding: 3px 0px; + font-weight: bold; + font-size: 0.7em; +} + +.uspech { + background-color: #b2c980; +} + +.neuspech { + background-color: #f86965; +} + +/*--------------------TELO----------------------------------------*/ +#telo { + width: 100%; + padding: 10px 0 10px 0; + text-align: left; + margin: 0 auto; + background-color: #EEEEE5; +} + +.pridat { + width: 880px; + margin: 0 auto; + padding: 10px 0 10px 0; +} + +.komponenta { + width: 880px; + margin: 0 auto; + border: 1px solid #AAA; + overflow: hidden; +} + +.komponenta div.nadpis { + /*border: 1px solid black;*/ + background: url('../graphic/heading-bg.png') repeat-x; + height: 21px; + line-height: 21px; + padding: 0px 10px 0px 10px; + font-weight: bold; + font-size: 0.7em; +} + +.komponenta .nadpis .popis { + width: 740px; + height: 21px; + line-height: 21px; + float: left; + border: 0px solid black; +} + +.komponenta .nadpis .popis a { + width: 100%; + /*padding: 0 0 0 10px;*/ + text-decoration: none; + + /*color: #222;*/ + /*border: 1px solid black;*/ +} + +.komponenta .nadpis .popis a:hover { + text-decoration: underline; +} + +.komponenta .nadpis:hover { + /*background-color: #777;*/ +} + +.komponenta .nadpis .popis .sName { + color: #7b847c; + font-style: italic; + margin-left: 10px; + font-size: 0.9em; +} + +.komponenta .nadpis .popis .version { + color: #464a47; + margin-left: 10px; +} + +.komponenta .nadpis .popis .version_obsah { + color: #7b847c; +} + +.komponenta .nadpis .popis .pName { + color: #464a47; + +} + +.komponenta .nadpis .popis .category { + color: #464a47; +} + +.komponenta .nadpis .popis .category_obsah { + color: #7b847c; +} + +.komponenta .nadpis .nabidka { + float: right; + text-align: right; + margin: 2px 0 0 0; + border: 0px solid black; + width: 120px; + height: 19px; + line-height: 19px; +} + +.komponenta .informace { + /*border: 1px solid black;*/ + /*background-color: #EEE;*/ + padding: 5px 10px 5px 10px; + font-size: 0.8em; +} + +.komponenta .polozka { + color: #464a47; + padding-bottom: 10px; +} + +.komponenta .polozka li { + font-size: 0.9em; +} + +.komponenta a.edit, +.edit-addnew { + text-decoration: underline; + font-size: 0.8em; + color: #464a47; +} + +.komponenta a.edit:hover, +.edit-addnew { + text-decoration: none; +} + +.komponenta .polozka .inline { + margin-bottom: 10px; +} + +.komponenta .polozka .inline li { + float: left; + padding-left: 5px; + list-style: none; +} + +.vsechnykategorie { + /*float:left;*/ + margin-bottom: 20px; +} + +.kategorie { + width: 100px; + margin: 5px 2px 2px 2px; + border: 1px solid #AAA; + overflow: hidden; + height: 21px; + line-height: 21px; + padding: 0px 10px 0px 10px; + font-weight: bold; + font-size: 0.7em; +} + +.komponenty .komponenta { + /*width: 760px;*/ +} + +.komponenty .komponenta .nadpis .popis { + /*width: 640px;*/ +} + +/*--------------------POSKYTUJE-------------------------*/ + +.poskytuje { + padding: 5px; + width: 100%; + margin: 0 auto; + +} + +.poskytuje th { + text-align: left; + font-weight: bold; + +} + +.poskytuje .text { + width: 98%; +} + +.poskytuje .jmeno { + +} + +.poskytuje .typ { + width: 90px; +} + +.poskytuje .hodnota { + max-width: 580px; + width: 580px; +} + +/*-------------------------VYZADUJE------------------------------*/ +.vyzaduje { + padding: 10px; + width: 100%; + margin: 0 auto; + font-size: 0.9em; +} + +.komponenta .vyzaduje { + padding: 0px; + width: 830px; +} + +.vyzaduje input { + width: 98%; + margin: 0 auto; +} + +.vyzaduje th { + text-align: left; + font-weight: bold; + /*background: #f5f5f1;*/ +} + +.vyzaduje .text { + width: 98%; + margin: 0 auto; +} + +.vyzaduje .tlacitko { + width: 150px; +} + +.vyzaduje .komentar { + width: 98%; + padding: 0 0 10px 0; + font-size: 0.9em; + font-style: italic; +} + +.vyzaduje .jmeno { + width: 100px; +} + +.vyzaduje .filter { + width: 600px; +} + +.vyzaduje td.req-neuspech { + color: #f86965; +} + +/*---------------ANIMACNI_ODKAZY---------------------------------------*/ +#animacni_odkazy { + width: 880px; + margin: 0 auto; + font-size: 0.8em; + padding-top: 5px; + text-align: right; + border: 0px solid black; + +} + +/*--------------------PATICKA----------------------------------------*/ +#paticka { + padding-top: 3px; + width: 904px; + font-size: 0.6em; + margin: 0 auto; + /*border: 1px solid black;*/ + background-color: #EEE; + color: #333; +} + +/*-------------TLACITKO----------------------------------------------*/ + +.tlacitko { + text-align: center; + /*background-color: #666;*/ + background: #ddddca; + /*border: 1px solid #AAA;*/ + border: 1px solid #c8b8b5; + color: #000; + font-size: 0.8em; + +} + +.tlacitko:hover { + /*color: #222;*/ + background-color: #FFF; +} + +div.tlac { + float: left; + margin-right: 5px; +} + +/*----------------UPLOAD---------------------------------------------*/ + +div.upload { + background-color: #999; + margin-bottom: 10px; + padding: 5px; +} + +table.upload { + + /*width: 880px;*/ + /*margin: 0 auto;*/ + +} + +.upload td { + text-align: left; + width: 100%; +} + +.upload .text { + width: 400px; + color: #222; + background-color: #FFF; + border: 1px solid #AAA; +} + +.upload .tlacitko { + /*width: 200px;*/ + font-size: 0.8em; +} + +/*--------------------FORMULAR----------------------------------------*/ + +.formular { + padding: 10px; + width: 100%; + text-align: left; + +} + +.formular th { + font-weight: bold; + font-size: 0.8em; + color: #464a47; +} + +.formular td { + text-align: left; + margin: 0 auto; +} + +.formular .text { + width: 500px; + color: #222; + background-color: #FFF; + border: 1px solid #AAA; +} + +.formular .chyba { + color: red; + font-weight: bold; + padding: 0 10px 0 10px; +} + +.formular .tlacitko { + margin: 10px 0 0 0; +} + +.formy th { + font-size: 0.8em; + color: #464a47; +} + +.categorie-edit-ul li { + font-size: 0.8em; + color: #464a47; + +} + +/*-----------------EXECUTE_COMMIT-------------------------*/ + +.execute_commit .tlacitko { + margin: 0 0 10px 10px; +} + +/*------------------COMPATIBILITY-------------------------*/ +.pivot { + background-color: #FCFC55; } \ No newline at end of file diff --git a/modules/crce-webui/src/main/webapp/graphic/add.png b/core/crce-webui/src/main/webapp/graphic/add.png similarity index 100% rename from modules/crce-webui/src/main/webapp/graphic/add.png rename to core/crce-webui/src/main/webapp/graphic/add.png diff --git a/modules/crce-webui/src/main/webapp/graphic/check.png b/core/crce-webui/src/main/webapp/graphic/check.png similarity index 100% rename from modules/crce-webui/src/main/webapp/graphic/check.png rename to core/crce-webui/src/main/webapp/graphic/check.png diff --git a/modules/crce-webui/src/main/webapp/graphic/commit.png b/core/crce-webui/src/main/webapp/graphic/commit.png similarity index 100% rename from modules/crce-webui/src/main/webapp/graphic/commit.png rename to core/crce-webui/src/main/webapp/graphic/commit.png diff --git a/modules/crce-webui/src/main/webapp/graphic/crce.png b/core/crce-webui/src/main/webapp/graphic/crce.png similarity index 100% rename from modules/crce-webui/src/main/webapp/graphic/crce.png rename to core/crce-webui/src/main/webapp/graphic/crce.png diff --git a/modules/crce-webui/src/main/webapp/graphic/del.png b/core/crce-webui/src/main/webapp/graphic/del.png similarity index 100% rename from modules/crce-webui/src/main/webapp/graphic/del.png rename to core/crce-webui/src/main/webapp/graphic/del.png diff --git a/modules/crce-webui/src/main/webapp/graphic/edit.png b/core/crce-webui/src/main/webapp/graphic/edit.png similarity index 100% rename from modules/crce-webui/src/main/webapp/graphic/edit.png rename to core/crce-webui/src/main/webapp/graphic/edit.png diff --git a/modules/crce-webui/src/main/webapp/graphic/heading-bg.png b/core/crce-webui/src/main/webapp/graphic/heading-bg.png similarity index 100% rename from modules/crce-webui/src/main/webapp/graphic/heading-bg.png rename to core/crce-webui/src/main/webapp/graphic/heading-bg.png diff --git a/modules/crce-webui/src/main/webapp/graphic/hlavicka_bg.png b/core/crce-webui/src/main/webapp/graphic/hlavicka_bg.png similarity index 100% rename from modules/crce-webui/src/main/webapp/graphic/hlavicka_bg.png rename to core/crce-webui/src/main/webapp/graphic/hlavicka_bg.png diff --git a/modules/crce-webui/src/main/webapp/graphic/hlavicka_loga.png b/core/crce-webui/src/main/webapp/graphic/hlavicka_loga.png similarity index 100% rename from modules/crce-webui/src/main/webapp/graphic/hlavicka_loga.png rename to core/crce-webui/src/main/webapp/graphic/hlavicka_loga.png diff --git a/modules/crce-webui/src/main/webapp/graphic/logo.png b/core/crce-webui/src/main/webapp/graphic/logo.png similarity index 100% rename from modules/crce-webui/src/main/webapp/graphic/logo.png rename to core/crce-webui/src/main/webapp/graphic/logo.png diff --git a/modules/crce-webui/src/main/webapp/graphic/menu_bg.png b/core/crce-webui/src/main/webapp/graphic/menu_bg.png similarity index 100% rename from modules/crce-webui/src/main/webapp/graphic/menu_bg.png rename to core/crce-webui/src/main/webapp/graphic/menu_bg.png diff --git a/modules/crce-webui/src/main/webapp/graphic/save.png b/core/crce-webui/src/main/webapp/graphic/save.png similarity index 100% rename from modules/crce-webui/src/main/webapp/graphic/save.png rename to core/crce-webui/src/main/webapp/graphic/save.png diff --git a/modules/crce-webui/src/main/webapp/graphic/zoom.png b/core/crce-webui/src/main/webapp/graphic/zoom.png similarity index 100% rename from modules/crce-webui/src/main/webapp/graphic/zoom.png rename to core/crce-webui/src/main/webapp/graphic/zoom.png diff --git a/modules/crce-webui/src/main/webapp/index.jsp b/core/crce-webui/src/main/webapp/index.jsp similarity index 95% rename from modules/crce-webui/src/main/webapp/index.jsp rename to core/crce-webui/src/main/webapp/index.jsp index d2d4d35d..778705d7 100644 --- a/modules/crce-webui/src/main/webapp/index.jsp +++ b/core/crce-webui/src/main/webapp/index.jsp @@ -4,19 +4,15 @@ Author : kalwi --%> -<%@page import="cz.zcu.kiv.crce.metadata.Attribute"%> -<%@page import="java.util.List"%> +<%@page import="cz.zcu.kiv.crce.metadata.*"%> +<%@page import="cz.zcu.kiv.crce.plugin.Plugin"%> <% response.sendRedirect("resource"); %> -<%@page import="cz.zcu.kiv.crce.plugin.Plugin"%> -<%@page import="cz.zcu.kiv.crce.metadata.Requirement"%> -<%@page import="cz.zcu.kiv.crce.metadata.Property"%> -<%@page import="cz.zcu.kiv.crce.metadata.Capability"%> <%@page import="cz.zcu.kiv.crce.repository.Buffer"%> <%@page import="cz.zcu.kiv.crce.webui.internal.Activator"%> -<%@page import="cz.zcu.kiv.crce.metadata.Resource"%> +<%@page import="java.util.List"%> <%@page contentType="text/html" pageEncoding="UTF-8"%> diff --git a/modules/crce-webui/src/main/webapp/js/jquery-1.5.1.js b/core/crce-webui/src/main/webapp/js/jquery-1.5.1.js similarity index 100% rename from modules/crce-webui/src/main/webapp/js/jquery-1.5.1.js rename to core/crce-webui/src/main/webapp/js/jquery-1.5.1.js diff --git a/modules/crce-webui/src/main/webapp/js/plus_minus_form.js b/core/crce-webui/src/main/webapp/js/plus_minus_form.js similarity index 96% rename from modules/crce-webui/src/main/webapp/js/plus_minus_form.js rename to core/crce-webui/src/main/webapp/js/plus_minus_form.js index 535f5fdf..53d96e75 100644 --- a/modules/crce-webui/src/main/webapp/js/plus_minus_form.js +++ b/core/crce-webui/src/main/webapp/js/plus_minus_form.js @@ -1,49 +1,49 @@ -var element_id = 2; - -function plus() { - var x = document.getElementById('options'); - - var name = document.createElement('input'); - name.setAttribute('name', 'name_' + element_id ); - name.setAttribute('type', 'text'); - - var value = document.createElement('input'); - value.setAttribute('name', 'value_' + element_id ); - value.setAttribute('class', 'text'); - value.setAttribute('type', 'text'); - - var nameText = document.createTextNode('Name: '); - var valueText = document.createTextNode('Value: '); - - var tr = document.createElement('tr'); - tr.setAttribute('id', 'option_' + element_id); - var thName = document.createElement('th'); - var thValue = document.createElement('th'); - var tdName = document.createElement('td'); - var tdValue = document.createElement('td'); - - thName.appendChild(nameText); - tdName.appendChild(name); - thValue.appendChild(valueText); - tdValue.appendChild(value); - - tr.appendChild(thName); - tr.appendChild(tdName); - tr.appendChild(thValue); - tr.appendChild(tdValue); - - x.appendChild(tr); - - element_id = element_id + 1; -} - -function minus(){ - if( element_id <= 2 ) - return; - - element_id = element_id - 1; - var d = document.getElementById('options'); - var olddiv = document.getElementById( 'option_' + element_id ); - - d.removeChild(olddiv); +var element_id = 2; + +function plus() { + var x = document.getElementById('options'); + + var name = document.createElement('input'); + name.setAttribute('name', 'name_' + element_id ); + name.setAttribute('type', 'text'); + + var value = document.createElement('input'); + value.setAttribute('name', 'value_' + element_id ); + value.setAttribute('class', 'text'); + value.setAttribute('type', 'text'); + + var nameText = document.createTextNode('Name: '); + var valueText = document.createTextNode('Value: '); + + var tr = document.createElement('tr'); + tr.setAttribute('id', 'option_' + element_id); + var thName = document.createElement('th'); + var thValue = document.createElement('th'); + var tdName = document.createElement('td'); + var tdValue = document.createElement('td'); + + thName.appendChild(nameText); + tdName.appendChild(name); + thValue.appendChild(valueText); + tdValue.appendChild(value); + + tr.appendChild(thName); + tr.appendChild(tdName); + tr.appendChild(thValue); + tr.appendChild(tdValue); + + x.appendChild(tr); + + element_id = element_id + 1; +} + +function minus(){ + if( element_id <= 2 ) + return; + + element_id = element_id - 1; + var d = document.getElementById('options'); + var olddiv = document.getElementById( 'option_' + element_id ); + + d.removeChild(olddiv); } \ No newline at end of file diff --git a/modules/crce-webui/src/main/webapp/js/slide.js b/core/crce-webui/src/main/webapp/js/slide.js similarity index 96% rename from modules/crce-webui/src/main/webapp/js/slide.js rename to core/crce-webui/src/main/webapp/js/slide.js index b9843914..dda091b8 100644 --- a/modules/crce-webui/src/main/webapp/js/slide.js +++ b/core/crce-webui/src/main/webapp/js/slide.js @@ -1,19 +1,19 @@ -$(document).ready(function(){ - $(".informace").hide(); - - $(".popis").click(function(){ - $(this).parent().next(".informace").slideToggle(500) - return false; - }); - - $(".rozbalit").click(function(){ - $(".informace").slideDown(500) - return false; - }); - - $(".sbalit").click(function(){ - $(".informace").slideUp(500) - return false; - }); - +$(document).ready(function(){ + $(".informace").hide(); + + $(".popis").click(function(){ + $(this).parent().next(".informace").slideToggle(500) + return false; + }); + + $(".rozbalit").click(function(){ + $(".informace").slideDown(500) + return false; + }); + + $(".sbalit").click(function(){ + $(".informace").slideUp(500) + return false; + }); + }); \ No newline at end of file diff --git a/modules/crce-webui/src/main/webapp/jsp/buffer.jsp b/core/crce-webui/src/main/webapp/jsp/buffer.jsp similarity index 100% rename from modules/crce-webui/src/main/webapp/jsp/buffer.jsp rename to core/crce-webui/src/main/webapp/jsp/buffer.jsp diff --git a/modules/crce-webui/src/main/webapp/jsp/compatibility.jsp b/core/crce-webui/src/main/webapp/jsp/compatibility.jsp similarity index 100% rename from modules/crce-webui/src/main/webapp/jsp/compatibility.jsp rename to core/crce-webui/src/main/webapp/jsp/compatibility.jsp index 48e91628..8a33ad76 100644 --- a/modules/crce-webui/src/main/webapp/jsp/compatibility.jsp +++ b/core/crce-webui/src/main/webapp/jsp/compatibility.jsp @@ -1,5 +1,5 @@ -<%@ page import="cz.zcu.kiv.typescmp.Difference" %> <%@ page import="cz.zcu.kiv.crce.compatibility.Compatibility" %> +<%@ page import="cz.zcu.kiv.typescmp.Difference" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> diff --git a/modules/crce-webui/src/main/webapp/jsp/forms/capabilitiesForm.jsp b/core/crce-webui/src/main/webapp/jsp/forms/capabilitiesForm.jsp similarity index 97% rename from modules/crce-webui/src/main/webapp/jsp/forms/capabilitiesForm.jsp rename to core/crce-webui/src/main/webapp/jsp/forms/capabilitiesForm.jsp index 7bf9d7f5..d89513e4 100644 --- a/modules/crce-webui/src/main/webapp/jsp/forms/capabilitiesForm.jsp +++ b/core/crce-webui/src/main/webapp/jsp/forms/capabilitiesForm.jsp @@ -1,47 +1,47 @@ -<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> - - - - - -
- -

Capabilities form

- -

Resource: ${resource.presentationName} - ${resource.version}

-

Capability: ${capability.name}

- - -

- [add new property]
-

- -
- - - - - - - - - - - - - - -
NameTypeValue
- - -
-
- - -
- +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + + + +
+ +

Capabilities form

+ +

Resource: ${resource.presentationName} - ${resource.version}

+

Capability: ${capability.name}

+ + +

+ [add new property]
+

+ +
+ + + + + + + + + + + + + + +
NameTypeValue
+ + +
+
+ + +
+ \ No newline at end of file diff --git a/modules/crce-webui/src/main/webapp/jsp/forms/capabilityForm.jsp b/core/crce-webui/src/main/webapp/jsp/forms/capabilityForm.jsp similarity index 96% rename from modules/crce-webui/src/main/webapp/jsp/forms/capabilityForm.jsp rename to core/crce-webui/src/main/webapp/jsp/forms/capabilityForm.jsp index b4f589b1..8cc6df49 100644 --- a/modules/crce-webui/src/main/webapp/jsp/forms/capabilityForm.jsp +++ b/core/crce-webui/src/main/webapp/jsp/forms/capabilityForm.jsp @@ -1,31 +1,31 @@ -<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> - - - - - -
- -

Add new capability

- -

Resource: ${resource.presentationName} - ${resource.version}

- -
- - - - - - - - - - - -
Capability name:${capabilityError}
-
- - -
- +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + + + +
+ +

Add new capability

+ +

Resource: ${resource.presentationName} - ${resource.version}

+ +
+ + + + + + + + + + + +
Capability name:${capabilityError}
+
+ + +
+ \ No newline at end of file diff --git a/modules/crce-webui/src/main/webapp/jsp/forms/categoriesForm.jsp b/core/crce-webui/src/main/webapp/jsp/forms/categoriesForm.jsp similarity index 97% rename from modules/crce-webui/src/main/webapp/jsp/forms/categoriesForm.jsp rename to core/crce-webui/src/main/webapp/jsp/forms/categoriesForm.jsp index 05846f97..78c82ee7 100644 --- a/modules/crce-webui/src/main/webapp/jsp/forms/categoriesForm.jsp +++ b/core/crce-webui/src/main/webapp/jsp/forms/categoriesForm.jsp @@ -1,25 +1,25 @@ -<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> - - - - - -
- -

Existing categories

- -

Resource: ${resource.presentationName} - ${resource.version}

- - - -

- [add new category]
-

- -
- +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + + + +
+ +

Existing categories

+ +

Resource: ${resource.presentationName} - ${resource.version}

+ + + +

+ [add new category]
+

+ +
+ \ No newline at end of file diff --git a/modules/crce-webui/src/main/webapp/jsp/forms/categoryForm.jsp b/core/crce-webui/src/main/webapp/jsp/forms/categoryForm.jsp similarity index 96% rename from modules/crce-webui/src/main/webapp/jsp/forms/categoryForm.jsp rename to core/crce-webui/src/main/webapp/jsp/forms/categoryForm.jsp index 54247ce4..4c0d7028 100644 --- a/modules/crce-webui/src/main/webapp/jsp/forms/categoryForm.jsp +++ b/core/crce-webui/src/main/webapp/jsp/forms/categoryForm.jsp @@ -1,31 +1,31 @@ -<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> - - - - - -
- -

Add new category

- -

Resource: ${resource.presentationName} - ${resource.version}

- -
- - - - - - - - - - - - -
Category name:${categoryError}
-
- -
- +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + + + +
+ +

Add new category

+ +

Resource: ${resource.presentationName} - ${resource.version}

+ +
+ + + + + + + + + + + + +
Category name:${categoryError}
+
+ +
+ \ No newline at end of file diff --git a/modules/crce-webui/src/main/webapp/jsp/forms/pluginForm.jsp b/core/crce-webui/src/main/webapp/jsp/forms/pluginForm.jsp similarity index 96% rename from modules/crce-webui/src/main/webapp/jsp/forms/pluginForm.jsp rename to core/crce-webui/src/main/webapp/jsp/forms/pluginForm.jsp index 52a5c48e..fc150f19 100644 --- a/modules/crce-webui/src/main/webapp/jsp/forms/pluginForm.jsp +++ b/core/crce-webui/src/main/webapp/jsp/forms/pluginForm.jsp @@ -1,35 +1,35 @@ -<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> - - - - - -
- -

Plugin form

- -

Plugin: ${plugin.pluginId}

- -
- - - - - - - - - - - - - - - - -
Priority:${priorityError}
Keywords:${keywordsError}
-
- -
- +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + + + +
+ +

Plugin form

+ +

Plugin: ${plugin.pluginId}

+ +
+ + + + + + + + + + + + + + + + +
Priority:${priorityError}
Keywords:${keywordsError}
+
+ +
+ \ No newline at end of file diff --git a/modules/crce-webui/src/main/webapp/jsp/forms/propertiesForm.jsp b/core/crce-webui/src/main/webapp/jsp/forms/propertiesForm.jsp similarity index 97% rename from modules/crce-webui/src/main/webapp/jsp/forms/propertiesForm.jsp rename to core/crce-webui/src/main/webapp/jsp/forms/propertiesForm.jsp index aae302b8..86fa9856 100644 --- a/modules/crce-webui/src/main/webapp/jsp/forms/propertiesForm.jsp +++ b/core/crce-webui/src/main/webapp/jsp/forms/propertiesForm.jsp @@ -1,58 +1,58 @@ -<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> - - - - - -
- -

Properties form

- -

Resource: ${resource.presentationName} - ${resource.version}

- -
- - - - - - - - - - - - - - - - - - - - - -
Symbolic name:${symbolicNameError}
Version:${versionError}
-
- -
- +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + + + +
+ +

Properties form

+ +

Resource: ${resource.presentationName} - ${resource.version}

+ +
+ + + + + + + + + + + + + + + + + + + + + +
Symbolic name:${symbolicNameError}
Version:${versionError}
+
+ +
+ \ No newline at end of file diff --git a/modules/crce-webui/src/main/webapp/jsp/forms/propertyForm.jsp b/core/crce-webui/src/main/webapp/jsp/forms/propertyForm.jsp similarity index 97% rename from modules/crce-webui/src/main/webapp/jsp/forms/propertyForm.jsp rename to core/crce-webui/src/main/webapp/jsp/forms/propertyForm.jsp index 1f9b03aa..83a6b418 100644 --- a/modules/crce-webui/src/main/webapp/jsp/forms/propertyForm.jsp +++ b/core/crce-webui/src/main/webapp/jsp/forms/propertyForm.jsp @@ -1,49 +1,49 @@ -<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> - - - - - -
- -

Add new property

- -

Resource: ${resource.presentationName} - ${resource.version}

- -
- - - - - - - - - - - - - - - - - - - - - - - -
Name:${nameError}
Type: - - - ${typeError}
Value:${valueError}
-
- -
- +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + + + +
+ +

Add new property

+ +

Resource: ${resource.presentationName} - ${resource.version}

+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
Name:${nameError}
Type: + + + ${typeError}
Value:${valueError}
+
+ +
+ \ No newline at end of file diff --git a/modules/crce-webui/src/main/webapp/jsp/forms/requirementForm.jsp b/core/crce-webui/src/main/webapp/jsp/forms/requirementForm.jsp similarity index 97% rename from modules/crce-webui/src/main/webapp/jsp/forms/requirementForm.jsp rename to core/crce-webui/src/main/webapp/jsp/forms/requirementForm.jsp index 5308fa02..16b74252 100644 --- a/modules/crce-webui/src/main/webapp/jsp/forms/requirementForm.jsp +++ b/core/crce-webui/src/main/webapp/jsp/forms/requirementForm.jsp @@ -1,56 +1,56 @@ -<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> - - - - - -
- -

Add new requirement

- -

Resource: ${resource.presentationName} - ${resource.version}

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Name:${nameError}
Filter:${filterError}
Comment:${commentError}
Multiple:checked="checked" />${multipleError}
Optional:checked="checked" />${optionalError}
Extend:checked="checked" />${extendError}
-
- -
- +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + + + +
+ +

Add new requirement

+ +

Resource: ${resource.presentationName} - ${resource.version}

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name:${nameError}
Filter:${filterError}
Comment:${commentError}
Multiple:checked="checked" />${multipleError}
Optional:checked="checked" />${optionalError}
Extend:checked="checked" />${extendError}
+
+ +
+ \ No newline at end of file diff --git a/modules/crce-webui/src/main/webapp/jsp/forms/requirementsForm.jsp b/core/crce-webui/src/main/webapp/jsp/forms/requirementsForm.jsp similarity index 98% rename from modules/crce-webui/src/main/webapp/jsp/forms/requirementsForm.jsp rename to core/crce-webui/src/main/webapp/jsp/forms/requirementsForm.jsp index 6921279f..09c993f9 100644 --- a/modules/crce-webui/src/main/webapp/jsp/forms/requirementsForm.jsp +++ b/core/crce-webui/src/main/webapp/jsp/forms/requirementsForm.jsp @@ -1,40 +1,40 @@ -<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> - - - - - -
- -

Requirements form

- -

Resource: ${resource.presentationName} - ${resource.version}

- -

- [add new requirement]
-

- -
- - - - - -
- - - - - - - - - - - -
NameFilterMultipleOptionalExtend
Comment
checked="checked" />checked="checked" />checked="checked" />
-
- -
- +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + + + +
+ +

Requirements form

+ +

Resource: ${resource.presentationName} - ${resource.version}

+ +

+ [add new requirement]
+

+ +
+ + + + + +
+ + + + + + + + + + + +
NameFilterMultipleOptionalExtend
Comment
checked="checked" />checked="checked" />checked="checked" />
+
+ +
+ \ No newline at end of file diff --git a/modules/crce-webui/src/main/webapp/jsp/forms/testForm.jsp b/core/crce-webui/src/main/webapp/jsp/forms/testForm.jsp similarity index 96% rename from modules/crce-webui/src/main/webapp/jsp/forms/testForm.jsp rename to core/crce-webui/src/main/webapp/jsp/forms/testForm.jsp index d1cbfaa1..4339f5a1 100644 --- a/modules/crce-webui/src/main/webapp/jsp/forms/testForm.jsp +++ b/core/crce-webui/src/main/webapp/jsp/forms/testForm.jsp @@ -1,66 +1,66 @@ -<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> - - - - - -
- -

Test form

- - - -

Resources

-
    - -
  • ${resource.symbolicName}
  • -
    -
-
- -

No resources selected!

-
-
- - - -

Test plugins

-
- - - - - - - -
${test}
- -

Test parameters:

- - - - - - - -
Name: Value:
- -

- add Add parameter - delete Remove parameter -

- -

- -

- -
-
- -

No test plugins enabled!

-
-
- -
- +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + + + +
+ +

Test form

+ + + +

Resources

+
    + +
  • ${resource.symbolicName}
  • +
    +
+
+ +

No resources selected!

+
+
+ + + +

Test plugins

+
+ + + + + + + +
${test}
+ +

Test parameters:

+ + + + + + + +
Name: Value:
+ +

+ add Add parameter + delete Remove parameter +

+ +

+ +

+ +
+
+ +

No test plugins enabled!

+
+
+ +
+ \ No newline at end of file diff --git a/modules/crce-webui/src/main/webapp/jsp/include/footer.jsp b/core/crce-webui/src/main/webapp/jsp/include/footer.jsp similarity index 97% rename from modules/crce-webui/src/main/webapp/jsp/include/footer.jsp rename to core/crce-webui/src/main/webapp/jsp/include/footer.jsp index d777bcf4..49d96735 100644 --- a/modules/crce-webui/src/main/webapp/jsp/include/footer.jsp +++ b/core/crce-webui/src/main/webapp/jsp/include/footer.jsp @@ -1,11 +1,11 @@ -<%@ page import="cz.zcu.kiv.crce.webui.internal.VersionInfo" %> - -<% VersionInfo versionInfo = VersionInfo.getVersionInfo(getServletContext()); %> - -
CRCE version <%= versionInfo.getProductVersion() %> build rev. <%= versionInfo.getBuildRevision() %> -
© 2011-2015 University of West Bohemia, Department of Computer Science -- -ReliSA research group
- - - - +<%@ page import="cz.zcu.kiv.crce.webui.internal.VersionInfo" %> + +<% VersionInfo versionInfo = VersionInfo.getVersionInfo(getServletContext()); %> + +
CRCE version <%= versionInfo.getProductVersion() %> build rev. <%= versionInfo.getBuildRevision() %> +
© 2011-2015 University of West Bohemia, Department of Computer Science -- +ReliSA research group
+ + + + diff --git a/modules/crce-webui/src/main/webapp/jsp/include/header.jsp b/core/crce-webui/src/main/webapp/jsp/include/header.jsp similarity index 100% rename from modules/crce-webui/src/main/webapp/jsp/include/header.jsp rename to core/crce-webui/src/main/webapp/jsp/include/header.jsp diff --git a/modules/crce-webui/src/main/webapp/jsp/plugins.jsp b/core/crce-webui/src/main/webapp/jsp/plugins.jsp similarity index 100% rename from modules/crce-webui/src/main/webapp/jsp/plugins.jsp rename to core/crce-webui/src/main/webapp/jsp/plugins.jsp diff --git a/modules/crce-webui/src/main/webapp/jsp/store.jsp b/core/crce-webui/src/main/webapp/jsp/store.jsp similarity index 100% rename from modules/crce-webui/src/main/webapp/jsp/store.jsp rename to core/crce-webui/src/main/webapp/jsp/store.jsp diff --git a/modules/crce-webui/src/main/webapp/jsp/tags.jsp b/core/crce-webui/src/main/webapp/jsp/tags.jsp similarity index 100% rename from modules/crce-webui/src/main/webapp/jsp/tags.jsp rename to core/crce-webui/src/main/webapp/jsp/tags.jsp diff --git a/modules/crce-webui/src/main/webapp/test.jsp b/core/crce-webui/src/main/webapp/test.jsp similarity index 100% rename from modules/crce-webui/src/main/webapp/test.jsp rename to core/crce-webui/src/main/webapp/test.jsp index d6d47d25..4f8fecf2 100644 --- a/modules/crce-webui/src/main/webapp/test.jsp +++ b/core/crce-webui/src/main/webapp/test.jsp @@ -1,10 +1,10 @@ -<%@page import="cz.zcu.kiv.crce.plugin.Plugin"%> -<%@page import="cz.zcu.kiv.crce.metadata.Requirement"%> -<%@page import="cz.zcu.kiv.crce.metadata.Property"%> <%@page import="cz.zcu.kiv.crce.metadata.Capability"%> +<%@page import="cz.zcu.kiv.crce.metadata.Property"%> +<%@page import="cz.zcu.kiv.crce.metadata.Requirement"%> +<%@page import="cz.zcu.kiv.crce.metadata.Resource"%> +<%@page import="cz.zcu.kiv.crce.plugin.Plugin"%> <%@page import="cz.zcu.kiv.crce.repository.Buffer"%> <%@page import="cz.zcu.kiv.crce.webui.internal.Activator"%> -<%@page import="cz.zcu.kiv.crce.metadata.Resource"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> diff --git a/modules/crce-webui/src/test/java/cz/zcu/kiv/crce/webui/internal/ResourceServletTest.java b/core/crce-webui/src/test/java/cz/zcu/kiv/crce/webui/internal/ResourceServletTest.java similarity index 100% rename from modules/crce-webui/src/test/java/cz/zcu/kiv/crce/webui/internal/ResourceServletTest.java rename to core/crce-webui/src/test/java/cz/zcu/kiv/crce/webui/internal/ResourceServletTest.java diff --git a/core/pom.xml b/core/pom.xml index 3963545d..b8f56cdd 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -20,6 +20,7 @@ crce-metadata-service-api crce-repository-api crce-resolver-api + crce-compatibility-api crce-metadata-json-impl crce-metadata-impl @@ -29,7 +30,13 @@ crce-repository-impl crce-resolver-impl + crce-concurrency + + + crce-core + + diff --git a/crce-artifact-finder-script.py b/crce-artifact-finder-script.py new file mode 100755 index 00000000..ea415776 --- /dev/null +++ b/crce-artifact-finder-script.py @@ -0,0 +1,45 @@ +# This script will walk directory tree of crce project and +# prints artifact ids of all poms it will find in following format: +# filepath: parentArtifactId -> currentArtifactId for artifacts with parent +# filepath: currentArtifactId for artifacts without parent +# Implemented method is compatible with Python 2.2 - 3.4 + +import fnmatch +import os +import xml.etree.ElementTree as ET + +# format for printing artifacts with parent +# filepath: parentArtifactId -> currentArtifactId +artifactWithParentFormat = '%s: %s -> %s' + +# format for printing artifacts without parent +# filepath: currentArtifactId +artifactFormat = '%s: %s' + +# base path to crce +pathToCrce = 'c:\\users\\valesz\\documents\\crce' + +# pom namespace +pomNs = '{http://maven.apache.org/POM/4.0.0}' + +# this array will contain only folders where the pom is stored +# e.g. c:\tmp instead of c:\tmp\pom.xml +matches = [] +for root, dirnames, filenames in os.walk(pathToCrce): + for filename in fnmatch.filter(filenames, '*pom.xml'): + matches.append(root) + +# parse poms and print results +for pathToPom in matches: + tree = ET.parse(pathToPom+'//pom.xml') + root = tree.getroot() + aIdElem = root.find(pomNs+'artifactId') + currentArtifactId = aIdElem.text + + # check if the current pom has parent defined + parentElem = root.find(pomNs+'parent') + if parentElem is None: + print artifactFormat % (pathToPom, currentArtifactId) + else: + parentAId = parentElem.find(pomNs+'artifactId').text + print artifactWithParentFormat % (pathToPom, parentAId, currentArtifactId) \ No newline at end of file diff --git a/deploy/.gitignore b/deploy/.gitignore new file mode 100644 index 00000000..bbbe5f9a --- /dev/null +++ b/deploy/.gitignore @@ -0,0 +1,6 @@ +#ignore local configuration +/conf/ + +#ignore pax generated runner files +/runner/ + diff --git a/deploy/Dockerfile b/deploy/Dockerfile new file mode 100644 index 00000000..58c9b0b5 --- /dev/null +++ b/deploy/Dockerfile @@ -0,0 +1,37 @@ +# Use java 11 jdk +FROM openjdk:11.0.3-jdk-stretch + +# Prepare environment +RUN mkdir /felix +WORKDIR /felix + +# Download and unpack Felix (6.0.3 is the latest version) +ADD https://archive.apache.org/dist/felix/org.apache.felix.main.distribution-6.0.3.tar.gz ./apache-felix.tar.gz +RUN tar xvfz apache-felix.tar.gz && rm apache-felix.tar.gz +ENV FELIX_PATH /felix/felix-framework-6.0.3 + +# Remove duplicate gogo runtime +RUN rm ${FELIX_PATH}/bundle/org.apache.felix.gogo.runtime* + +# Add CRCE modules to Felix autodeploy dir +ADD ./target/pax-runner-dir/bundles/* ${FELIX_PATH}/bundle/ + +# Create directory for installing new bundles +RUN mkdir ${FELIX_PATH}/dist + +# Copy configuration for Configuration Admin service +# 'conf' is the directory to watch (configured by 'felix.fileinstall.dir') +#RUN mkdir ${FELIX_PATH}/load +ADD ./conf.default/* ${FELIX_PATH}/conf/ + +# Felix framework configuration override +COPY ./felix-configuration/config.properties ${FELIX_PATH}/conf/ + +# Set environmental variable for connection string to mongodb +ENV mongo_connection mongodb://mongoserver:27017 + +# Run Felix (with debug enabled) +CMD cd ${FELIX_PATH} && java -Xdebug -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 -jar ./bin/felix.jar + +# Run Felix (with debug disabled) +# CMD cd ${FELIX_PATH} && java -jar ./bin/felix.jar diff --git a/deploy/J2SE-11.Profile b/deploy/J2SE-11.Profile new file mode 100644 index 00000000..b9263cd2 --- /dev/null +++ b/deploy/J2SE-11.Profile @@ -0,0 +1,138 @@ +org.osgi.framework.system.packages = \ + javax.accessibility,\ + javax.activity,\ + javax.crypto,\ + javax.crypto.interfaces,\ + javax.crypto.spec,\ + javax.imageio,\ + javax.imageio.event,\ + javax.imageio.metadata,\ + javax.imageio.plugins.bmp,\ + javax.imageio.plugins.jpeg,\ + javax.imageio.spi,\ + javax.imageio.stream,\ + javax.management,\ + javax.management.loading,\ + javax.management.modelmbean,\ + javax.management.monitor,\ + javax.management.openmbean,\ + javax.management.relation,\ + javax.management.remote,\ + javax.management.remote.rmi,\ + javax.management.timer,\ + javax.naming,\ + javax.naming.directory,\ + javax.naming.event,\ + javax.naming.ldap,\ + javax.naming.spi,\ + javax.net,\ + javax.net.ssl,\ + javax.print,\ + javax.print.attribute,\ + javax.print.attribute.standard,\ + javax.print.event,\ + javax.rmi,\ + javax.rmi.CORBA,\ + javax.rmi.ssl,\ + javax.security.auth,\ + javax.security.auth.callback,\ + javax.security.auth.kerberos,\ + javax.security.auth.login,\ + javax.security.auth.spi,\ + javax.security.auth.x500,\ + javax.security.cert,\ + javax.security.sasl,\ + javax.sound.midi,\ + javax.sound.midi.spi,\ + javax.sound.sampled,\ + javax.sound.sampled.spi,\ + javax.sql,\ + javax.sql.rowset,\ + javax.sql.rowset.serial,\ + javax.sql.rowset.spi,\ + javax.swing,\ + javax.swing.border,\ + javax.swing.colorchooser,\ + javax.swing.event,\ + javax.swing.filechooser,\ + javax.swing.plaf,\ + javax.swing.plaf.basic,\ + javax.swing.plaf.metal,\ + javax.swing.plaf.multi,\ + javax.swing.plaf.synth,\ + javax.swing.table,\ + javax.swing.text,\ + javax.swing.text.html,\ + javax.swing.text.html.parser,\ + javax.swing.text.rtf,\ + javax.swing.tree,\ + javax.swing.undo,\ + javax.transaction,\ + javax.transaction.xa,\ + javax.xml,\ + javax.xml.datatype,\ + javax.xml.namespace,\ + javax.xml.parsers,\ + javax.xml.transform,\ + javax.xml.transform.dom,\ + javax.xml.transform.sax,\ + javax.xml.transform.stream,\ + javax.xml.validation,\ + javax.xml.xpath,\ + org.ietf.jgss,\ + org.omg.CORBA,\ + org.omg.CORBA_2_3,\ + org.omg.CORBA_2_3.portable,\ + org.omg.CORBA.DynAnyPackage,\ + org.omg.CORBA.ORBPackage,\ + org.omg.CORBA.portable,\ + org.omg.CORBA.TypeCodePackage,\ + org.omg.CosNaming,\ + org.omg.CosNaming.NamingContextExtPackage,\ + org.omg.CosNaming.NamingContextPackage,\ + org.omg.Dynamic,\ + org.omg.DynamicAny,\ + org.omg.DynamicAny.DynAnyFactoryPackage,\ + org.omg.DynamicAny.DynAnyPackage,\ + org.omg.IOP,\ + org.omg.IOP.CodecFactoryPackage,\ + org.omg.IOP.CodecPackage,\ + org.omg.Messaging,\ + org.omg.PortableInterceptor,\ + org.omg.PortableInterceptor.ORBInitInfoPackage,\ + org.omg.PortableServer,\ + org.omg.PortableServer.CurrentPackage,\ + org.omg.PortableServer.POAManagerPackage,\ + org.omg.PortableServer.POAPackage,\ + org.omg.PortableServer.portable,\ + org.omg.PortableServer.ServantLocatorPackage,\ + org.omg.SendingContext,\ + org.omg.stub.java.rmi,\ + org.w3c.dom,\ + org.w3c.dom.bootstrap,\ + org.w3c.dom.css,\ + org.w3c.dom.events,\ + org.w3c.dom.html,\ + org.w3c.dom.ls,\ + org.w3c.dom.ranges,\ + org.w3c.dom.stylesheets,\ + org.w3c.dom.traversal,\ + org.w3c.dom.views ,\ + org.xml.sax,\ + org.xml.sax.ext,\ + org.xml.sax.helpers + +org.osgi.framework.executionenvironment = \ + OSGi/Minimum-1.0,\ + OSGi/Minimum-1.1,\ + OSGi/Minimum-1.2,\ + JRE-1.1,\ + J2SE-1.2,\ + J2SE-1.3,\ + J2SE-1.4,\ + J2SE-1.5,\ + JavaSE-1.5,\ + JavaSE-1.6,\ + JavaSE-1.7,\ + JavaSE-1.8,\ + J2SE-11 \ No newline at end of file diff --git a/deploy/Readme.md b/deploy/Readme.md new file mode 100644 index 00000000..36b2877e --- /dev/null +++ b/deploy/Readme.md @@ -0,0 +1,29 @@ +# Contents + +This directory contains files needed to create runnable docker image with application. + +## Provision module + +Module used to gather all necessary bundles from application. + +## conf.default directory + +Folder containing configuration files for Configuration Admin service. Since the application +is running in docker, only inside-the-container configuration should be passed (file storage, log levels, ...) +but not outside-the-container configuration such as database connection details. + +## Dockerfile + +File used to create docker image. + +## felix-configuration directory + +Felix framework configuration files. + +## prepare-bundles.sh script + +Used to process bundles so they can be run with Java 11 + + + + diff --git a/modules/conf.default/cz.zcu.kiv.crce.metadata.cfg b/deploy/conf.default/cz.zcu.kiv.crce.metadata.cfg similarity index 97% rename from modules/conf.default/cz.zcu.kiv.crce.metadata.cfg rename to deploy/conf.default/cz.zcu.kiv.crce.metadata.cfg index 6e3a357b..7d3a04ac 100644 --- a/modules/conf.default/cz.zcu.kiv.crce.metadata.cfg +++ b/deploy/conf.default/cz.zcu.kiv.crce.metadata.cfg @@ -1,11 +1,11 @@ -# Specifies whether JSON serializer should be used in toString method -# of metadata entities to produce a string representation of the entity. -# Possible values: true (default) / false -json-to-string.enabled=true - -# The same as 'json.pretty-print' but for toString case -# when json-to-string.enabled is true. -# Possible values: -# true - with line breaks and indentation (better to read), -# false (default) - without line breaks and indentation (less space). -json-to-string.pretty-print=false +# Specifies whether JSON serializer should be used in toString method +# of metadata entities to produce a string representation of the entity. +# Possible values: true (default) / false +json-to-string.enabled=true + +# The same as 'json.pretty-print' but for toString case +# when json-to-string.enabled is true. +# Possible values: +# true - with line breaks and indentation (better to read), +# false (default) - without line breaks and indentation (less space). +json-to-string.pretty-print=false diff --git a/modules/conf.default/cz.zcu.kiv.crce.metadata.dao.cfg b/deploy/conf.default/cz.zcu.kiv.crce.metadata.dao.cfg similarity index 96% rename from modules/conf.default/cz.zcu.kiv.crce.metadata.dao.cfg rename to deploy/conf.default/cz.zcu.kiv.crce.metadata.dao.cfg index 17d02f2b..2da1d2f1 100644 --- a/modules/conf.default/cz.zcu.kiv.crce.metadata.dao.cfg +++ b/deploy/conf.default/cz.zcu.kiv.crce.metadata.dao.cfg @@ -1,6 +1,6 @@ -jdbc.driver=org.h2.Driver -jdbc.url=jdbc:h2:file:metadata/crce;MODE=PostgreSQL;AUTO_SERVER=TRUE;AUTO_SERVER_PORT=9090 -jdbc.username=sa -jdbc.password= - -mybatis.config= +jdbc.driver=org.h2.Driver +jdbc.url=jdbc:h2:file:metadata/crce;MODE=PostgreSQL;AUTO_SERVER=TRUE;AUTO_SERVER_PORT=9090 +jdbc.username=sa +jdbc.password= + +mybatis.config= diff --git a/modules/conf.default/cz.zcu.kiv.crce.metadata.json.cfg b/deploy/conf.default/cz.zcu.kiv.crce.metadata.json.cfg similarity index 97% rename from modules/conf.default/cz.zcu.kiv.crce.metadata.json.cfg rename to deploy/conf.default/cz.zcu.kiv.crce.metadata.json.cfg index 94abde0f..4f11605e 100644 --- a/modules/conf.default/cz.zcu.kiv.crce.metadata.json.cfg +++ b/deploy/conf.default/cz.zcu.kiv.crce.metadata.json.cfg @@ -1,15 +1,15 @@ -# Specifies whether JSON serializer should produce -# JSON data with or without line breaks and indentation. -# Possible values: -# true - with line breaks and indentation (better to read), -# false (default) - without line breaks and indentation (less space). -json.pretty-print=true - -# Expand values of complex attribute types (List, Version) to JSON object, for example: -# "value" : {"major" : 2, "minor" : 1, "micro" : 0} -# If disabled, then values will be serialized in simple string form, for exmple: -# "value" : "2.1.0" -# Possible values: -# true - enabled, -# false - disabled. -json.expand-attribute-values=false +# Specifies whether JSON serializer should produce +# JSON data with or without line breaks and indentation. +# Possible values: +# true - with line breaks and indentation (better to read), +# false (default) - without line breaks and indentation (less space). +json.pretty-print=true + +# Expand values of complex attribute types (List, Version) to JSON object, for example: +# "value" : {"major" : 2, "minor" : 1, "micro" : 0} +# If disabled, then values will be serialized in simple string form, for exmple: +# "value" : "2.1.0" +# Possible values: +# true - enabled, +# false - disabled. +json.expand-attribute-values=false diff --git a/modules/conf.default/cz.zcu.kiv.crce.repository.filebased-store.cfg b/deploy/conf.default/cz.zcu.kiv.crce.repository.filebased-store.cfg similarity index 95% rename from modules/conf.default/cz.zcu.kiv.crce.repository.filebased-store.cfg rename to deploy/conf.default/cz.zcu.kiv.crce.repository.filebased-store.cfg index c8acce87..ad079ec2 100644 --- a/modules/conf.default/cz.zcu.kiv.crce.repository.filebased-store.cfg +++ b/deploy/conf.default/cz.zcu.kiv.crce.repository.filebased-store.cfg @@ -1,8 +1,8 @@ -# URI of repository's central store or absolute/relative file path -# -# Examples: -# store.uri=file:/C:/store -# store.uri=C:\\store -# store.uri=store - -store.uri=store +# URI of repository's central store or absolute/relative file path +# +# Examples: +# store.uri=file:/C:/store +# store.uri=C:\\store +# store.uri=store + +store.uri=store diff --git a/modules/conf.default/cz.zcu.kiv.crce.repository.maven-local.cfg b/deploy/conf.default/cz.zcu.kiv.crce.repository.maven-local.cfg similarity index 100% rename from modules/conf.default/cz.zcu.kiv.crce.repository.maven-local.cfg rename to deploy/conf.default/cz.zcu.kiv.crce.repository.maven-local.cfg diff --git a/modules/conf.default/logback.xml b/deploy/conf.default/logback.xml similarity index 96% rename from modules/conf.default/logback.xml rename to deploy/conf.default/logback.xml index 5a2649b5..36fe585b 100644 --- a/modules/conf.default/logback.xml +++ b/deploy/conf.default/logback.xml @@ -1,53 +1,53 @@ - - - - - - - - %d{YYYY-MM-dd HH:mm:ss.SSS} %-5level {%thread} [%logger{36}] %msg%n - - - - - logs/crce-debug.log - - %d{YYYY-MM-dd HH:mm:ss.SSS} %-5level {%thread} [%logger{36}] %msg%n - - - - - logs/crce.log - - INFO - - - %d{YYYY-MM-dd HH:mm:ss.SSS} %-5level {%thread} [%logger{36}] %msg%n - - - - - logs/crce-error.log - - ERROR - - - %d{YYYY-MM-dd HH:mm:ss.SSS} %-5level {%thread} [%logger{36}] %msg%n - - - - - - - - - - - - - - - - - + + + + + + + + %d{YYYY-MM-dd HH:mm:ss.SSS} %-5level {%thread} [%logger{36}] %msg%n + + + + + logs/crce-debug.log + + %d{YYYY-MM-dd HH:mm:ss.SSS} %-5level {%thread} [%logger{36}] %msg%n + + + + + logs/crce.log + + INFO + + + %d{YYYY-MM-dd HH:mm:ss.SSS} %-5level {%thread} [%logger{36}] %msg%n + + + + + logs/crce-error.log + + ERROR + + + %d{YYYY-MM-dd HH:mm:ss.SSS} %-5level {%thread} [%logger{36}] %msg%n + + + + + + + + + + + + + + + + + diff --git a/modules/conf.default/org.apache.ace.obr.servlet.cfg b/deploy/conf.default/org.apache.ace.obr.servlet.cfg similarity index 97% rename from modules/conf.default/org.apache.ace.obr.servlet.cfg rename to deploy/conf.default/org.apache.ace.obr.servlet.cfg index d5c872bb..da3e9f5b 100644 --- a/modules/conf.default/org.apache.ace.obr.servlet.cfg +++ b/deploy/conf.default/org.apache.ace.obr.servlet.cfg @@ -1,2 +1,2 @@ -# mapping of ACE OBR servlet -org.apache.ace.server.servlet.endpoint=/obr +# mapping of ACE OBR servlet +org.apache.ace.server.servlet.endpoint=/obr diff --git a/modules/conf.default/org.apache.ace.obr.storage.file.cfg b/deploy/conf.default/org.apache.ace.obr.storage.file.cfg similarity index 96% rename from modules/conf.default/org.apache.ace.obr.storage.file.cfg rename to deploy/conf.default/org.apache.ace.obr.storage.file.cfg index 4f4be5cc..3d33beaa 100644 --- a/modules/conf.default/org.apache.ace.obr.storage.file.cfg +++ b/deploy/conf.default/org.apache.ace.obr.storage.file.cfg @@ -1,2 +1,2 @@ -# path to ACE OBR Storage dir -fileLocation=store +# path to ACE OBR Storage dir +fileLocation=store diff --git a/modules/conf.default/org.apache.felix.fileinstall-deploy.cfg b/deploy/conf.default/org.apache.felix.fileinstall-deploy.cfg similarity index 96% rename from modules/conf.default/org.apache.felix.fileinstall-deploy.cfg rename to deploy/conf.default/org.apache.felix.fileinstall-deploy.cfg index d4485deb..73c880f4 100644 --- a/modules/conf.default/org.apache.felix.fileinstall-deploy.cfg +++ b/deploy/conf.default/org.apache.felix.fileinstall-deploy.cfg @@ -1,6 +1,6 @@ -felix.fileinstall.dir=deploy -felix.fileinstall.poll=5000 - -#felix.fileinstall.debug=-1 -#felix.fileinstall.filter=.*\\.cfg -#felix.fileinstall.bundles.new.start=false +felix.fileinstall.dir=deploy +felix.fileinstall.poll=5000 + +#felix.fileinstall.debug=-1 +#felix.fileinstall.filter=.*\\.cfg +#felix.fileinstall.bundles.new.start=false diff --git a/modules/conf.default/org.apache.felix.webconsole.internal.servlet.OsgiManager.cfg b/deploy/conf.default/org.apache.felix.webconsole.internal.servlet.OsgiManager.cfg similarity index 95% rename from modules/conf.default/org.apache.felix.webconsole.internal.servlet.OsgiManager.cfg rename to deploy/conf.default/org.apache.felix.webconsole.internal.servlet.OsgiManager.cfg index 1ef7eef7..e045469e 100644 --- a/modules/conf.default/org.apache.felix.webconsole.internal.servlet.OsgiManager.cfg +++ b/deploy/conf.default/org.apache.felix.webconsole.internal.servlet.OsgiManager.cfg @@ -1,3 +1,3 @@ -# Felix Webconsole configuration -username=admin -password=admin +# Felix Webconsole configuration +username=admin +password=admin diff --git a/deploy/felix-configuration/config.properties b/deploy/felix-configuration/config.properties new file mode 100644 index 00000000..e8aa53f7 --- /dev/null +++ b/deploy/felix-configuration/config.properties @@ -0,0 +1,115 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +# +# Framework config properties. +# + +# To override the packages the framework exports by default from the +# class path, set this variable. +#org.osgi.framework.system.packages= + +# To append packages to the default set of exported system packages, +# set this value. +#org.osgi.framework.system.packages.extra= + +# The following property makes specified packages from the class path +# available to all bundles. You should avoid using this property. +#org.osgi.framework.bootdelegation=sun.*,com.sun.* + +# Felix tries to guess when to implicitly boot delegate in certain +# situations to ease integration without outside code. This feature +# is enabled by default, uncomment the following line to disable it. +#felix.bootdelegation.implicit=false + +# The following property explicitly specifies the location of the bundle +# cache, which defaults to "felix-cache" in the current working directory. +# If this value is not absolute, then the felix.cache.rootdir controls +# how the absolute location is calculated. (See next property) +#org.osgi.framework.storage=${felix.cache.rootdir}/felix-cache + +# The following property is used to convert a relative bundle cache +# location into an absolute one by specifying the root to prepend to +# the relative cache path. The default for this property is the +# current working directory. +#felix.cache.rootdir=${user.dir} + +# The following property controls whether the bundle cache is flushed +# the first time the framework is initialized. Possible values are +# "none" and "onFirstInit"; the default is "none". +#org.osgi.framework.storage.clean=onFirstInit + +# The following property determines which actions are performed when +# processing the auto-deploy directory. It is a comma-delimited list of +# the following values: 'install', 'start', 'update', and 'uninstall'. +# An undefined or blank value is equivalent to disabling auto-deploy +# processing. +felix.auto.deploy.action=install,start + +# The following property specifies the directory to use as the bundle +# auto-deploy directory; the default is 'bundle' in the working directory. +#felix.auto.deploy.dir=bundle + +# The following property is a space-delimited list of bundle URLs +# to install when the framework starts. The ending numerical component +# is the target start level. Any number of these properties may be +# specified for different start levels. +#felix.auto.install.1= + +# The following property is a space-delimited list of bundle URLs +# to install and start when the framework starts. The ending numerical +# component is the target start level. Any number of these properties +# may be specified for different start levels. +#felix.auto.start.1= + +felix.log.level=1 + +# Sets the initial start level of the framework upon startup. +#org.osgi.framework.startlevel.beginning=1 + +# Sets the start level of newly installed bundles. +#felix.startlevel.bundle=1 + +# Felix installs a stream and content handler factories by default, +# uncomment the following line to not install them. +#felix.service.urlhandlers=false + +# The launcher registers a shutdown hook to cleanly stop the framework +# by default, uncomment the following line to disable it. +#felix.shutdown.hook=false + +# +# Bundle config properties. +# + +org.osgi.service.http.port=8080 +obr.repository.url=http://felix.apache.org/obr/releases.xml + +# +# Configuration Admin service settings +# +felix.cm.loglevel=4 + +# Directory to place configuration files for Configuration admin into +# default value is ./load +# Files in this directory are watched and periodically polled for changes +felix.fileinstall.dir=./conf + +# +# Place any other parameters here +# + diff --git a/deploy/pom.xml b/deploy/pom.xml new file mode 100644 index 00000000..fba06674 --- /dev/null +++ b/deploy/pom.xml @@ -0,0 +1,254 @@ + + + + 4.0.0 + + + pom + cz.zcu.kiv.crce + shared-build-settings + 2.1.2-SNAPSHOT + + + provision-reactor + 2.1.2-SNAPSHOT + + CRCE - Provision - Reactor + + pom + + + 2000 + ../conf + .*\\.cfg + ../conf/logback.xml + + + 8080 + 8443 + false + UTF-8 + + javax.inject,javax.jmdns,javax.jms,javax.mail,javax.mail.internet,javax.microedition.io + + + sun.*,com.sun.* + + + + + 1.7.26 + 1.1.2 + 7.7.10 + + + + https://github.com/ReliSA/crce/tree/master/build + https://github.com/ReliSA/crce.git + scm:git:git@github.com:ReliSA/crce.git + HEAD + + + + provision + + + + + + + + + + ${project.groupId} + crce-core + 3.0.0-SNAPSHOT + pom + + + + ${project.groupId} + crce-default-modules + 2.1.1-SNAPSHOT + pom + + + + + + javax.ws.rs + javax.ws.rs-api + 2.0 + + + + javax.servlet + javax.servlet-api + 3.0.1 + + + + org.glassfish.jersey.containers + jersey-container-servlet-core + ${version.glassfish.jersey} + + + org.glassfish.jersey.media + jersey-media-multipart + ${version.glassfish.jersey} + + + org.glassfish.jersey.media + jersey-media-json-jackson + ${version.glassfish.jersey} + + + org.glassfish.jersey.inject + jersey-hk2 + ${version.glassfish.jersey} + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + ${version.com.fasterxml.jackson} + + + com.fasterxml.jackson.jaxrs + jackson-jaxrs-json-provider + ${version.com.fasterxml.jackson} + + + + + com.vaadin + vaadin-server + ${vaadin.version} + + + com.vaadin + vaadin-push + ${vaadin.version} + + + com.vaadin + vaadin-client-compiled + ${vaadin.version} + + + com.vaadin + vaadin-themes + ${vaadin.version} + + + + + javax.xml.bind + jaxb-api + 2.3.0 + + + javax.ws.rs + javax.ws.rs-api + 2.1.1 + + + com.sun.activation + javax.activation + 1.2.0 + + + com.sun.xml.bind + jaxb-impl + 2.3.2 + + + com.yahoo.platform.yui + yuicompressor + 2.4.8 + + + + + com.sun.istack + istack-commons-runtime + 3.0.8 + + + + + org.ow2.asm + asm-commons + 7.1 + + + + + + + + + org.ops4j + maven-pax-plugin + 1.6.0 + + 1.9.0 + + --vmOptions=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=65505 + + --platform=felix + --ee=file:./J2SE-11.Profile + + + --repositories=http://uk.maven.org/maven2,http://relisa-dev.kiv.zcu.cz:8081/nexus/content/groups/public,http://repository.ops4j.org/maven2 + + + --log=debug + + mvn:org.slf4j/slf4j-api/${version.org.slf4j}@1 + mvn:org.slf4j/osgi-over-slf4j/${version.org.slf4j}@1 + mvn:org.slf4j/log4j-over-slf4j/${version.org.slf4j}@1 + mvn:org.slf4j/jcl-over-slf4j/${version.org.slf4j}@1 + mvn:org.slf4j/jul-to-slf4j/${version.org.slf4j}@1 + mvn:ch.qos.logback/logback-core/${version.logback}@1 + mvn:ch.qos.logback/logback-classic/${version.logback}@1 + + + + + + org.apache.felix + maven-bundle-plugin + 4.2.0 + + + <_noee>true + + + + + + + + + + relisa-global + ReliSA Global Proxy repository + http://relisa-dev.kiv.zcu.cz:8081/nexus/content/groups/public + + + maven.kalwi.eu.releases + kalwi.eu releases repository + http://maven.kalwi.eu/repo/releases + + + tmatesoft + https://maven.tmatesoft.com/content/repositories/releases/ + + + + diff --git a/deploy/prepare-bundles.sh b/deploy/prepare-bundles.sh new file mode 100755 index 00000000..dce36e5d --- /dev/null +++ b/deploy/prepare-bundles.sh @@ -0,0 +1,66 @@ +#!/bin/bash + +# This script will go through bundles in ${bundleDir} and removes capabilities +# which cause bundles to require old runtime environment (osgi.ee capability). +# If you can't see ${bundleDir}, run mvn pax:directory first + + +# lines to be removed from manifests +requireCapString="Require-Capability: osgi.ee;" +reqEnvString="Bundle-RequiredExecutionEnvironment: J2SE-" + +# log file, just for checking / debugging +logFile="out.log" + +# directory with bundles to be processed +bundleDir="target/pax-runner-dir/bundles" + +# path to manifest relative to the jar root +manifestPath="META-INF/MANIFEST.MF" + +# This function processes one bundle. +function process_bundle { + tmpFolder="bundle-tmp" + + # unzip jar to tmp folder + unzip -q $1 -d $tmpFolder + absManifestPath="$tmpFolder/${manifestPath}" + + # remove capabilities/requirements from MANIFEST.MF if needed and pack it back to jar + if grep -q "$requireCapString" "$absManifestPath"; then + sed -i "/${requireCapString}/d" "$absManifestPath" + echo "$requireCapString: $1" >> ${logFile} + cd ${tmpFolder} + zip -u ../$1 "${absManifestPath}" + cd .. + fi + if grep -q "$reqEnvString" "$absManifestPath"; then + sed -i "/${reqEnvString}/d" "$absManifestPath" + echo "$reqEnvString: $1" >> ${logFile} + cd ${tmpFolder} + zip -u ../$1 "${absManifestPath}" + cd .. + fi + + # remove temp folder + rm -rf $tmpFolder +} + + +# Main function +function main { + cd "${bundleDir}" + + rm ${logFile} + + for bundle in *.jar; do + process_bundle ${bundle} + done +} + + +# +# Script body +# +main + diff --git a/modules/provision/pom.xml b/deploy/provision/pom.xml similarity index 54% rename from modules/provision/pom.xml rename to deploy/provision/pom.xml index ba2cb3b1..ecad9206 100644 --- a/modules/provision/pom.xml +++ b/deploy/provision/pom.xml @@ -4,10 +4,9 @@ 4.0.0 - ../pom - cz.zcu.kiv.crce - crce-modules-parent - 2.1.1-SNAPSHOT + cz.zcu.kiv.crce + provision-reactor + 2.1.2-SNAPSHOT provision @@ -36,22 +35,26 @@ - - org.ops4j.pax.web - pax-web-extender-war - - - org.ops4j.pax.web - pax-web-jetty-bundle - - - org.ops4j.pax.web - pax-web-jsp - - - org.ops4j.pax.web - pax-web-spi - + + org.ops4j.pax.web + pax-web-jetty-bundle + + + org.ops4j.pax.web + pax-web-spi + + + org.ops4j.pax.web + pax-web-api + + + org.ops4j.pax.web + pax-web-extender-war + + + org.ops4j.pax.web + pax-web-descriptor + @@ -116,8 +119,12 @@ - asm - asm-all + org.ow2.asm + asm + + + org.ow2.asm + asm-commons org.apache.servicemix.bundles @@ -165,6 +172,66 @@ com.h2database h2 + + + commons-beanutils + commons-beanutils + + + + + javax.servlet + servlet-api + + + + javax.ws.rs + javax.ws.rs-api + + + + org.glassfish.jersey.containers + jersey-container-servlet-core + + + + org.glassfish.jersey.media + jersey-media-multipart + + + + org.glassfish.jersey.media + jersey-media-json-jackson + + + + com.fasterxml.jackson.core + jackson-annotations + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + + + com.fasterxml.jackson.jaxrs + jackson-jaxrs-base + + + com.fasterxml.jackson.jaxrs + jackson-jaxrs-xml-provider + + + com.fasterxml.jackson.jaxrs + jackson-jaxrs-json-provider + + + org.glassfish.jersey.inject + jersey-hk2 + @@ -172,6 +239,58 @@ cz.zcu.kiv.crce crce-core pom + + + + cz.zcu.kiv.crce + crce-default-modules + pom + + + + + com.vaadin + vaadin-server + + + com.vaadin + vaadin-push + + + com.vaadin + vaadin-client-compiled + + + com.vaadin + vaadin-themes + + + + + javax.xml.bind + jaxb-api + + + javax.ws.rs + javax.ws.rs-api + + + com.sun.activation + javax.activation + + + com.sun.xml.bind + jaxb-impl + + + com.yahoo.platform.yui + yuicompressor + + + + + com.sun.istack + istack-commons-runtime diff --git a/modules/crce-compatibility-api/pom.xml b/modules/crce-compatibility-api/pom.xml deleted file mode 100644 index 58b92917..00000000 --- a/modules/crce-compatibility-api/pom.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - 4.0.0 - - - ../pom - cz.zcu.kiv.crce - crce-modules-parent - 2.1.1-SNAPSHOT - - - crce-compatibility-api - bundle - - CRCE - Compatibility API - - - ${namespace}.compatibility.api - ${namespace}.compatibility - - - - - - - ${project.groupId} - crce-core - pom - - - - - \ No newline at end of file diff --git a/modules/crce-compatibility-dao-api/.classpath b/modules/crce-compatibility-dao-api/.classpath new file mode 100644 index 00000000..b8b4abe0 --- /dev/null +++ b/modules/crce-compatibility-dao-api/.classpath @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/crce-compatibility-dao-api/.project b/modules/crce-compatibility-dao-api/.project new file mode 100644 index 00000000..3b79f417 --- /dev/null +++ b/modules/crce-compatibility-dao-api/.project @@ -0,0 +1,30 @@ + + + crce-compatibility-dao-api + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.fusesource.ide.project.RiderProjectBuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.pde.PluginNature + org.fusesource.ide.project.RiderProjectNature + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/modules/crce-compatibility-dao-api/pom.xml b/modules/crce-compatibility-dao-api/pom.xml index 442780a4..3288607e 100644 --- a/modules/crce-compatibility-dao-api/pom.xml +++ b/modules/crce-compatibility-dao-api/pom.xml @@ -2,6 +2,18 @@ 4.0.0 + + + + org.apache.maven.plugins + maven-compiler-plugin + + 10 + 10 + + + + ../pom @@ -30,12 +42,12 @@ - - - ${project.groupId} - crce-compatibility-api - ${project.version} - + + + + + + diff --git a/modules/crce-compatibility-dao-mongodb/.classpath b/modules/crce-compatibility-dao-mongodb/.classpath new file mode 100644 index 00000000..b8b4abe0 --- /dev/null +++ b/modules/crce-compatibility-dao-mongodb/.classpath @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/crce-compatibility-dao-mongodb/.project b/modules/crce-compatibility-dao-mongodb/.project new file mode 100644 index 00000000..e1a47f11 --- /dev/null +++ b/modules/crce-compatibility-dao-mongodb/.project @@ -0,0 +1,30 @@ + + + crce-compatibility-dao-mongodb + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.fusesource.ide.project.RiderProjectBuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.pde.PluginNature + org.fusesource.ide.project.RiderProjectNature + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/modules/crce-compatibility-dao-mongodb/pom.xml b/modules/crce-compatibility-dao-mongodb/pom.xml index 01fae91b..e9290913 100644 --- a/modules/crce-compatibility-dao-mongodb/pom.xml +++ b/modules/crce-compatibility-dao-mongodb/pom.xml @@ -2,6 +2,18 @@ 4.0.0 + + + + org.apache.maven.plugins + maven-compiler-plugin + + 10 + 10 + + + + ../pom @@ -31,11 +43,12 @@ - - ${project.groupId} - crce-compatibility-api - ${project.version} - + + + + + + ${project.groupId} crce-compatibility-dao-api diff --git a/modules/crce-component-versioning/META-INF/MANIFEST.MF b/modules/crce-component-versioning/META-INF/MANIFEST.MF new file mode 100644 index 00000000..13ce7a17 --- /dev/null +++ b/modules/crce-component-versioning/META-INF/MANIFEST.MF @@ -0,0 +1,23 @@ +Manifest-Version: 1.0 +Bnd-LastModified: 1558293785414 +Build-Jdk: 11.0.2 +Built-By: zdenda +Bundle-Activator: cz.zcu.kiv.crce.crce_component_versioning.internal.Act + ivator +Bundle-Description: Component Repository supporting Compatibility Evalua + tion +Bundle-DocURL: http://www.kiv.zcu.cz +Bundle-ManifestVersion: 2 +Bundle-Name: CRCE - Support versification composite components +Bundle-SymbolicName: crce-component-versioning +Bundle-Vendor: ZČU KIV +Bundle-Version: 1.0 +Created-By: Apache Maven Bundle Plugin +DynamicImport-Package: * +Export-Package: cz.zcu.kiv.crce.crce_component_versioning.api;uses:="cz. + zcu.kiv.crce.crce_component_versioning.api.bean";version="1.0.0",cz.zcu + .kiv.crce.crce_component_versioning.api.bean;version="1.0.0",cz.zcu.kiv + .crce.crce_component_versioning.api.impl;uses:="cz.zcu.kiv.crce.crce_co + mponent_versioning.api,cz.zcu.kiv.crce.crce_component_versioning.api.be + an";version="1.0.0" +Tool: Bnd-3.3.0.201609221906 diff --git a/modules/crce-component-versioning/pom.xml b/modules/crce-component-versioning/pom.xml new file mode 100644 index 00000000..88be017f --- /dev/null +++ b/modules/crce-component-versioning/pom.xml @@ -0,0 +1,81 @@ + + + 4.0.0 + + crce-modules-reactor + cz.zcu.kiv.crce + 2.1.1-SNAPSHOT + + crce-component-versioning + 1.0 + CRCE - Support versification composite components + + bundle + + + CRCE - Support versification composite components + ${namespace}.crce_component_versioning + UTF-8 + 10 + + + + + org.mongodb + mongo-java-driver + + + org.apache.logging.log4j + log4j-api + + + ch.qos.logback + logback-classic + + + + + + + org.mongodb + mongo-java-driver + 3.9.1 + + + org.apache.logging.log4j + log4j-api + 2.9.0 + + + ch.qos.logback + logback-classic + 1.2.3 + + + + + + + org.apache.felix + maven-bundle-plugin + true + + META-INF + + ${bundle.namespace}.internal.Activator + ${project.artifactId} + cz.zcu.kiv.crce.crce_component_versioning.internal.* + cz.zcu.kiv.crce.crce_component_versioning.api.* + * + + !${bundle.namespace}.internal.* + + + + + + + + \ No newline at end of file diff --git a/modules/crce-component-versioning/src/main/java/cz/zcu/kiv/crce/crce_component_versioning/api/VersioningServiceApi.java b/modules/crce-component-versioning/src/main/java/cz/zcu/kiv/crce/crce_component_versioning/api/VersioningServiceApi.java new file mode 100644 index 00000000..e52f87fa --- /dev/null +++ b/modules/crce-component-versioning/src/main/java/cz/zcu/kiv/crce/crce_component_versioning/api/VersioningServiceApi.java @@ -0,0 +1,53 @@ +package cz.zcu.kiv.crce.crce_component_versioning.api; + +import cz.zcu.kiv.crce.crce_component_versioning.api.bean.ComponentBean; +import cz.zcu.kiv.crce.crce_component_versioning.api.bean.ComponentDetailBean; + +import java.util.List; + +public interface VersioningServiceApi { + /** + * Interface for accessing all records in the list of composite components. + *

+ * Date: 05.02.19 + * + * @author Roman Pesek + */ + List getCompositeComponentAll(); + + /** + * Interface for component access by id. If it is not found, it returns null. + *

+ * Date: 05.02.19 + * + * @author Roman Pesek + */ + ComponentDetailBean getCompositeComponentDetail(String id); + + /** + * Interface for saving the composite components. + *

+ * Date: 07.02.19 + * + * @author Roman Pesek + */ + boolean setCompositeComponent(String name, String version, List listId); + + /** + * Interface for remove the composite components. + *

+ * Date: 07.02.19 + * + * @author Roman Pesek + */ + boolean removeCompositeComponent(String id); + + /** + * Interface for update the composite components. + *

+ * Date: 07.02.19 + * + * @author Roman Pesek + */ + boolean updateCompositeComponent(String id, String name, String version, List listId); +} diff --git a/modules/crce-component-versioning/src/main/java/cz/zcu/kiv/crce/crce_component_versioning/api/bean/ComponentBean.java b/modules/crce-component-versioning/src/main/java/cz/zcu/kiv/crce/crce_component_versioning/api/bean/ComponentBean.java new file mode 100644 index 00000000..b9fe8af5 --- /dev/null +++ b/modules/crce-component-versioning/src/main/java/cz/zcu/kiv/crce/crce_component_versioning/api/bean/ComponentBean.java @@ -0,0 +1,44 @@ +package cz.zcu.kiv.crce.crce_component_versioning.api.bean; + +public class ComponentBean { + private String id; + private String name; + private String version; + private boolean composite; + + public ComponentBean(String id, String name, String version, boolean composite) { + this.id = id; + this.name = name; + this.version = version; + this.composite = composite; + } + + public String getId() { return id; } + + public void setId(String id) { this.id = id; } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public boolean isComposite() { return composite; } + + public void setComposite(boolean composite) { this.composite = composite; } + + @Override + public String toString(){ + return name; + } +} diff --git a/modules/crce-component-versioning/src/main/java/cz/zcu/kiv/crce/crce_component_versioning/api/bean/ComponentDetailBean.java b/modules/crce-component-versioning/src/main/java/cz/zcu/kiv/crce/crce_component_versioning/api/bean/ComponentDetailBean.java new file mode 100644 index 00000000..697ed696 --- /dev/null +++ b/modules/crce-component-versioning/src/main/java/cz/zcu/kiv/crce/crce_component_versioning/api/bean/ComponentDetailBean.java @@ -0,0 +1,33 @@ +package cz.zcu.kiv.crce.crce_component_versioning.api.bean; + +import java.util.List; + +public class ComponentDetailBean { + private String id; + private String name; + private String version; + private List content; + + public ComponentDetailBean(String id, String name, String version, List content) { + this.id = id; + this.name = name; + this.version = version; + this.content = content; + } + + public String getId() { + return id; + } + + public String getName() { + return name; + } + + public String getVersion() { + return version; + } + + public List getContent() { + return content; + } +} diff --git a/modules/crce-component-versioning/src/main/java/cz/zcu/kiv/crce/crce_component_versioning/api/impl/VersioningService.java b/modules/crce-component-versioning/src/main/java/cz/zcu/kiv/crce/crce_component_versioning/api/impl/VersioningService.java new file mode 100644 index 00000000..c0c30b2f --- /dev/null +++ b/modules/crce-component-versioning/src/main/java/cz/zcu/kiv/crce/crce_component_versioning/api/impl/VersioningService.java @@ -0,0 +1,116 @@ +package cz.zcu.kiv.crce.crce_component_versioning.api.impl; + +import com.mongodb.*; +import com.mongodb.client.MongoCursor; +import cz.zcu.kiv.crce.crce_component_versioning.api.VersioningServiceApi; +import cz.zcu.kiv.crce.crce_component_versioning.api.bean.ComponentBean; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoDatabase; +import cz.zcu.kiv.crce.crce_component_versioning.api.bean.ComponentDetailBean; +import org.bson.Document; +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.LoggerContext; +import org.bson.conversions.Bson; +import org.bson.types.ObjectId; +import org.slf4j.LoggerFactory; +import java.util.ArrayList; +import java.util.List; + +public class VersioningService implements VersioningServiceApi { + private MongoClient mongoClient; + private MongoDatabase database; + private MongoCollection collection; + + public VersioningService() { + ((LoggerContext) LoggerFactory.getILoggerFactory()).getLogger("org.mongodb.driver").setLevel(Level.ERROR); + + mongoClient = new MongoClient("localhost", 27017); + database = mongoClient.getDatabase("crce"); + collection = database.getCollection("versioning"); + } + + @Override + public List getCompositeComponentAll() { + List compositeBeans = new ArrayList<>(); + try (MongoCursor cursor = collection.find().iterator()) { + while (cursor.hasNext()) { + Document document = cursor.next(); + ComponentBean cb = new ComponentBean(document.get("_id").toString(), document.get("name").toString(), + document.get("version").toString(), true); + compositeBeans.add(cb); + } + } + return compositeBeans; + } + + @Override + public ComponentDetailBean getCompositeComponentDetail(String id) { + BasicDBObject searchQuery = new BasicDBObject(); + searchQuery.put("_id", id); + Document doc = collection.find(searchQuery).first(); + if(doc != null){ + ComponentDetailBean componentDetailBean = new ComponentDetailBean(doc.get("_id").toString(), + doc.get("name").toString(), doc.get("version").toString(), (List) doc.get("child")); + + return componentDetailBean; + } + else{ + return null; + } + } + + @Override + public boolean setCompositeComponent(String name, String version, List listId) { + Document doc = new Document("_id", new ObjectId().toString()) + .append("name", name) + .append("version", version) + .append("child", listId); + + try{ + collection.insertOne(doc); + return true; + } + catch(MongoException e){ + e.printStackTrace(); + return false; + } + } + + @Override + public boolean removeCompositeComponent(String id) { + try{ + BasicDBObject searchQuery = new BasicDBObject(); + searchQuery.put("_id", id); + Document doc = collection.find(searchQuery).first(); + if(doc != null){ + collection.deleteOne(doc); + return true; + } + else{ + return false; + } + } + catch (MongoException e){ + e.printStackTrace(); + return false; + } + } + + @Override + public boolean updateCompositeComponent(String id, String name, String version, List listId) { + try{ + Bson filter = new Document("_id", id); + Bson newValue = new Document("name", name) + .append("version", version) + .append("child", listId); + Bson updateOperationDocument = new Document("$set", newValue); + collection.updateOne(filter, updateOperationDocument); + return true; + } + + catch (MongoException e){ + e.printStackTrace(); + return false; + } + } +} diff --git a/modules/crce-component-versioning/src/main/java/cz/zcu/kiv/crce/crce_component_versioning/internal/Activator.java b/modules/crce-component-versioning/src/main/java/cz/zcu/kiv/crce/crce_component_versioning/internal/Activator.java new file mode 100644 index 00000000..48e5ecfa --- /dev/null +++ b/modules/crce-component-versioning/src/main/java/cz/zcu/kiv/crce/crce_component_versioning/internal/Activator.java @@ -0,0 +1,35 @@ +package cz.zcu.kiv.crce.crce_component_versioning.internal; + +import org.apache.felix.dm.DependencyActivatorBase; +import org.apache.felix.dm.DependencyManager; +import org.osgi.framework.BundleContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Activator extends DependencyActivatorBase { + + private static final Logger logger = LoggerFactory.getLogger(Activator.class); + + private static volatile Activator instance; + + public static Activator instance() { + if (instance == null) { + throw new IllegalStateException("Activator instance is null."); + } + return instance; + } + + @edu.umd.cs.findbugs.annotations.SuppressFBWarnings(value = "ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD", justification = "Workaround for providing DM components.") + @Override + public void init(BundleContext context, DependencyManager manager) throws Exception { + instance = this; + + manager.add(createComponent().setImplementation(this)); + logger.debug("Component versioning activator initialized."); + } + + @Override + public void destroy(BundleContext context, DependencyManager manager) throws Exception { + // nothing to do + } +} \ No newline at end of file diff --git a/modules/crce-default-modules/pom.xml b/modules/crce-default-modules/pom.xml new file mode 100644 index 00000000..9cba5514 --- /dev/null +++ b/modules/crce-default-modules/pom.xml @@ -0,0 +1,102 @@ + + + + 4.0.0 + + + + org.apache.maven.plugins + maven-compiler-plugin + + 10 + 10 + + + + + + + crce-modules-parent + cz.zcu.kiv.crce + 2.1.1-SNAPSHOT + ../pom + + + crce-default-modules + 2.1.1-SNAPSHOT + pom + + CRCE - Default modules + + + https://github.com/ReliSA/crce/tree/master/core/crce-core + https://github.com/ReliSA/crce.git + scm:git:git@github.com:ReliSA/crce.git + HEAD + + + + + ${project.groupId} + crce-metadata-osgi-bundle + 2.1.1-SNAPSHOT + + + ${project.groupId} + crce-rest-v2 + 2.1.1-SNAPSHOT + war + + + ${project.groupId} + crce-compatibility-dao-api + 2.1.1-SNAPSHOT + + + ${project.groupId} + crce-compatibility-dao-mongodb + 2.1.1-SNAPSHOT + + + ${project.groupId} + crce-vo + 2.1.1-SNAPSHOT + + + ${project.groupId} + crce-webservices-indexer + 2.1.1-SNAPSHOT + + + ${project.groupId} + crce-external-repository + 1.0 + + + ${project.groupId} + crce-component-versioning + 1.0 + + + ${project.groupId} + crce-webui-v2 + 1.5 + war + + + + + + + relisa-global + ReliSA Global Proxy repository + http://relisa-dev.kiv.zcu.cz:8081/nexus/content/groups/public + + + maven.kalwi.eu.releases + kalwi.eu releases repository + http://maven.kalwi.eu/repo/releases + + + + diff --git a/modules/crce-external-repository/.classpath b/modules/crce-external-repository/.classpath new file mode 100644 index 00000000..ca4002ec --- /dev/null +++ b/modules/crce-external-repository/.classpath @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/crce-external-repository/.project b/modules/crce-external-repository/.project new file mode 100644 index 00000000..e51afa4f --- /dev/null +++ b/modules/crce-external-repository/.project @@ -0,0 +1,55 @@ + + + crce-external-repository + + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.jboss.tools.jst.web.kb.kbbuilder + + + + + org.jboss.tools.cdi.core.cdibuilder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + org.fusesource.ide.project.RiderProjectBuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.fusesource.ide.project.RiderProjectNature + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + org.jboss.tools.jst.web.kb.kbnature + org.jboss.tools.cdi.core.cdinature + org.eclipse.wst.common.project.facet.core.nature + + diff --git a/modules/crce-external-repository/META-INF/MANIFEST.MF b/modules/crce-external-repository/META-INF/MANIFEST.MF new file mode 100644 index 00000000..fc70c6da --- /dev/null +++ b/modules/crce-external-repository/META-INF/MANIFEST.MF @@ -0,0 +1,130 @@ +Manifest-Version: 1.0 +Bnd-LastModified: 1558293776462 +Build-Jdk: 11.0.2 +Built-By: zdenda +Bundle-Activator: cz.zcu.kiv.crce.crce_external_repository.internal.Acti + vator +Bundle-ClassPath: .,lib/aether-api-1.13.1.jar,lib/aether-util-1.13.1.jar + ,lib/aether-impl-1.1.0.jar,lib/aether-spi-1.1.0.jar,lib/aether-connecto + r-basic-1.1.0.jar,lib/aether-transport-file-1.1.0.jar,lib/aether-transp + ort-http-1.1.0.jar,lib/maven-aether-provider-3.3.9.jar,lib/maven-artifa + ct-3.3.9.jar,lib/maven-builder-support-3.3.9.jar,lib/slf4j-simple-1.7.2 + 2.jar,lib/jsoup-1.10.3.jar,lib/commons-codec-1.6.jar,lib/maven-model-3. + 3.9.jar,lib/maven-model-builder-3.3.9.jar,lib/flute-1.3.0.gg2.jar,lib/o + rg.apache.httpcomponents.httpcore-4.3.2.jar,lib/org.apache.httpcomponen + ts.httpclient-4.3.5.jar,lib/guava-18.0.jar,lib/sac-1.3.jar,lib/maven-re + pository-metadata-3.3.9.jar,lib/org.codehaus.plexus.plexus-component-an + notations-1.6.jar,lib/org.codehaus.plexus.plexus-interpolation-1.21.jar + ,lib/org.codehaus.plexus.plexus-utils-3.0.22.jar,lib/org.eclipse.sisu.p + lexus-0.3.3.jar,lib/org.eclipse.sisu.inject-0.3.3.jar,lib/indexer-core- + 5.1.2-4333789.jar,lib/wagon-http-lightweight-2.3.jar,lib/wagon-provider + -api-2.3.jar,lib/wagon-http-shared4-2.3.jar,lib/indexer-artifact-5.1.2- + 4333789.jar,lib/lucene-core-3.6.2.jar,lib/lucene-queries-3.6.2.jar,lib/ + lucene-memory-3.6.2.jar,lib/lucene-highlighter-3.6.2.jar,lib/javax.anno + tation-api-1.2.jar,lib/javax.ws.rs-api-2.0.jar,lib/jersey-container-ser + vlet-core-2.9.1.jar,lib/jersey-media-multipart-2.9.1.jar +Bundle-Description: Component Repository supporting Compatibility Evalua + tion +Bundle-DocURL: http://www.kiv.zcu.cz +Bundle-ManifestVersion: 2 +Bundle-Name: CRCE - External repository support +Bundle-SymbolicName: crce-external-repository +Bundle-Vendor: ZČU KIV +Bundle-Version: 1.0 +Created-By: Apache Maven Bundle Plugin +DynamicImport-Package: * +Embed-Dependency: !sisu-guice,*;scope=compile|runtime;inline=false +Embed-Directory: lib +Embed-StripGroup: true +Embedded-Artifacts: lib/aether-api-1.13.1.jar;g="org.sonatype.aether";a= + "aether-api";v="1.13.1",lib/aether-util-1.13.1.jar;g="org.sonatype.aeth + er";a="aether-util";v="1.13.1",lib/aether-impl-1.1.0.jar;g="org.eclipse + .aether";a="aether-impl";v="1.1.0",lib/aether-spi-1.1.0.jar;g="org.ecli + pse.aether";a="aether-spi";v="1.1.0",lib/aether-connector-basic-1.1.0.j + ar;g="org.eclipse.aether";a="aether-connector-basic";v="1.1.0",lib/aeth + er-transport-file-1.1.0.jar;g="org.eclipse.aether";a="aether-transport- + file";v="1.1.0",lib/aether-transport-http-1.1.0.jar;g="org.eclipse.aeth + er";a="aether-transport-http";v="1.1.0",lib/maven-aether-provider-3.3.9 + .jar;g="org.apache.maven";a="maven-aether-provider";v="3.3.9",lib/maven + -artifact-3.3.9.jar;g="org.apache.maven";a="maven-artifact";v="3.3.9",l + ib/maven-builder-support-3.3.9.jar;g="org.apache.maven";a="maven-builde + r-support";v="3.3.9",lib/slf4j-simple-1.7.22.jar;g="org.slf4j";a="slf4j + -simple";v="1.7.22",lib/jsoup-1.10.3.jar;g="org.jsoup";a="jsoup";v="1.1 + 0.3",lib/commons-codec-1.6.jar;g="commons-codec";a="commons-codec";v="1 + .6",lib/maven-model-3.3.9.jar;g="org.apache.maven";a="maven-model";v="3 + .3.9",lib/maven-model-builder-3.3.9.jar;g="org.apache.maven";a="maven-m + odel-builder";v="3.3.9",lib/flute-1.3.0.gg2.jar;g="com.vaadin.external. + flute";a="flute";v="1.3.0.gg2",lib/org.apache.httpcomponents.httpcore-4 + .3.2.jar;g="cz.zcu.kiv.crce.wrapper";a="org.apache.httpcomponents.httpc + ore";v="4.3.2",lib/org.apache.httpcomponents.httpclient-4.3.5.jar;g="cz + .zcu.kiv.crce.wrapper";a="org.apache.httpcomponents.httpclient";v="4.3. + 5",lib/guava-18.0.jar;g="com.google.guava";a="guava";v="18.0",lib/sac-1 + .3.jar;g="org.w3c.css";a="sac";v="1.3",lib/maven-repository-metadata-3. + 3.9.jar;g="org.apache.maven";a="maven-repository-metadata";v="3.3.9",li + b/org.codehaus.plexus.plexus-component-annotations-1.6.jar;g="cz.zcu.ki + v.crce.wrapper";a="org.codehaus.plexus.plexus-component-annotations";v= + "1.6",lib/org.codehaus.plexus.plexus-interpolation-1.21.jar;g="cz.zcu.k + iv.crce.wrapper";a="org.codehaus.plexus.plexus-interpolation";v="1.21", + lib/org.codehaus.plexus.plexus-utils-3.0.22.jar;g="cz.zcu.kiv.crce.wrap + per";a="org.codehaus.plexus.plexus-utils";v="3.0.22",lib/org.eclipse.si + su.plexus-0.3.3.jar;g="org.eclipse.sisu";a="org.eclipse.sisu.plexus";v= + "0.3.3",lib/org.eclipse.sisu.inject-0.3.3.jar;g="org.eclipse.sisu";a="o + rg.eclipse.sisu.inject";v="0.3.3",lib/indexer-core-5.1.2-4333789.jar;g= + "org.apache.maven.indexer";a="indexer-core";v="5.1.2-4333789",lib/wagon + -http-lightweight-2.3.jar;g="org.apache.maven.wagon";a="wagon-http-ligh + tweight";v="2.3",lib/wagon-provider-api-2.3.jar;g="org.apache.maven.wag + on";a="wagon-provider-api";v="2.3",lib/wagon-http-shared4-2.3.jar;g="or + g.apache.maven.wagon";a="wagon-http-shared4";v="2.3",lib/indexer-artifa + ct-5.1.2-4333789.jar;g="org.apache.maven.indexer";a="indexer-artifact"; + v="5.1.2-4333789",lib/lucene-core-3.6.2.jar;g="org.apache.lucene";a="lu + cene-core";v="3.6.2",lib/lucene-queries-3.6.2.jar;g="org.apache.lucene" + ;a="lucene-queries";v="3.6.2",lib/lucene-memory-3.6.2.jar;g="org.apache + .lucene";a="lucene-memory";v="3.6.2",lib/lucene-highlighter-3.6.2.jar;g + ="org.apache.lucene";a="lucene-highlighter";v="3.6.2",lib/javax.annotat + ion-api-1.2.jar;g="javax.annotation";a="javax.annotation-api";v="1.2",l + ib/javax.ws.rs-api-2.0.jar;g="javax.ws.rs";a="javax.ws.rs-api";v="2.0", + lib/jersey-container-servlet-core-2.9.1.jar;g="org.glassfish.jersey.con + tainers";a="jersey-container-servlet-core";v="2.9.1",lib/jersey-media-m + ultipart-2.9.1.jar;g="org.glassfish.jersey.media";a="jersey-media-multi + part";v="2.9.1" +Export-Package: cz.zcu.kiv.crce.crce_external_repository.api;uses:="org. + apache.maven.index";version="1.0.0",org.apache.maven.index;uses:="org.a + pache.maven.index.artifact,org.apache.maven.index.context,org.apache.ma + ven.index.expr";version="1.0.0",org.apache.maven.index.archetype;uses:= + "org.apache.maven.index.context";version="1.0.0",org.apache.maven.index + .artifact;version="1.0.0",org.apache.maven.index.context;uses:="org.apa + che.maven.index,org.apache.maven.index.artifact";version="1.0.0",org.ap + ache.maven.index.creator;uses:="org.apache.maven.index,org.apache.maven + .index.context";version="1.0.0",org.apache.maven.index.expr;uses:="org. + apache.maven.index";version="1.0.0",org.apache.maven.index.fs;version=" + 1.0.0",org.apache.maven.index.incremental;uses:="org.apache.maven.index + .packer,org.apache.maven.index.updater";version="1.0.0",org.apache.mave + n.index.locator;uses:="org.apache.maven.index.artifact";version="1.0.0" + ,org.apache.maven.index.packer;uses:="org.apache.maven.index.context";v + ersion="1.0.0",org.apache.maven.index.search.grouping;uses:="org.apache + .maven.index";version="1.0.0",org.apache.maven.index.treeview;uses:="or + g.apache.maven.index,org.apache.maven.index.context";version="1.0.0",or + g.apache.maven.index.updater;uses:="org.apache.maven.index.context,org. + apache.maven.index.fs,org.apache.maven.index.incremental,org.apache.mav + en.wagon,org.apache.maven.wagon.authentication,org.apache.maven.wagon.e + vents,org.apache.maven.wagon.proxy";version="1.0.0",org.apache.maven.in + dex.util;uses:="org.apache.maven.index.context";version="1.0.0",org.apa + che.maven.index.util.zip;version="1.0.0",org.apache.maven.wagon;uses:=" + org.apache.maven.wagon.authentication,org.apache.maven.wagon.authorizat + ion,org.apache.maven.wagon.events,org.apache.maven.wagon.proxy,org.apac + he.maven.wagon.repository,org.apache.maven.wagon.resource";version="1.0 + .0",org.apache.maven.wagon.authentication;uses:="org.apache.maven.wagon + ";version="1.0.0",org.apache.maven.wagon.authorization;uses:="org.apach + e.maven.wagon";version="1.0.0",org.apache.maven.wagon.events;uses:="org + .apache.maven.wagon,org.apache.maven.wagon.resource";version="1.0.0",or + g.apache.maven.wagon.observers;uses:="org.apache.maven.wagon.events";ve + rsion="1.0.0",org.apache.maven.wagon.providers.http;uses:="org.apache.m + aven.wagon,org.apache.maven.wagon.authentication,org.apache.maven.wagon + .authorization,org.apache.maven.wagon.proxy,org.apache.maven.wagon.reso + urce";version="1.0.0",org.apache.maven.wagon.proxy;version="1.0.0",org. + apache.maven.wagon.repository;version="1.0.0",org.apache.maven.wagon.re + source;version="1.0.0",org.apache.maven.wagon.shared.http4;uses:="org.a + pache.maven.wagon,org.apache.maven.wagon.authorization,org.apache.maven + .wagon.repository,org.apache.maven.wagon.resource";version="1.0.0",java + x.inject;version=1 +Tool: Bnd-3.3.0.201609221906 diff --git a/modules/crce-external-repository/pom.xml b/modules/crce-external-repository/pom.xml new file mode 100644 index 00000000..cd615e5e --- /dev/null +++ b/modules/crce-external-repository/pom.xml @@ -0,0 +1,408 @@ + + 4.0.0 + + ../pom + cz.zcu.kiv.crce + crce-modules-parent + 2.1.1-SNAPSHOT + + crce-external-repository + 1.0 + CRCE - External repository support + + bundle + + + CRCE - External repository + ${namespace}.crce_external_repository + UTF-8 + 10 + + + + + + + + + org.sonatype.aether + aether-api + 1.13.1 + + + org.sonatype.aether + aether-util + 1.13.1 + + + org.eclipse.aether + aether-impl + 1.1.0 + + + org.eclipse.aether + aether-spi + 1.1.0 + + + org.eclipse.aether + aether-connector-basic + 1.1.0 + + + org.eclipse.aether + aether-transport-file + 1.1.0 + + + org.eclipse.aether + aether-transport-http + 1.1.0 + + + org.apache.maven + maven-aether-provider + 3.3.9 + + + org.apache.maven + maven-artifact + 3.3.9 + + + org.slf4j + slf4j-simple + 1.7.22 + + + org.jsoup + jsoup + 1.10.3 + + + cz.zcu.kiv.crce.wrapper + org.apache.httpcomponents.httpcore + 4.3.2 + + + cz.zcu.kiv.crce.wrapper + org.apache.httpcomponents.httpclient + 4.3.5 + + + com.google.guava + guava + 18.0 + + + org.w3c.css + sac + 1.3 + + + org.apache.maven + maven-repository-metadata + 3.3.9 + + + cz.zcu.kiv.crce.wrapper + org.codehaus.plexus.plexus-component-annotations + 1.6 + + + cz.zcu.kiv.crce.wrapper + org.codehaus.plexus.plexus-interpolation + 1.21 + + + cz.zcu.kiv.crce.wrapper + org.codehaus.plexus.plexus-utils + 3.0.22 + + + org.eclipse.sisu + org.eclipse.sisu.plexus + 0.3.3 + + + org.eclipse.sisu + org.eclipse.sisu.inject + 0.3.3 + + + commons-codec + commons-codec + 1.6 + + + org.apache.maven + maven-model + 3.3.9 + + + org.apache.maven + maven-model-builder + 3.3.9 + + + org.apache.maven + maven-builder-support + 3.3.9 + + + com.vaadin.external.flute + flute + 1.3.0.gg2 + + + org.apache.maven.indexer + indexer-core + 5.1.2-4333789 + + + org.apache.maven.wagon + wagon-http-lightweight + 2.3 + + + org.apache.maven.wagon + wagon-provider-api + 2.3 + + + org.apache.maven.wagon + wagon-http-shared4 + 2.3 + + + org.apache.maven.indexer + indexer-artifact + 5.1.2-4333789 + + + org.apache.lucene + lucene-core + 3.6.2 + + + org.apache.lucene + lucene-queries + 3.6.2 + + + org.apache.lucene + lucene-memory + 3.6.2 + + + org.apache.lucene + lucene-highlighter + 3.6.2 + + + org.sonatype.sisu + sisu-guice + 3.2.6 + + + javax.annotation + javax.annotation-api + 1.2 + + + + + + org.sonatype.aether + aether-api + + + org.sonatype.aether + aether-util + + + org.eclipse.aether + aether-impl + + + org.eclipse.aether + aether-spi + + + org.eclipse.aether + aether-connector-basic + + + org.eclipse.aether + aether-transport-file + + + org.eclipse.aether + aether-transport-http + + + org.apache.maven + maven-aether-provider + + + org.apache.maven + maven-artifact + + + org.apache.maven + maven-builder-support + + + org.slf4j + slf4j-simple + + + org.jsoup + jsoup + + + commons-codec + commons-codec + + + org.apache.maven + maven-model + + + org.apache.maven + maven-model-builder + + + com.vaadin.external.flute + flute + + + cz.zcu.kiv.crce.wrapper + org.apache.httpcomponents.httpcore + + + cz.zcu.kiv.crce.wrapper + org.apache.httpcomponents.httpclient + + + com.google.guava + guava + + + org.w3c.css + sac + + + org.apache.maven + maven-repository-metadata + + + cz.zcu.kiv.crce.wrapper + org.codehaus.plexus.plexus-component-annotations + + + cz.zcu.kiv.crce.wrapper + org.codehaus.plexus.plexus-interpolation + + + cz.zcu.kiv.crce.wrapper + org.codehaus.plexus.plexus-utils + + + + org.eclipse.sisu + org.eclipse.sisu.plexus + + + org.eclipse.sisu + org.eclipse.sisu.inject + + + org.apache.maven.indexer + indexer-core + + + org.apache.maven.wagon + wagon-http-lightweight + + + org.apache.maven.wagon + wagon-provider-api + + + org.apache.maven.wagon + wagon-http-shared4 + + + org.apache.maven.indexer + indexer-artifact + + + org.apache.lucene + lucene-core + + + org.apache.lucene + lucene-queries + + + org.apache.lucene + lucene-memory + + + org.apache.lucene + lucene-highlighter + + + org.sonatype.sisu + sisu-guice + + + javax.annotation + javax.annotation-api + + + + + + org.apache.felix + maven-bundle-plugin + true + + META-INF + + ${bundle.namespace}.internal.Activator + ${project.artifactId} + cz.zcu.kiv.crce.crce_external_repository.internal.* + + cz.zcu.kiv.crce.crce_external_repository.api, + org.apache.maven.index.*, + org.apache.maven.wagon.*, + javax.inject.* + + * + + !${bundle.namespace}.internal.* + + !sisu-guice,*;scope=compile|runtime;inline=false + lib + true + + + + + maven-dependency-plugin + + + package + + copy-dependencies + + + + + + + \ No newline at end of file diff --git a/modules/crce-external-repository/src/main/java/cz/zcu/kiv/crce/crce_external_repository/api/ArtifactTree.java b/modules/crce-external-repository/src/main/java/cz/zcu/kiv/crce/crce_external_repository/api/ArtifactTree.java new file mode 100644 index 00000000..4f631ec5 --- /dev/null +++ b/modules/crce-external-repository/src/main/java/cz/zcu/kiv/crce/crce_external_repository/api/ArtifactTree.java @@ -0,0 +1,45 @@ +package cz.zcu.kiv.crce.crce_external_repository.api; + +import java.util.List; + +public class ArtifactTree { + private String groupId; + private String artefactId; + private List versions; + private String packaging; + private String url; + + public ArtifactTree(String groupId, String artefactId, List versions, String packaging) { + super(); + this.groupId = groupId; + this.artefactId = artefactId; + this.versions = versions; + this.packaging = packaging; + } + public String getGroupId() { + return groupId; + } + public String getArtefactId() { + return artefactId; + } + public List getVersions() { + return versions; + } + public String getPackaging() { + return packaging; + } + public String getUrl() { + return url; + } + public void setUrl(String url) { + this.url = url; + } + public String getCaption(String version) { + for(String v : this.versions) { + if(v.equals(version)){ + return groupId + ":" + artefactId + ":" + version + ":" + packaging; + } + } + return null; + } +} diff --git a/modules/crce-external-repository/src/main/java/cz/zcu/kiv/crce/crce_external_repository/api/CentralMaven.java b/modules/crce-external-repository/src/main/java/cz/zcu/kiv/crce/crce_external_repository/api/CentralMaven.java new file mode 100644 index 00000000..cc7c19a8 --- /dev/null +++ b/modules/crce-external-repository/src/main/java/cz/zcu/kiv/crce/crce_external_repository/api/CentralMaven.java @@ -0,0 +1,148 @@ +package cz.zcu.kiv.crce.crce_external_repository.api; + +import java.io.IOException; +import java.net.URL; +import java.nio.channels.Channels; +import java.nio.channels.ReadableByteChannel; +import java.util.ArrayList; +import java.util.List; + +import org.apache.maven.index.ArtifactInfo; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; + +public class CentralMaven { + private String centralMavenUrl; + private boolean enableGroupSearch; + private List artifactTreeList = new ArrayList(); + private SettingsUrl settings; + + public CentralMaven(SettingsUrl settings) { + this.settings = settings; + } + + public ResultSearchArtifactTree getArtifactTree(String group, String artifact, String version, Object packaging, Object directIndex, + String range) { + if (settings == null) { + SettingsUrl settings = new SettingsUrl(); + centralMavenUrl = settings.getCentralMavenUrl(); + enableGroupSearch = settings.isEnableGroupSearch(); + } else { + centralMavenUrl = settings.getCentralMavenUrl(); + enableGroupSearch = settings.isEnableGroupSearch(); + } + // reset tree + artifactTreeList.clear(); + // direct search + if (directIndex.equals("Direct")) { + if (!artifact.isEmpty() || !version.isEmpty()) { + directSearch(group, artifact, version, packaging.toString()); + } else if (enableGroupSearch && !group.isEmpty()) { + onlyGroupSearch(group); + if(artifactTreeList.size() == 0) { + return new ResultSearchArtifactTree(null, "not found"); + } + else { + return new ResultSearchArtifactTree(artifactTreeList, "group"); + } + } + if (artifactTreeList.size() == 0) { + return new ResultSearchArtifactTree(null, "artifact not found"); + } else { + return new ResultSearchArtifactTree(artifactTreeList, "direct"); + } + } + // index search + else { + indexSearch(group, artifact, version, packaging.toString(), range); + if (artifactTreeList.size() == 0) { + return new ResultSearchArtifactTree(null, "notfound"); + } else { + return new ResultSearchArtifactTree(artifactTreeList, "found"); + } + } + } + + private void directSearch(String group, String artifact, String version, String packaging) { + URL website; + try { + website = new URL(centralMavenUrl + group.replace('.', '/') + "/" + artifact + "/" + version + "/" + + artifact + "-" + version + "." + packaging); + ReadableByteChannel rbc = Channels.newChannel(website.openStream()); + if (rbc.isOpen()) { + List versions = new ArrayList(); + versions.add(version); + ArtifactTree artifactTree = new ArtifactTree(group, artifact, versions, packaging); + artifactTree.setUrl(centralMavenUrl); + artifactTreeList.add(artifactTree); + rbc.close(); + } + } catch (IOException e) { + artifactTreeList.clear(); + } + } + + private void onlyGroupSearch(String group) { + try { + list(new URL(centralMavenUrl + group.replace('.', '/') + "/")); + } catch (IOException e) { + artifactTreeList.clear(); + } + } + + private void list(URL path) throws IOException { + Document doc = Jsoup.connect(path.toString()).get(); + for (Element file : doc.select("a").not("[href=../]")) { + if (file.text().endsWith("/")) { + list(new URL(path.toString() + file.text())); + } else { + ArtifactTree artifactTree = new ArtifactTree(path.getPath(), file.text(), null, file.text() + .substring(file.text().lastIndexOf('.') + 1)); + if(path.getPort() == -1) { + artifactTree.setUrl(path.getProtocol() + "://" + path.getHost() + path.getPath() + file.text()); + } + else { + artifactTree.setUrl(path.getProtocol() + "://" + path.getHost() + ":" + path.getPort() + path.getPath() + file.text()); + } + artifactTreeList.add(artifactTree); + } + } + } + + private void indexSearch(String group, String artifact, String version, String packaging, String range){ + MavenIndex mavenIndex = null; + try { + mavenIndex = new MavenIndex(); + List artifactInfoList = mavenIndex.searchArtefact(settings, group, artifact, version, + packaging, range); + for (ArtifactInfo ai : artifactInfoList) { + // list už obsahuje artefakt ? ano přidáme verzi + boolean find = false; + for(ArtifactTree artefactTree : artifactTreeList) { + if(artefactTree .getGroupId().equals(ai.groupId) && artefactTree.getArtefactId().equals(ai.artifactId) && + artefactTree.getPackaging().equals(ai.packaging)) { + find = true; + List versions = artefactTree .getVersions(); + versions.add(ai.version); + ArtifactTree newArtefactTree = new ArtifactTree(ai.groupId, ai.artifactId, versions, ai.packaging); + newArtefactTree.setUrl(artefactTree.getUrl()); + artifactTreeList.remove(artefactTree); + artifactTreeList.add(newArtefactTree); + break; + } + } + if(!find) { + List versions = new ArrayList(); + versions.add(ai.version); + ArtifactTree artifactTree = new ArtifactTree(ai.groupId, ai.artifactId, versions, ai.packaging); + artifactTree.setUrl(centralMavenUrl); + artifactTreeList.add(artifactTree); + } + } + } + catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/modules/crce-external-repository/src/main/java/cz/zcu/kiv/crce/crce_external_repository/api/DefinedMaven.java b/modules/crce-external-repository/src/main/java/cz/zcu/kiv/crce/crce_external_repository/api/DefinedMaven.java new file mode 100644 index 00000000..a949afea --- /dev/null +++ b/modules/crce-external-repository/src/main/java/cz/zcu/kiv/crce/crce_external_repository/api/DefinedMaven.java @@ -0,0 +1,142 @@ +package cz.zcu.kiv.crce.crce_external_repository.api; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.apache.maven.repository.internal.MavenRepositorySystemUtils; +import org.eclipse.aether.DefaultRepositorySystemSession; +import org.eclipse.aether.RepositorySystem; +import org.eclipse.aether.RepositorySystemSession; +import org.eclipse.aether.artifact.Artifact; +import org.eclipse.aether.artifact.DefaultArtifact; +import org.eclipse.aether.connector.basic.BasicRepositoryConnectorFactory; +import org.eclipse.aether.impl.DefaultServiceLocator; +import org.eclipse.aether.repository.LocalRepository; +import org.eclipse.aether.repository.RemoteRepository; +import org.eclipse.aether.resolution.ArtifactRequest; +import org.eclipse.aether.resolution.ArtifactResolutionException; +import org.eclipse.aether.resolution.ArtifactResult; +import org.eclipse.aether.resolution.VersionRangeRequest; +import org.eclipse.aether.resolution.VersionRangeResolutionException; +import org.eclipse.aether.resolution.VersionRangeResult; +import org.eclipse.aether.spi.connector.RepositoryConnectorFactory; +import org.eclipse.aether.spi.connector.transport.TransporterFactory; +import org.eclipse.aether.transport.file.FileTransporterFactory; +import org.eclipse.aether.transport.http.HttpTransporterFactory; +import org.eclipse.aether.version.Version; + +public class DefinedMaven { + private ArtifactTree definedArtefact; + private String groupText; + private String idText; + private String versionText; + private String packagingText; + + private SettingsUrl settings; + + public DefinedMaven(SettingsUrl settings) { + this.settings = settings; + } + + public ArtifactTree getArtifact(String group, String idText, String version, Object packaging) { + // validator empty entries + if (group.equals("") || idText.equals("")) { + return null; + } else { + this.groupText = group; + this.idText = idText; + this.versionText = version; + this.packagingText = packaging.toString(); + callAetherLib(); + /* + * System.out.println(new File(settings.getLocalAetherUrl()).mkdirs()); + * List pomoc = new ArrayList(); pomoc.add("0.0.0"); + * + * definedArtefact = new ArtifactTree("cz.pokus", "pokusId", pomoc, "jar"); + */ + return definedArtefact; + } + } + + private void callAetherLib() { + RemoteRepository central = new RemoteRepository.Builder("central", "default", settings.getExternalAetherUrl()) + .build(); + RepositorySystem repoSystem = newRepositorySystem(); + RepositorySystemSession session = newSession(repoSystem, settings.getLocalAetherUrl()); + Artifact artifact; + if (!versionText.equals("")) { + artifact = new DefaultArtifact(groupText + ":" + idText + ":" + "[" + versionText + "]"); + } else { + artifact = new DefaultArtifact(groupText + ":" + idText + ":" + "(0,]"); + } + VersionRangeRequest request = new VersionRangeRequest(artifact, Arrays.asList(central), null); + try { + VersionRangeResult versionResult = repoSystem.resolveVersionRange(session, request); + if (versionResult.getVersions().isEmpty()) { + definedArtefact = null; + } else { + List versionTextList = new ArrayList(); + if (versionResult.getVersions().size() > 1) { + for (Version v : versionResult.getVersions()) { + versionTextList.add(v.toString()); + } + } else { + versionTextList.add(versionResult.getHighestVersion().toString()); + } + definedArtefact = new ArtifactTree(artifact.getGroupId(), artifact.getArtifactId(), versionTextList, + packagingText); + } + + } catch (VersionRangeResolutionException e) { + e.printStackTrace(); + } + } + + public static boolean resolveArtifact(String artifactText, SettingsUrl settings) { + RepositorySystem repoSystem = newRepositorySystem(); + RepositorySystemSession session = newSession(repoSystem, settings.getLocalAetherUrl()); + + ArtifactRequest artifactRequest = new ArtifactRequest(); + Artifact artifact = new DefaultArtifact(artifactText.split(":")[0] + ":" + artifactText.split(":")[1] + ":" + + artifactText.split(":")[3] + ":" + artifactText.split(":")[2]); + + artifactRequest.setArtifact(artifact); + + artifactRequest.addRepository(newCentralRepository(settings.getExternalAetherUrl())); + ArtifactResult artifactResult; + try { + artifactResult = repoSystem.resolveArtifact(session, artifactRequest); + artifactResult.getArtifact(); + } catch (ArtifactResolutionException e) { + return false; + } + return true; + } + + private static RepositorySystem newRepositorySystem() { + DefaultServiceLocator locator = MavenRepositorySystemUtils.newServiceLocator(); + locator.addService(RepositoryConnectorFactory.class, BasicRepositoryConnectorFactory.class); + locator.addService(TransporterFactory.class, FileTransporterFactory.class); + locator.addService(TransporterFactory.class, HttpTransporterFactory.class); + locator.setErrorHandler(new DefaultServiceLocator.ErrorHandler(){ + @Override + public void serviceCreationFailed( Class type, Class impl, Throwable exception ) + { + exception.printStackTrace(); + } + }); + return locator.getService(RepositorySystem.class); + } + + private static RepositorySystemSession newSession(RepositorySystem system, String localAetherUrl) { + DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession(); + LocalRepository localRepo = new LocalRepository(localAetherUrl); + session.setLocalRepositoryManager(system.newLocalRepositoryManager(session, localRepo)); + return session; + } + + public static RemoteRepository newCentralRepository(String centralAetherUrl) { + return new RemoteRepository.Builder("central", "default", centralAetherUrl).build(); + } +} \ No newline at end of file diff --git a/modules/crce-external-repository/src/main/java/cz/zcu/kiv/crce/crce_external_repository/api/MavenIndex.java b/modules/crce-external-repository/src/main/java/cz/zcu/kiv/crce/crce_external_repository/api/MavenIndex.java new file mode 100644 index 00000000..77123da2 --- /dev/null +++ b/modules/crce-external-repository/src/main/java/cz/zcu/kiv/crce/crce_external_repository/api/MavenIndex.java @@ -0,0 +1,210 @@ +package cz.zcu.kiv.crce.crce_external_repository.api; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; + +import org.apache.lucene.search.BooleanQuery; +import org.apache.lucene.search.Query; +import org.apache.lucene.search.BooleanClause.Occur; +import org.eclipse.aether.version.InvalidVersionSpecificationException; +import org.apache.maven.index.ArtifactInfo; +import org.apache.maven.index.ArtifactInfoFilter; +import org.apache.maven.index.Field; +import org.apache.maven.index.Indexer; +import org.apache.maven.index.IteratorSearchRequest; +import org.apache.maven.index.IteratorSearchResponse; +import org.apache.maven.index.MAVEN; +import org.apache.maven.index.context.IndexCreator; +import org.apache.maven.index.context.IndexingContext; +import org.apache.maven.index.expr.SourcedSearchExpression; +import org.apache.maven.index.updater.IndexUpdateRequest; +import org.apache.maven.index.updater.IndexUpdateResult; +import org.apache.maven.index.updater.IndexUpdater; +import org.apache.maven.index.updater.ResourceFetcher; +import org.apache.maven.index.updater.WagonHelper; +import org.apache.maven.wagon.Wagon; +import org.apache.maven.wagon.events.TransferEvent; +import org.apache.maven.wagon.events.TransferListener; +import org.apache.maven.wagon.observers.AbstractTransferListener; +import org.codehaus.plexus.DefaultPlexusContainer; +import org.codehaus.plexus.PlexusContainer; +import org.codehaus.plexus.PlexusContainerException; +import org.codehaus.plexus.component.repository.exception.ComponentLookupException; +import org.eclipse.aether.util.version.GenericVersionScheme; +import org.eclipse.aether.version.Version; + +public class MavenIndex { + private String centralCachePath = "repository-index/central-cache"; + private String centralIndexPath = "repository-index/central-index"; + + public String checkIndex(SettingsUrl settings) throws Exception { + final MavenIndex indexCentralRepository = new MavenIndex(); + return indexCentralRepository.perform(settings); + } + + public List searchArtefact(SettingsUrl settings, String group, String artifact, + String version, String packaging, String range) throws Exception { + final MavenIndex indexCentralRepository = new MavenIndex(); + return indexCentralRepository.getArtefact(settings, group, artifact, version, packaging, range); + } + + private final PlexusContainer plexusContainer; + private final Indexer indexer; + private final IndexUpdater indexUpdater; + private final Wagon httpWagon; + private IndexingContext centralContext; + + public MavenIndex() throws PlexusContainerException, ComponentLookupException { + /*final DefaultContainerConfiguration config = new DefaultContainerConfiguration(); + config.setClassPathScanning(PlexusConstants.SCANNING_INDEX); + this.plexusContainer = new DefaultPlexusContainer(config);*/ + this.plexusContainer = new DefaultPlexusContainer(); + this.indexer = plexusContainer.lookup(Indexer.class); + this.indexUpdater = plexusContainer.lookup(IndexUpdater.class); + this.httpWagon = plexusContainer.lookup(Wagon.class, "http"); + } + + private String perform(SettingsUrl settings) + throws IOException, ComponentLookupException, InvalidVersionSpecificationException { + File centralLocalCache = new File(centralCachePath); + File centralIndexDir = new File(centralIndexPath); + + List indexers = new ArrayList(); + + indexers.add(plexusContainer.lookup(IndexCreator.class, "min")); + indexers.add(plexusContainer.lookup(IndexCreator.class, "jarContent")); + indexers.add(plexusContainer.lookup(IndexCreator.class, "maven-plugin")); + + // Create context for central repository index + + if (settings == null) { + SettingsUrl settingsUrl = new SettingsUrl(); + centralContext = indexer.createIndexingContext("central-context", "central", centralLocalCache, + centralIndexDir, settingsUrl.getCentralMavenUrl(), null, true, true, indexers); + } else { + centralContext = indexer.createIndexingContext("central-context", "central", centralLocalCache, + centralIndexDir, settings.getCentralMavenUrl(), null, + true, true, indexers); + } + + System.out.println("Updating Maven Index..."); + + TransferListener listener = new AbstractTransferListener() { + public void transferStarted(TransferEvent transferEvent) { + System.out.print(" Downloading " + transferEvent.getResource().getName()); + } + + public void transferProgress(TransferEvent transferEvent, byte[] buffer, int length) { + + } + + public void transferCompleted(TransferEvent transferEvent) { + System.out.println(" - Done"); + } + }; + + ResourceFetcher resourceFetcher = new WagonHelper.WagonFetcher(httpWagon, listener, null, null); + Date centralContextCurrentTimestamp = centralContext.getTimestamp(); + + IndexUpdateRequest updateRequest = new IndexUpdateRequest(centralContext, resourceFetcher); + IndexUpdateResult updateResult = indexUpdater.fetchAndUpdateIndex(updateRequest); + + closeIndexer(); + + if (updateResult.isFullUpdate()) { + return "Full update happened!"; + } else if (updateResult.getTimestamp().equals(centralContextCurrentTimestamp)) { + return "No update needed, index is up to date!"; + } else { + return "Incremental update happened, change covered " + centralContextCurrentTimestamp + " - " + + updateResult.getTimestamp() + " period."; + } + } + + private List getArtefact(SettingsUrl settings, String group, String artifact, String version, String packaging, String range) + throws IOException, ComponentLookupException, InvalidVersionSpecificationException { + + File centralLocalCache = new File(centralCachePath); + File centralIndexDir = new File(centralIndexPath); + + List indexers = new ArrayList(); + + indexers.add(plexusContainer.lookup(IndexCreator.class, "min")); + indexers.add(plexusContainer.lookup(IndexCreator.class, "jarContent")); + indexers.add(plexusContainer.lookup(IndexCreator.class, "maven-plugin")); + + // Create context for central repository index + + if (settings == null) { + SettingsUrl settingsUrl = new SettingsUrl(); + centralContext = indexer.createIndexingContext("central-context", "central", centralLocalCache, + centralIndexDir, settingsUrl.getCentralMavenUrl(), null, true, true, indexers); + } else { + centralContext = indexer.createIndexingContext("central-context", "central", centralLocalCache, + centralIndexDir, settings.getCentralMavenUrl(), null, + true, true, indexers); + } + + final GenericVersionScheme versionScheme = new GenericVersionScheme(); + + Version versionIndex = versionScheme.parseVersion(version); + + // construct the query for known GA + final Query groupIdQ = indexer.constructQuery(MAVEN.GROUP_ID, new SourcedSearchExpression(group)); + + final Query artifactIdQ = indexer.constructQuery(MAVEN.ARTIFACT_ID, + new SourcedSearchExpression(artifact)); + + final BooleanQuery query = new BooleanQuery(); + query.add(groupIdQ, Occur.MUST); + query.add(artifactIdQ, Occur.MUST); + // we want custom packaging artifacts only + query.add(indexer.constructQuery(MAVEN.PACKAGING, new SourcedSearchExpression(packaging)), Occur.MUST); + // we want main artifacts only (no classifier) + // Note: this below is unfinished API, needs fixing + query.add(indexer.constructQuery(MAVEN.CLASSIFIER, new SourcedSearchExpression(Field.NOT_PRESENT)), + Occur.MUST_NOT); + + // construct the filter to express "V greater than" + final ArtifactInfoFilter versionFilter = new ArtifactInfoFilter() { + public boolean accepts(final IndexingContext ctx, final ArtifactInfo ai) { + try { + final Version aiV = versionScheme.parseVersion(ai.version); + // Use ">=" if you are INCLUSIVE + if(range.equals("<=")){ + return aiV.compareTo(versionIndex) <= 0; + } + else if(range.equals(">=")){ + return aiV.compareTo(versionIndex) >= 0; + } + else{ + return aiV.compareTo(versionIndex) == 0; + } + + } catch (InvalidVersionSpecificationException e) { + return true; + } + } + }; + + final IteratorSearchRequest request = new IteratorSearchRequest(query, + Collections.singletonList(centralContext), versionFilter); + final IteratorSearchResponse response = indexer.searchIterator(request); + List artifactInfoList = new ArrayList(); + for (ArtifactInfo ai : response) { + artifactInfoList.add(ai); + } + + closeIndexer(); + + return artifactInfoList; + } + + public void closeIndexer() throws IOException{ + indexer.closeIndexingContext(centralContext, false); + } +} diff --git a/modules/crce-external-repository/src/main/java/cz/zcu/kiv/crce/crce_external_repository/api/ResultSearchArtifactTree.java b/modules/crce-external-repository/src/main/java/cz/zcu/kiv/crce/crce_external_repository/api/ResultSearchArtifactTree.java new file mode 100644 index 00000000..c46cd49b --- /dev/null +++ b/modules/crce-external-repository/src/main/java/cz/zcu/kiv/crce/crce_external_repository/api/ResultSearchArtifactTree.java @@ -0,0 +1,19 @@ +package cz.zcu.kiv.crce.crce_external_repository.api; + +import java.util.List; + +public class ResultSearchArtifactTree { + private String status; + private List artifactTreeList; + public ResultSearchArtifactTree(List artifactTreeList, String status) { + super(); + this.status = status; + this.artifactTreeList = artifactTreeList; + } + public String getStatus() { + return status; + } + public List getArtifactTreeList() { + return artifactTreeList; + } +} diff --git a/modules/crce-external-repository/src/main/java/cz/zcu/kiv/crce/crce_external_repository/api/SettingsUrl.java b/modules/crce-external-repository/src/main/java/cz/zcu/kiv/crce/crce_external_repository/api/SettingsUrl.java new file mode 100644 index 00000000..05f7aea9 --- /dev/null +++ b/modules/crce-external-repository/src/main/java/cz/zcu/kiv/crce/crce_external_repository/api/SettingsUrl.java @@ -0,0 +1,50 @@ +package cz.zcu.kiv.crce.crce_external_repository.api; + +public class SettingsUrl{ + private String centralMavenUrl = "http://repo.maven.apache.org/maven2/"; + private String localAetherUrl = "aether-local-repo"; + private String externalAetherUrl = "http://repo.maven.apache.org/maven2/"; + private boolean enableDeleteLocalMaven = false; + private boolean enableGroupSearch = false; + + public String getCentralMavenUrl() { + return centralMavenUrl; + } + + public String getLocalAetherUrl() { + return localAetherUrl; + } + + public String getExternalAetherUrl() { + return externalAetherUrl; + } + + public void setCentralMavenUrl(String url) { + this.centralMavenUrl = url; + } + + public void setLocalAetherUrl(String url) { + this.localAetherUrl = url; + } + + public void setExternalAetherUrl(String url) { + this.externalAetherUrl = url; + } + + public boolean isEnableDeleteLocalMaven() { + return enableDeleteLocalMaven; + } + + public void setEnableDeleteLocalMaven(boolean enableDeleteLocalMaven) { + this.enableDeleteLocalMaven = enableDeleteLocalMaven; + } + + public boolean isEnableGroupSearch() { + return enableGroupSearch; + } + + public void setEnableGroupSearch(boolean enableGroupSearch) { + this.enableGroupSearch = enableGroupSearch; + } +} + diff --git a/modules/crce-external-repository/src/main/java/cz/zcu/kiv/crce/crce_external_repository/internal/Activator.java b/modules/crce-external-repository/src/main/java/cz/zcu/kiv/crce/crce_external_repository/internal/Activator.java new file mode 100644 index 00000000..b0d6d90e --- /dev/null +++ b/modules/crce-external-repository/src/main/java/cz/zcu/kiv/crce/crce_external_repository/internal/Activator.java @@ -0,0 +1,35 @@ +package cz.zcu.kiv.crce.crce_external_repository.internal; + +import org.apache.felix.dm.DependencyActivatorBase; +import org.apache.felix.dm.DependencyManager; +import org.osgi.framework.BundleContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Activator extends DependencyActivatorBase{ + + private static final Logger logger = LoggerFactory.getLogger(Activator.class); + + private static volatile Activator instance; + + public static Activator instance() { + if (instance == null) { + throw new IllegalStateException("Activator instance is null."); + } + return instance; + } + + @edu.umd.cs.findbugs.annotations.SuppressFBWarnings(value = "ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD", justification = "Workaround for providing DM components.") + @Override + public void init(BundleContext context, DependencyManager manager) throws Exception { + instance = this; + + manager.add(createComponent().setImplementation(this)); + logger.debug("External repository activator initialized."); + } + + @Override + public void destroy(BundleContext context, DependencyManager manager) throws Exception { + // nothing to do + } +} diff --git a/modules/crce-handler-metrics/osgi.bnd b/modules/crce-handler-metrics/osgi.bnd deleted file mode 100644 index f11edfe8..00000000 --- a/modules/crce-handler-metrics/osgi.bnd +++ /dev/null @@ -1,7 +0,0 @@ -#----------------------------------------------------------------- -# Use this file to add customized Bnd instructions for the bundle -#----------------------------------------------------------------- - -Bundle-Activator: ${bundle.namespace}.internal.Activator - -Embed-Dependency: org.apache.felix.utils \ No newline at end of file diff --git a/modules/crce-handler-metrics/pom.xml b/modules/crce-handler-metrics/pom.xml deleted file mode 100644 index 26822521..00000000 --- a/modules/crce-handler-metrics/pom.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - 4.0.0 - - - ../pom - cz.zcu.kiv.crce - crce-modules-parent - 2.1.1-SNAPSHOT - - - crce-handler-metrics - bundle - - CRCE - Plugin - Metrics Action Handler - - - ${namespace}.handler.metrics - ${namespace}.handler.metrics - - - - - - - ${project.groupId} - crce-core - pom - - - - - - ${project.groupId} - crce-metadata-osgi-bundle - ${project.version} - - - ${project.groupId} - crce-concurrency - ${project.version} - - - - - - org.ow2.asm - asm-all - 5.0.3 - - - \ No newline at end of file diff --git a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/ComponentMetrics.java b/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/ComponentMetrics.java deleted file mode 100644 index bc0cd534..00000000 --- a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/ComponentMetrics.java +++ /dev/null @@ -1,19 +0,0 @@ -package cz.zcu.kiv.crce.handler.metrics; - -import javax.annotation.Nonnull; - -/** - * Metrics interface for computing metrics of entire component (jar file). - * - * @author Jan Smajcl (smajcl@students.zcu.cz) - */ -public interface ComponentMetrics extends Metrics { - - /** - * Compute metrics value. - * - * @return Component metrics value. - */ - @Nonnull - Object computeValue(); -} diff --git a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/Metrics.java b/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/Metrics.java deleted file mode 100644 index c2e4743c..00000000 --- a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/Metrics.java +++ /dev/null @@ -1,33 +0,0 @@ -package cz.zcu.kiv.crce.handler.metrics; - -import javax.annotation.Nonnull; - -/** - * Base interface for all metrics computing. - * - * @author Jan Smajcl (smajcl@students.zcu.cz) - */ -public interface Metrics { - - /** - * Initialization of computing class. Should be called before any metrics value computation method. - */ - void init(); - - /** - * Get metrics name for metadata. - * - * @return Metrics name. - */ - @Nonnull - String getName(); - - /** - * Get metrics return type. Type of computing value. - * - * @return Computing value type. - */ - @SuppressWarnings("rawtypes") - @Nonnull - Class getType(); -} diff --git a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/PackageMetrics.java b/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/PackageMetrics.java deleted file mode 100644 index 4ed675f5..00000000 --- a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/PackageMetrics.java +++ /dev/null @@ -1,20 +0,0 @@ -package cz.zcu.kiv.crce.handler.metrics; - -import javax.annotation.Nonnull; - -/** - * Metrics interface for computing metrics of specific package. - * - * @author Jan Smajcl (smajcl@students.zcu.cz) - */ -public interface PackageMetrics extends Metrics { - - /** - * Compute metrics value for specific package. - * - * @param packageName Name of package. - * @return Package metrics value. - */ - @Nonnull - Object computeValueForPackage(@Nonnull String packageName); -} diff --git a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/ServiceMetrics.java b/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/ServiceMetrics.java deleted file mode 100644 index 647559b9..00000000 --- a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/ServiceMetrics.java +++ /dev/null @@ -1,20 +0,0 @@ -package cz.zcu.kiv.crce.handler.metrics; - -import javax.annotation.Nonnull; - -/** - * Metrics interface for computing metrics of specific service. - * - * @author Jan Smajcl (smajcl@students.zcu.cz) - */ -public interface ServiceMetrics extends Metrics { - - /** - * Compute metrics value for specific service. - * - * @param serviceName Name of service. - * @return Service metrics value. - */ - @Nonnull - Object computeValueForService(@Nonnull String serviceName); -} diff --git a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/asm/ClassMetrics.java b/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/asm/ClassMetrics.java deleted file mode 100644 index e211cc3e..00000000 --- a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/asm/ClassMetrics.java +++ /dev/null @@ -1,110 +0,0 @@ -package cz.zcu.kiv.crce.handler.metrics.asm; - -import java.util.List; - -import javax.annotation.Nonnull; - -/** - * Interface collected metrics information of single class. - * - * @author Jan Smajcl (smajcl@students.zcu.cz) - */ -public interface ClassMetrics { - - /** - * Name of class (full). Dot notation (packageName.ClassName). - * - * @return Name of class. - */ - @Nonnull - String getFullClassName(); - - /** - * Name of class (short). - * - * @return Name of class. - */ - @Nonnull - String getClassName(); - - /** - * Name of classes package. - * - * @return Name of classes package. - */ - @Nonnull - String getPackageName(); - - /** - * Indicator, if class (or interface) is public. - * - * @return True, if class(interface) is public. - */ - boolean isPublic(); - - /** - * Indicator, if this is interface instead of class. - * - * @return True, if interface. - */ - boolean isInterface(); - - /** - * Count of all public methods. - * - * @return Count of public methods. - */ - double getMethodCount(); - - /** - * Count of fields of simple type. - * - * @return Count of fields of simple type. - */ - int getSimpleTypeFieldCount(); - - /** - * Count of fields of complex type. - * - * @return Count of fields of complex type. - */ - int getComplexTypeFieldCount(); - - /** - * Count of methods parameters of simple type. - * - * @return Count of methods parameters of simple type. - */ - int getSimpleParametersCount(); - - /** - * Count of methods parameters of complex type. - * - * @return Count of methods parameters of complex type. - */ - int getComplexParametersCount(); - - /** - * List of classes FieldMetrics. - * - * @return List of classes FieldMetrics. - */ - @Nonnull - List getFields(); - - /** - * List of classes MethodMetrics. - * - * @return List of classes MethodMetrics. - */ - @Nonnull - List getMethods(); - - /** - * Average value of McCabe's Cyclomatic Complexity of method. - * May be NaN, if class has no implemented method. - * - * @return Cyclomatic complexity of class. - */ - double getAverageCyclomaticComplexity(); -} \ No newline at end of file diff --git a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/asm/ClassesMetrics.java b/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/asm/ClassesMetrics.java deleted file mode 100644 index b4e3cfe3..00000000 --- a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/asm/ClassesMetrics.java +++ /dev/null @@ -1,38 +0,0 @@ -package cz.zcu.kiv.crce.handler.metrics.asm; - -import java.util.List; - -import javax.annotation.Nonnull; - -/** - * Interface wrapping ClassMetrics list. - * If you need some preprocessing method like connectUsedOutClassFields - * or connectCalledMethods, this method have to be called before first call - * getClassMetricsList. - * - * @author Jan Smajcl (smajcl@students.zcu.cz) - */ -public interface ClassesMetrics { - - /** - * Replace all in-jar usedOutClassFields placeholders in methods - * with coresponding fields in ClassMetrics. - */ - void connectUsedOutClassFields(); - - /** - * Replace all in-jar calledMethods placeholders in methods - * with coresponding methods in ClassMetrics. - */ - void connectCalledMethods(); - - /** - * Get list of collected ClassMetrics. - * - * After calling this method, other methods are disabled. - * - * @return List of ClassMetrics. - */ - @Nonnull - List getClassMetricsList(); -} diff --git a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/asm/FieldMetrics.java b/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/asm/FieldMetrics.java deleted file mode 100644 index 735475d2..00000000 --- a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/asm/FieldMetrics.java +++ /dev/null @@ -1,43 +0,0 @@ -package cz.zcu.kiv.crce.handler.metrics.asm; - -import javax.annotation.Nonnull; - -/** - * Interface collected metrics information of single classes field. - * - * @author Jan Smajcl (smajcl@students.zcu.cz) - */ -public interface FieldMetrics { - - /** - * Name of class (full) declaring this field. - * - * @return Name of class. - */ - @Nonnull - String getClassName(); - - /** - * Name of this field. - * - * @return Name of field. - */ - @Nonnull - String getName(); - - /** - * Indicates, if field is in investigated jar file. - * - * @return True, if field is in jar file. - */ - boolean isInternal(); - - /** - * Indicate, if two fields are equal. Field is equal, if belongs to same class, - * has same name. - * - * @param fieldMetrics FieldMetrics to compare to. - * @return True, if field is equal. - */ - boolean equals(FieldMetrics fieldMetrics); -} diff --git a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/asm/MethodMetrics.java b/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/asm/MethodMetrics.java deleted file mode 100644 index 4c97de05..00000000 --- a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/asm/MethodMetrics.java +++ /dev/null @@ -1,116 +0,0 @@ -package cz.zcu.kiv.crce.handler.metrics.asm; - -import javax.annotation.Nonnull; - -import org.objectweb.asm.Type; - -/** - * Interface collected metrics information of single classes method. - * - * @author Jan Smajcl (smajcl@students.zcu.cz) - */ -public interface MethodMetrics { - - /** - * Name of class (full) declaring this method. - * - * @return Name of class. - */ - @Nonnull - String getClassName(); - - /** - * Name of this method. - * - * @return Name of method. - */ - @Nonnull - String getName(); - - /** - * Array of parameters types (short version without generic). - * - * @return Array of parameters types. - */ - @Nonnull - Type[] getParameters(); - - /** - * Array of used fields declared in this class. - * - * @return Array of used fields. - */ - @Nonnull - FieldMetrics[] getUsedInClassFields(); - - /** - * Array of used fields declared in other classes. - * - * @return Array of used fields. - */ - @Nonnull - FieldMetrics[] getUsedOutClassFields(); - - /** - * Array of methods (set - each method once) called by this method. - * - * @return Array of called method. - */ - @Nonnull - MethodMetrics[] getMethodCalls(); - - /** - * Replace one use of out class field by another. This should be used only for replacing - * placeholders (build internal references) - * - * @param index Index of field to be replaced. - * @param usedOutClassField New field. - */ - void replaceUsedOutClassField(int index, FieldMetrics usedOutClassField); - - /** - * Replace one method call by another. This should be used only for replacing - * placeholders (build internal references) - * - * @param index Index of method to be replaced. - * @param methodCall New method. - */ - void replaceMethodCall(int index, @Nonnull MethodMetrics methodCall); - - /** - * Indicated, if method is public. - * - * @return True, if method is public. - */ - boolean isPublic(); - - /** - * Indicates, if method is in investigated jar file. - * - * @return True, if method is in jar file. - */ - boolean isInternal(); - - /** - * Indicates, if method is abstract or belong to interface. - * - * @return True, if method is abstract or method of interface. - */ - boolean isAbstract(); - - /** - * Indicate, if two method are equal. Method is equal, if belongs to same class, - * has same name and same parameters signature (ignore generic). - * - * @param methodMetrics MethodMetrics to compare to. - * @return True, if method is equal. - */ - boolean equals(MethodMetrics methodMetrics); - - /** - * McCabe's Cyclomatic Complexity of method. - * - * @return Cyclomatic complexity of method. - */ - int getCyclomaticComplexity(); -} \ No newline at end of file diff --git a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/asm/impl/AbstractFieldMetrics.java b/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/asm/impl/AbstractFieldMetrics.java deleted file mode 100644 index d9b521c6..00000000 --- a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/asm/impl/AbstractFieldMetrics.java +++ /dev/null @@ -1,31 +0,0 @@ -package cz.zcu.kiv.crce.handler.metrics.asm.impl; - -import cz.zcu.kiv.crce.handler.metrics.asm.FieldMetrics; - -/** - * Abstract FieldMetrics class. - * - * @author Jan Smajcl (smajcl@students.zcu.cz) - */ -public abstract class AbstractFieldMetrics implements FieldMetrics { - - @Override - public boolean equals(FieldMetrics fieldMetrics) { - return fieldMetrics.getClassName().equals(this.getClassName()) && fieldMetrics.getName().equals(this.getName()); - } - - @Override - public boolean equals(Object other) { - - if (other instanceof FieldMetrics) { - return equals((FieldMetrics)other); - } - - return false; - } - - @Override - public int hashCode() { - return getClassName().hashCode() * 3 + getName().hashCode(); - } -} diff --git a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/asm/impl/AbstractMethodMetrics.java b/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/asm/impl/AbstractMethodMetrics.java deleted file mode 100644 index 3b4b21c3..00000000 --- a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/asm/impl/AbstractMethodMetrics.java +++ /dev/null @@ -1,58 +0,0 @@ -package cz.zcu.kiv.crce.handler.metrics.asm.impl; - -import org.objectweb.asm.Type; - -import cz.zcu.kiv.crce.handler.metrics.asm.MethodMetrics; - -/** - * Abstract MethodMetrics class. - * - * @author Jan Smajcl (smajcl@students.zcu.cz) - */ -public abstract class AbstractMethodMetrics implements MethodMetrics { - - @Override - public boolean equals(MethodMetrics methodMetrics) { - if (methodMetrics == null) { - return false; - } - - if (!this.getClassName().equals(methodMetrics.getClassName())) { - return false; - } - - if (!this.getName().equals(methodMetrics.getName())) { - return false; - } - - Type[] thisParameters = this.getParameters(); - Type[] methodMetricsParameters = methodMetrics.getParameters(); - - if (thisParameters.length != methodMetricsParameters.length) { - return false; - } - - for (int i = 0; i < thisParameters.length; i++) { - if (!thisParameters[i].equals(methodMetricsParameters[i])) { - return false; - } - } - - return true; - } - - @Override - public boolean equals(Object other) { - - if (other != null && other instanceof MethodMetrics) { - return equals((MethodMetrics) other); - } - - return false; - } - - @Override - public int hashCode() { - return this.getClassName().hashCode() * 3 + this.getName().hashCode() * 11 + this.getParameters().length; - } -} diff --git a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/asm/impl/ClassMetricsImpl.java b/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/asm/impl/ClassMetricsImpl.java deleted file mode 100644 index a75e3f09..00000000 --- a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/asm/impl/ClassMetricsImpl.java +++ /dev/null @@ -1,261 +0,0 @@ -package cz.zcu.kiv.crce.handler.metrics.asm.impl; - -import java.lang.reflect.Modifier; -import java.util.ArrayList; -import java.util.List; - -import javax.annotation.Nonnull; - -import org.objectweb.asm.Type; -import org.objectweb.asm.signature.SignatureReader; -import org.objectweb.asm.tree.ClassNode; -import org.objectweb.asm.tree.FieldNode; -import org.objectweb.asm.tree.MethodNode; - -import cz.zcu.kiv.crce.handler.metrics.asm.ClassMetrics; -import cz.zcu.kiv.crce.handler.metrics.asm.FieldMetrics; -import cz.zcu.kiv.crce.handler.metrics.asm.MethodMetrics; - -/** - * Class computing information from ClassNode for future using in metrics computing. - * - * @author Jan Smajcl (smajcl@students.zcu.cz) - */ -public class ClassMetricsImpl implements ClassMetrics { - - private static final String DEFAULT_PACKAGE_NAME = ""; - - private static final int[] COMPLEX_TYPES = new int[] { Type.ARRAY, Type.OBJECT }; - - private String fullClassName; - private String packageName; - private String className; - - private boolean isPublic; - private boolean isInterface; - - private double methodCount; - - private int simpleTypeFieldCount; - private int complexTypeFieldCount; - - private int simpleParametersCount; - private int complexParametersCount; - - private List fields; - private List methods; - - private double averageCyclomaticComplexity; - - /** - * New instance. - * - * @param byteCodeNode ASM ClassNode to parse information. - */ - public ClassMetricsImpl(@Nonnull ClassNode byteCodeNode) { - - fields = new ArrayList(); - methods = new ArrayList(); - - methodCount = 0; - - simpleTypeFieldCount = 0; - complexTypeFieldCount = 0; - - simpleParametersCount = 0; - complexParametersCount = 0; - - fullClassName = byteCodeNode.name.replace('/','.'); - - // class and package name - className = fullClassName.substring(fullClassName.lastIndexOf(".") + 1); - packageName = getPackageName(fullClassName); - - // access and isInterface information - isPublic = Modifier.isPublic(byteCodeNode.access); - isInterface = Modifier.isInterface(byteCodeNode.access); - - // filed informations - @SuppressWarnings("unchecked") - List fieldNodes = byteCodeNode.fields; - for (FieldNode field : fieldNodes) { - // no simple type field has signature - if (field.signature != null && !isComplexType(Type.getType(field.desc))) { - simpleTypeFieldCount++; - } - else { - complexTypeFieldCount++; - } - - fields.add(new FieldMetricsImpl(fullClassName, field.name)); - } - - // methods informations - @SuppressWarnings("unchecked") - List methodNodes = byteCodeNode.methods; - for (MethodNode method : methodNodes) { - parseMethod(fullClassName, method); - } - - int cyclomaticComplexitySum = 0; - int nonAbstractMethodCount = 0; - for (MethodMetrics method : this.methods) { - if (!method.isAbstract()) { - cyclomaticComplexitySum += method.getCyclomaticComplexity(); - nonAbstractMethodCount++; - } - } - - averageCyclomaticComplexity = Double.NaN; - if (nonAbstractMethodCount > 0) { - averageCyclomaticComplexity = (double)cyclomaticComplexitySum / nonAbstractMethodCount; - } - } - - /** - * Parse package name. - * - * @param className Full name of class (containing package name). - * @return Package name. - */ - private String getPackageName(String className) { - String packageName; - - int lastIndexOf = className.lastIndexOf("."); - if (lastIndexOf == -1) { - packageName = DEFAULT_PACKAGE_NAME; - } - else { - packageName = className.substring(0, lastIndexOf); - } - - return packageName; - } - - /** - * Parsing single method. - * - * @param method Asm MethodNode to parse. - */ - private void parseMethod(String fullClassName, MethodNode method) { - - boolean isPublicMethod = Modifier.isPublic(method.access); - - methods.add(new MethodMetricsImpl(fullClassName, isPublicMethod, method)); - - // continue only for public methods - if (!isPublicMethod) { - return; - } - - // information parsed from signature - if (method.signature != null) { - MethodMetricsSignatureVisitor visitor = new MethodMetricsSignatureVisitor(); - new SignatureReader(method.signature).accept(visitor); - - simpleParametersCount += visitor.getSimpleParametersCount(); - complexParametersCount += visitor.getComplexParametersCount(); - } - else { - // non signature method - for (Type parameterType : Type.getArgumentTypes(method.desc)) { - if (isComplexType(parameterType)) { - complexParametersCount++; - } - else { - simpleParametersCount++; - } - } - } - - methodCount++; - } - - /** - * Testing, if parameter type is complex. - * - * @param t Type to test. - * @return True, if parameter type is complex. - */ - private boolean isComplexType(Type t) { - int typeInt = t.getSort(); - - for (int type : COMPLEX_TYPES) { - if (type == typeInt) { - return true; - } - } - - return false; - } - - @Override - @Nonnull - public String getFullClassName() { - return fullClassName; - } - - @Override - @Nonnull - public String getClassName() { - return className; - } - - @Override - @Nonnull - public String getPackageName() { - return packageName; - } - - @Override - public boolean isPublic() { - return isPublic; - } - - @Override - public boolean isInterface() { - return isInterface; - } - - @Override - public double getMethodCount() { - return methodCount; - } - - @Override - public int getSimpleTypeFieldCount() { - return simpleTypeFieldCount; - } - - @Override - public int getComplexTypeFieldCount() { - return complexTypeFieldCount; - } - - @Override - public int getSimpleParametersCount() { - return simpleParametersCount; - } - - @Override - public int getComplexParametersCount() { - return complexParametersCount; - } - - @Override - @Nonnull - public List getFields() { - return fields; - } - - @Override - @Nonnull - public List getMethods() { - return methods; - } - - @Override - public double getAverageCyclomaticComplexity() { - return averageCyclomaticComplexity; - } -} diff --git a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/asm/impl/ClassesMetricsImpl.java b/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/asm/impl/ClassesMetricsImpl.java deleted file mode 100644 index 9da8d5b1..00000000 --- a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/asm/impl/ClassesMetricsImpl.java +++ /dev/null @@ -1,118 +0,0 @@ -package cz.zcu.kiv.crce.handler.metrics.asm.impl; - -import java.util.List; - -import javax.annotation.Nonnull; - -import cz.zcu.kiv.crce.handler.metrics.asm.ClassMetrics; -import cz.zcu.kiv.crce.handler.metrics.asm.ClassesMetrics; -import cz.zcu.kiv.crce.handler.metrics.asm.FieldMetrics; -import cz.zcu.kiv.crce.handler.metrics.asm.MethodMetrics; - -/** - * Implementation of ClassesMetrics. ClassMetrics list wrapper. - * - * @author Jan Smajcl (smajcl@students.zcu.cz) - */ -public class ClassesMetricsImpl implements ClassesMetrics { - - private List classMetricsList; - - private boolean classesMetricsListInUse; - - private boolean connectedUsedOutClassFields; - private boolean connectedCalledMethods; - - /** - * New instance. - * - * @param classMetricsList ClassMetrics list. - */ - public ClassesMetricsImpl(List classMetricsList) { - - this.classMetricsList = classMetricsList; - - classesMetricsListInUse = false; - - connectedUsedOutClassFields = false; - connectedCalledMethods = false; - } - - @Override - public void connectUsedOutClassFields() { - - if (classesMetricsListInUse || connectedUsedOutClassFields) { - return; - } - - for (ClassMetrics classMetric : classMetricsList) { - for (MethodMetrics methodMetrics : classMetric.getMethods()) { - - FieldMetrics[] usedOutClassFields = methodMetrics.getUsedOutClassFields(); - for (int i = 0; i < usedOutClassFields.length; i++) { - - for (ClassMetrics intermoduleClass : classMetricsList) { - if (intermoduleClass.getFullClassName().equals(usedOutClassFields[i].getClassName())) { - - for (FieldMetrics intermoduleClassField : classMetric.getFields()) { - if (intermoduleClassField.equals(usedOutClassFields[i])) { - methodMetrics.replaceUsedOutClassField(i, intermoduleClassField); - - break; - } - } - - break; - } - } - } - } - } - - connectedUsedOutClassFields = true; - } - - @Override - public void connectCalledMethods() { - - if (classesMetricsListInUse || connectedCalledMethods) { - return; - } - - for (ClassMetrics classMetric : classMetricsList) { - for (MethodMetrics methodMetrics : classMetric.getMethods()) { - - MethodMetrics[] methodCalls = methodMetrics.getMethodCalls(); - for (int i = 0; i < methodCalls.length; i++) { - - for (ClassMetrics intermoduleClass : classMetricsList) { - if (intermoduleClass.getFullClassName().equals(methodCalls[i].getClassName())) { - - for (MethodMetrics intermoduleClassMethod : classMetric.getMethods()) { - if (intermoduleClassMethod.equals(methodCalls[i])) { - methodMetrics.replaceMethodCall(i, intermoduleClassMethod); - - break; - } - } - - break; - } - } - } - } - } - - connectedCalledMethods = true; - } - - @Override - @Nonnull - public List getClassMetricsList() { - - classesMetricsListInUse = true; - - return classMetricsList; - } - -} diff --git a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/asm/impl/ExternalFieldMetrics.java b/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/asm/impl/ExternalFieldMetrics.java deleted file mode 100644 index bcbad8e9..00000000 --- a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/asm/impl/ExternalFieldMetrics.java +++ /dev/null @@ -1,41 +0,0 @@ -package cz.zcu.kiv.crce.handler.metrics.asm.impl; - -import javax.annotation.Nonnull; - -/** - * External FieldMetrics class. Representing fields out of jar or can be used as placeholder. - * - * @author Jan Smajcl (smajcl@students.zcu.cz) - */ -public class ExternalFieldMetrics extends AbstractFieldMetrics { - - private String className; - private String name; - - /** - * New instance. - * - * @param className Name of class (full) where field is defined. - * @param name Name of field. - */ - public ExternalFieldMetrics(@Nonnull String className, @Nonnull String name) { - - this.className = className; - this.name = name; - } - - @Override - public String getClassName() { - return className; - } - - @Override - public String getName() { - return name; - } - - @Override - public boolean isInternal() { - return false; - } -} diff --git a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/asm/impl/ExternalMethodMetrics.java b/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/asm/impl/ExternalMethodMetrics.java deleted file mode 100644 index 31be9d9e..00000000 --- a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/asm/impl/ExternalMethodMetrics.java +++ /dev/null @@ -1,94 +0,0 @@ -package cz.zcu.kiv.crce.handler.metrics.asm.impl; - -import javax.annotation.Nonnull; - -import org.objectweb.asm.Type; - -import cz.zcu.kiv.crce.handler.metrics.asm.FieldMetrics; -import cz.zcu.kiv.crce.handler.metrics.asm.MethodMetrics; - -/** - * External MethodMetrics class. Representing methods out of jar or can be used as placeholder. - * - * @author Jan Smajcl (smajcl@students.zcu.cz) - */ -public class ExternalMethodMetrics extends AbstractMethodMetrics { - - private final String className; - private final String methodName; - private final Type[] parameters; - - /** - * New instance. - * - * @param className Name of class (full) where method is defined. - * @param methodName Name of method. - * @param parameters Array of parameters types. - */ - public ExternalMethodMetrics(@Nonnull String className, @Nonnull String methodName, @Nonnull Type[] parameters) { - - this.className = className; - this.methodName = methodName; - this.parameters = (Type[])parameters.clone(); - } - - @Override - public String getClassName() { - return className; - } - - @Override - public String getName() { - return methodName; - } - - @Override - public Type[] getParameters() { - return (Type[])parameters.clone(); - } - - @Override - public FieldMetrics[] getUsedInClassFields() { - return new FieldMetrics[0]; - } - - @Override - public FieldMetrics[] getUsedOutClassFields() { - return new FieldMetrics[0]; - } - - @Override - public MethodMetrics[] getMethodCalls() { - return new MethodMetrics[0]; - } - - @Override - public void replaceUsedOutClassField(int index, FieldMetrics usedOutClassField) { - throw new IndexOutOfBoundsException(); - } - - @Override - public void replaceMethodCall(int index, MethodMetrics methodCall) { - throw new IndexOutOfBoundsException(); - } - - @Override - public boolean isPublic () { - return true; - } - - @Override - public boolean isInternal() { - return false; - } - - @Override - public boolean isAbstract() { - return true; - } - - @Override - public int getCyclomaticComplexity() { - return 0; - } -} diff --git a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/asm/impl/FieldMetricsImpl.java b/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/asm/impl/FieldMetricsImpl.java deleted file mode 100644 index 4acaf6a9..00000000 --- a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/asm/impl/FieldMetricsImpl.java +++ /dev/null @@ -1,47 +0,0 @@ -package cz.zcu.kiv.crce.handler.metrics.asm.impl; - -import javax.annotation.Nonnull; - -/** - * FieldMetrics implementation class. - * - * @author Jan Smajcl (smajcl@students.zcu.cz) - */ -public class FieldMetricsImpl extends AbstractFieldMetrics -{ - private String className; - private String name; - - /** - * New instance. - * - * @param className Name of class (full) where field is defined. - * @param name Name of field. - */ - public FieldMetricsImpl(String className, String name) { - - this.className = className; - this.name = name; - } - - @Override - @Nonnull - public String getClassName() - { - return className; - } - - @Override - @Nonnull - public String getName() - { - return name; - } - - @Override - public boolean isInternal() { - return true; - } - -} - diff --git a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/asm/impl/MethodMetricsImpl.java b/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/asm/impl/MethodMetricsImpl.java deleted file mode 100644 index 4fd637fd..00000000 --- a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/asm/impl/MethodMetricsImpl.java +++ /dev/null @@ -1,263 +0,0 @@ -package cz.zcu.kiv.crce.handler.metrics.asm.impl; - -import java.util.HashSet; -import java.util.ListIterator; -import java.util.Set; - -import javax.annotation.Nonnull; - -import org.objectweb.asm.Type; -import org.objectweb.asm.tree.AbstractInsnNode; -import org.objectweb.asm.tree.FieldInsnNode; -import org.objectweb.asm.tree.MethodInsnNode; -import org.objectweb.asm.tree.MethodNode; -import org.objectweb.asm.tree.analysis.Analyzer; -import org.objectweb.asm.tree.analysis.AnalyzerException; -import org.objectweb.asm.tree.analysis.BasicInterpreter; -import org.objectweb.asm.tree.analysis.Frame; - -import cz.zcu.kiv.crce.handler.metrics.asm.FieldMetrics; -import cz.zcu.kiv.crce.handler.metrics.asm.MethodMetrics; - -/** - * MethodMetrics implementation class. Collecting information from MethodNode. - * - * @author Jan Smajcl (smajcl@students.zcu.cz) - */ -public class MethodMetricsImpl extends AbstractMethodMetrics { - - private String className; - private String methodName; - private Type[] parameters; - - private boolean isPublic; - private boolean isAbstract; - - private int cyclomaticComplexity; - - private FieldMetrics[] usedInClassFields; - private FieldMetrics[] usedOutClassFields; - - private MethodMetrics[] methodCalls; - - /** - * New instance. - * - * @param className Name of class (full) where method is defined. - * @param isPublic Method public modifier. - * @param methodNode ASM MethodNode to parse information. - */ - public MethodMetricsImpl(@Nonnull String className, boolean isPublic, @Nonnull MethodNode methodNode) { - - Type methodType = Type.getType(methodNode.desc); - - this.className = className; - - methodName = methodNode.name; - parameters = methodType.getArgumentTypes(); - - this.isPublic = isPublic; - - Set inClassFields = new HashSet(); - Set outClassFields = new HashSet(); - - Set calls = new HashSet(); - - // collecting method calls - @SuppressWarnings("unchecked") - ListIterator instructions = methodNode.instructions.iterator(); - // abstract method has no instruction. Each non-abstract method has at least return statement. - if (instructions.hasNext()) { - isAbstract = false; - - while (instructions.hasNext()) { - - AbstractInsnNode instruction = instructions.next(); - switch (instruction.getType()) { - case AbstractInsnNode.FIELD_INSN: { // field use - - FieldInsnNode fieldInstruction = (FieldInsnNode)instruction; - - String owner = fieldInstruction.owner.replace('/','.'); - - if (owner.equals(className)) { - inClassFields.add(new FieldMetricsImpl(owner, fieldInstruction.name)); - } - else { - // using placeholders for out class field use - outClassFields.add(new ExternalFieldMetrics(owner, fieldInstruction.name)); - } - - break; - } - case AbstractInsnNode.METHOD_INSN: { - - MethodInsnNode callInstruction = (MethodInsnNode)instruction; - - String owner = callInstruction.owner.replace('/','.'); - String name = callInstruction.name; - String desc = callInstruction.desc; - - Type callMethodType = Type.getType(desc); - - // using placeholders for all method calls - MethodMetrics methodCall = new ExternalMethodMetrics(owner, name, callMethodType.getArgumentTypes()); - - calls.add(methodCall); - break; - } - } - } - } - else { - isAbstract = true; - } - - usedInClassFields = new FieldMetrics[0]; - if (inClassFields.size() > 0) { - usedInClassFields = inClassFields.toArray(usedInClassFields); - } - - usedOutClassFields = new FieldMetrics[0]; - if (outClassFields.size() > 0) { - usedOutClassFields = outClassFields.toArray(usedOutClassFields); - } - - methodCalls = new MethodMetrics[0]; - if (calls.size() > 0) { - methodCalls = calls.toArray(methodCalls); - } - - cyclomaticComplexity = 0; - if (!isAbstract) { - try { - cyclomaticComplexity = computeCyclomaticComplexity(className, methodNode); - } - catch (AnalyzerException e) { - cyclomaticComplexity = 0; - } - } - } - - @Override - @Nonnull - public String getClassName() { - return className; - } - - @Override - @Nonnull - public String getName() { - return methodName; - } - - @Override - @Nonnull - public Type[] getParameters() { - return (Type[])parameters.clone(); - } - - @Override - @Nonnull - public FieldMetrics[] getUsedInClassFields() { - return (FieldMetrics[])usedInClassFields.clone(); - } - - @Override - @Nonnull - public FieldMetrics[] getUsedOutClassFields() { - return (FieldMetrics[])usedOutClassFields.clone(); - } - - @Override - @Nonnull - public MethodMetrics[] getMethodCalls() { - return (MethodMetrics[])methodCalls.clone(); - } - - @Override - public void replaceUsedOutClassField(int index, FieldMetrics usedOutClassField) { - - if (index < 0 || index >= usedOutClassFields.length) { - throw new IndexOutOfBoundsException(); - } - - usedOutClassFields[index] = usedOutClassField; - } - - @Override - public void replaceMethodCall(int index, @Nonnull MethodMetrics methodCall) { - - if (index < 0 || index >= methodCalls.length) { - throw new IndexOutOfBoundsException(); - } - - methodCalls[index] = methodCall; - } - - @Override - public boolean isPublic() { - return isPublic; - } - - @Override - public boolean isInternal() { - return true; - } - - @Override - public boolean isAbstract() { - return isAbstract; - } - - @Override - public int getCyclomaticComplexity() { - return cyclomaticComplexity; - } - - /** - * Implementation of method complexity metrics introduced in - * 'A Complexity Measure' - McCabe, T.J. (1976) - * - * In this implementation, we assume, that all end-nodes (e.g. return) are equal - * and are connected to one imaginary end-node. - * - * @see A Complexity Measure - * - * @param className Name of class (full) where method is defined. - * @param methodNode ASM MethodNode to parse code. - * @return McCabe's Cyclomatic Complexity. - * @throws AnalyzerException ASM exception, thrown if a problem occurs during the analysis. - */ - private int computeCyclomaticComplexity(String className, MethodNode methodNode) throws AnalyzerException { - - Analyzer a = new Analyzer(new BasicInterpreter()) { - protected Frame newFrame(int nLocals, int nStack) { - return new Node(nLocals, nStack); - } - protected Frame newFrame(Frame src) { - return new Node(src); - } - protected void newControlFlowEdge(int src, int dst) { - Node s = (Node) getFrames()[src]; - s.successors.add((Node) getFrames()[dst]); - } - }; - a.analyze(className, methodNode); - Frame[] frames = a.getFrames(); - int edges = 0; - int nodes = 0; - int endNodes = 0; - for (int i = 0; i < frames.length; ++i) { - if (frames[i] != null) { - int numOutEdges = ((Node) frames[i]).successors.size(); - edges += numOutEdges; - if (numOutEdges == 0) { - endNodes += 1; - } - nodes += 1; - } - } - return edges - nodes + 2 + endNodes - 1; - } -} diff --git a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/asm/impl/MethodMetricsSignatureVisitor.java b/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/asm/impl/MethodMetricsSignatureVisitor.java deleted file mode 100644 index e11fcc9c..00000000 --- a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/asm/impl/MethodMetricsSignatureVisitor.java +++ /dev/null @@ -1,91 +0,0 @@ -package cz.zcu.kiv.crce.handler.metrics.asm.impl; - -import org.objectweb.asm.Opcodes; -import org.objectweb.asm.signature.SignatureVisitor; - -/** - * Implementation of SignatureVisitor for collecting information base on - * method signature. - * - * @author Jan Smajcl (smajcl@students.zcu.cz) - */ -public class MethodMetricsSignatureVisitor extends SignatureVisitor { - - private boolean visitingPrameter; - - private int simpleParametersCount; - private int complexParametersCount; - - /** - * New instance. - */ - public MethodMetricsSignatureVisitor() { - super(Opcodes.ASM4); - - visitingPrameter = false; - - simpleParametersCount = 0; - complexParametersCount = 0; - } - - @Override - public SignatureVisitor visitParameterType() { - visitingPrameter = true; - - return this; - } - - @Override - public void visitTypeVariable(String name) - { - // generic parameter type - if (visitingPrameter) { - complexParametersCount++; - visitingPrameter = false; - } - } - - @Override - public SignatureVisitor visitArrayType() - { - if (visitingPrameter) { - complexParametersCount++; - visitingPrameter = false; - } - return this; - } - - @Override - public void visitClassType(String name) { - if (visitingPrameter) { - complexParametersCount++; - visitingPrameter = false; - } - } - - @Override - public void visitBaseType(char descriptor) { - if (visitingPrameter) { - simpleParametersCount++; - visitingPrameter = false; - } - } - - /** - * Count of simple parameters eg. int, log, double... - * - * @return Count of parameters. - */ - public int getSimpleParametersCount() { - return simpleParametersCount; - } - - /** - * Count of complex parameters eg. class, array... - * - * @return Count of parameters. - */ - public int getComplexParametersCount() { - return complexParametersCount; - } -} diff --git a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/asm/impl/Node.java b/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/asm/impl/Node.java deleted file mode 100644 index c30ea539..00000000 --- a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/asm/impl/Node.java +++ /dev/null @@ -1,20 +0,0 @@ -package cz.zcu.kiv.crce.handler.metrics.asm.impl; - -import java.util.HashSet; -import java.util.Set; - -import org.objectweb.asm.tree.analysis.Frame; - -public class Node extends Frame { - - Set successors = new HashSet(); - - public Node(int nLocals, int nStack) { - super(nLocals, nStack); - } - - public Node(Frame src) { - super(src); - } -} - diff --git a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/impl/AverageCyclomaticComplexity.java b/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/impl/AverageCyclomaticComplexity.java deleted file mode 100644 index 4e9abbe1..00000000 --- a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/impl/AverageCyclomaticComplexity.java +++ /dev/null @@ -1,71 +0,0 @@ -package cz.zcu.kiv.crce.handler.metrics.impl; - -import javax.annotation.Nonnull; - -import cz.zcu.kiv.crce.handler.metrics.ComponentMetrics; -import cz.zcu.kiv.crce.handler.metrics.asm.ClassMetrics; -import cz.zcu.kiv.crce.handler.metrics.asm.ClassesMetrics; - -/** - * Implementation of average McCabe's Cyclomatic Complexity for all classes, - * where Cyclomatic Complexity of class is computed as average Cyclomatic - * Complexity of all non-abstract methods. - * 'A Complexity Measure' - McCabe, T.J. (1976) - * - * @author Jan Smajcl (smajcl@students.zcu.cz) - * - * @see A Complexity Measure - */ -public class AverageCyclomaticComplexity implements ComponentMetrics { - - private ClassesMetrics classesMetrics; - - /** - * New instance. - * - * @param classesMetrics Wrapper of parsed ClassMetrics list. - */ - public AverageCyclomaticComplexity(ClassesMetrics classesMetrics) { - - this.classesMetrics = classesMetrics; - } - - @Override - public void init() { - // nothing to do here - } - - @Override - @Nonnull - public String getName() { - return "design-complexity-average"; - } - - @Override - @Nonnull - @SuppressWarnings("rawtypes") - public Class getType() { - return Double.class; - } - - @Override - @Nonnull - public Object computeValue() { - - double cyclomaticComplexitySum = 0; - int nonInterfaceClassCount = 0; - for (ClassMetrics classMetrics : classesMetrics.getClassMetricsList()) { - if (!Double.isNaN(classMetrics.getAverageCyclomaticComplexity())) { - cyclomaticComplexitySum += classMetrics.getAverageCyclomaticComplexity(); - nonInterfaceClassCount++; - } - } - - double averageCyclomaticComplexity = Double.NaN; - if (nonInterfaceClassCount != 0) { - averageCyclomaticComplexity = cyclomaticComplexitySum / nonInterfaceClassCount; - } - return Double.valueOf(averageCyclomaticComplexity); - } - -} diff --git a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/impl/CpcMetrics.java b/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/impl/CpcMetrics.java deleted file mode 100644 index 31ffdc68..00000000 --- a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/impl/CpcMetrics.java +++ /dev/null @@ -1,102 +0,0 @@ -package cz.zcu.kiv.crce.handler.metrics.impl; - -import javax.annotation.Nonnull; - -import cz.zcu.kiv.crce.handler.metrics.PackageMetrics; -import cz.zcu.kiv.crce.handler.metrics.asm.ClassMetrics; -import cz.zcu.kiv.crce.handler.metrics.asm.ClassesMetrics; - -/** - * Implementation of computing class complexity metrics base on CPC metrics introduces in - * 'Component Metrics to Measure Component Quality' - Eun Sook Cho, Min Sun Kim, Soo Dong Kim (2001) - * - * @author Jan Smajcl (smajcl@students.zcu.cz) - * - * @see Component metrics to measure component quality - */ -public class CpcMetrics implements PackageMetrics { - - // weights for weighted parametrs - static weighing - private static final double CLASS_WEIGHT = 1.0; - private static final double METHOD_WEIGHT = 1.0; - private static final double COMPLEX_FIELD_WEIGHT = 1.0; - private static final double COMPLEX_PARAMETER_WEIGHT = 1.0; - - private ClassesMetrics classesMetrics; - - /** - * New instance. - * - * @param classesMetrics Wrapper of parsed ClassMetrics list. - */ - public CpcMetrics(ClassesMetrics classesMetrics) { - - this.classesMetrics = classesMetrics; - } - - @Override - public void init() { - // nothing to do here - } - - @Override - @Nonnull - public String getName() { - return "api-complexity"; - } - - @Override - @Nonnull - @SuppressWarnings("rawtypes") - public Class getType() { - return Double.class; - } - - @Override - @Nonnull - public Object computeValueForPackage(String packageName) { - - double cmpC = 0; - double sumClassComplexity = 0; - double sumMethodComplexity = 0; - - int classCount = 0; - int interfaceCount = 0; - int methodCount = 0; - - int simpleTypeFieldCount = 0; - int complexTypeFieldCount = 0; - - int simpleParametersCount = 0; - int complexParametersCount = 0; - - for (ClassMetrics classMetric : classesMetrics.getClassMetricsList()) { - - if (classMetric.isPublic() && classMetric.getPackageName().compareTo(packageName) == 0) { - - simpleTypeFieldCount += classMetric.getSimpleTypeFieldCount(); - complexTypeFieldCount += classMetric.getComplexTypeFieldCount(); - - simpleParametersCount += classMetric.getSimpleParametersCount(); - complexParametersCount += classMetric.getComplexParametersCount(); - - methodCount += classMetric.getMethodCount(); - - if (classMetric.isInterface()) { - interfaceCount++; - } - else { - classCount++; - } - } - } - - cmpC = classCount * CLASS_WEIGHT + interfaceCount + methodCount * METHOD_WEIGHT; - sumClassComplexity = simpleTypeFieldCount + COMPLEX_FIELD_WEIGHT * complexTypeFieldCount; - sumMethodComplexity = simpleParametersCount + complexParametersCount * COMPLEX_PARAMETER_WEIGHT; - - double cpc = cmpC + sumClassComplexity + sumMethodComplexity; - - return new Double(cpc); - } -} diff --git a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/impl/MaximumCyclomaticComplexity.java b/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/impl/MaximumCyclomaticComplexity.java deleted file mode 100644 index af3b3b2e..00000000 --- a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/impl/MaximumCyclomaticComplexity.java +++ /dev/null @@ -1,73 +0,0 @@ -package cz.zcu.kiv.crce.handler.metrics.impl; - -import javax.annotation.Nonnull; - -import cz.zcu.kiv.crce.handler.metrics.ComponentMetrics; -import cz.zcu.kiv.crce.handler.metrics.asm.ClassMetrics; -import cz.zcu.kiv.crce.handler.metrics.asm.ClassesMetrics; - -/** - * Implementation of maximum of McCabe's Cyclomatic Complexity for all classes, - * where Cyclomatic Complexity of class is computed as average Cyclomatic - * Complexity of all non-abstract methods. - * 'A Complexity Measure' - McCabe, T.J. (1976) - * - * @author Jan Smajcl (smajcl@students.zcu.cz) - * - * @see A Complexity Measure - */ -public class MaximumCyclomaticComplexity implements ComponentMetrics { - - private ClassesMetrics classesMetrics; - - /** - * New instance. - * - * @param classesMetrics Wrapper of parsed ClassMetrics list. - */ - public MaximumCyclomaticComplexity(ClassesMetrics classesMetrics) { - - this.classesMetrics = classesMetrics; - } - - @Override - public void init() { - // nothing to do here - } - - @Override - @Nonnull - public String getName() { - return "design-complexity-max"; - } - - @Override - @Nonnull - @SuppressWarnings("rawtypes") - public Class getType() { - return Double.class; - } - - @Override - @Nonnull - public Object computeValue() { - - double maximumCyclomaticComplexity = 0; - for (ClassMetrics classMetrics : classesMetrics.getClassMetricsList()) { - - double averageCyclomaticComplexity = classMetrics.getAverageCyclomaticComplexity(); - if (!Double.isNaN(averageCyclomaticComplexity) && maximumCyclomaticComplexity < averageCyclomaticComplexity) { - - maximumCyclomaticComplexity = averageCyclomaticComplexity; - } - } - - // we didn't find max value, defined Cyclomatic Complexity have to be more than 0 - if (maximumCyclomaticComplexity == 0) { - - maximumCyclomaticComplexity = Double.NaN; - } - - return Double.valueOf(maximumCyclomaticComplexity); - } -} diff --git a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/impl/MinimumCyclomaticComplexity.java b/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/impl/MinimumCyclomaticComplexity.java deleted file mode 100644 index ee8679db..00000000 --- a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/impl/MinimumCyclomaticComplexity.java +++ /dev/null @@ -1,73 +0,0 @@ -package cz.zcu.kiv.crce.handler.metrics.impl; - -import javax.annotation.Nonnull; - -import cz.zcu.kiv.crce.handler.metrics.ComponentMetrics; -import cz.zcu.kiv.crce.handler.metrics.asm.ClassMetrics; -import cz.zcu.kiv.crce.handler.metrics.asm.ClassesMetrics; - -/** - * Implementation of minimum of McCabe's Cyclomatic Complexity for all classes, - * where Cyclomatic Complexity of class is computed as average Cyclomatic - * Complexity of all non-abstract methods. - * 'A Complexity Measure' - McCabe, T.J. (1976) - * - * @author Jan Smajcl (smajcl@students.zcu.cz) - * - * @see A Complexity Measure - */ -public class MinimumCyclomaticComplexity implements ComponentMetrics { - - private ClassesMetrics classesMetrics; - - /** - * New instance. - * - * @param classesMetrics Wrapper of parsed ClassMetrics list. - */ - public MinimumCyclomaticComplexity(ClassesMetrics classesMetrics) { - - this.classesMetrics = classesMetrics; - } - - @Override - public void init() { - // nothing to do here - } - - @Override - @Nonnull - public String getName() { - return "design-complexity-min"; - } - - @Override - @Nonnull - @SuppressWarnings("rawtypes") - public Class getType() { - return Double.class; - } - - @Override - @Nonnull - public Object computeValue() { - - double minimumCyclomaticComplexity = Double.MAX_VALUE; - for (ClassMetrics classMetrics : classesMetrics.getClassMetricsList()) { - - double averageCyclomaticComplexity = classMetrics.getAverageCyclomaticComplexity(); - if (!Double.isNaN(averageCyclomaticComplexity) && minimumCyclomaticComplexity > averageCyclomaticComplexity) { - - minimumCyclomaticComplexity = averageCyclomaticComplexity; - } - } - - // we didn't find min value - if (minimumCyclomaticComplexity == Double.MAX_VALUE) { - - minimumCyclomaticComplexity = Double.NaN; - } - - return Double.valueOf(minimumCyclomaticComplexity); - } -} diff --git a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/impl/NumberOfImportsMetrics.java b/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/impl/NumberOfImportsMetrics.java deleted file mode 100644 index ab767501..00000000 --- a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/impl/NumberOfImportsMetrics.java +++ /dev/null @@ -1,46 +0,0 @@ -package cz.zcu.kiv.crce.handler.metrics.impl; - -import java.util.List; - -import javax.annotation.Nonnull; - -import cz.zcu.kiv.crce.handler.metrics.ComponentMetrics; -import cz.zcu.kiv.crce.metadata.Requirement; -import cz.zcu.kiv.crce.metadata.Resource; - -public class NumberOfImportsMetrics implements ComponentMetrics { - - private long numOfImports; - - public NumberOfImportsMetrics(Resource resource) { - - List requirements = resource.getRequirements(); - - numOfImports = requirements.size(); - } - - @Override - public void init() { - // nothing to do here - } - - @Override - @Nonnull - public String getName() { - return "number-of-imports"; - } - - @Override - @Nonnull - @SuppressWarnings("rawtypes") - public Class getType() { - return Long.class; - } - - @Override - @Nonnull - public Object computeValue() { - return numOfImports; - } - -} diff --git a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/impl/RippleEffectMetrics.java b/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/impl/RippleEffectMetrics.java deleted file mode 100644 index ffb3cecf..00000000 --- a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/impl/RippleEffectMetrics.java +++ /dev/null @@ -1,112 +0,0 @@ -package cz.zcu.kiv.crce.handler.metrics.impl; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import javax.annotation.Nonnull; - -import cz.zcu.kiv.crce.handler.metrics.PackageMetrics; -import cz.zcu.kiv.crce.handler.metrics.asm.ClassMetrics; -import cz.zcu.kiv.crce.handler.metrics.asm.ClassesMetrics; -import cz.zcu.kiv.crce.handler.metrics.asm.MethodMetrics; - -/** - * Implementation of computing ripple effect. Starting from public methods of export package classes - * and expanding call tree until all out of components calls are found. - * - * @author Jan Smajcl (smajcl@students.zcu.cz) - */ -public class RippleEffectMetrics implements PackageMetrics { - - private ClassesMetrics classesMetrics; - - /** - * New instance. - * - * @param classesMetrics Wrapper of parsed ClassMetrics list. - */ - public RippleEffectMetrics(ClassesMetrics classesMetrics) { - - this.classesMetrics = classesMetrics; - } - - @Override - public void init() { - - classesMetrics.connectCalledMethods(); - } - - @Override - @Nonnull - public String getName() { - return "ripple-effect"; - } - - @Override - @Nonnull - @SuppressWarnings("rawtypes") - public Class getType() { - return Long.class; - } - - - @Override - @Nonnull - public Object computeValueForPackage(String packageName) { - - // set of all methods - Set collectedMethods = new HashSet(); - // in-jar methods, which can have other method call and should be investigated - List methodsToVisit = new ArrayList(); - - // first collect public method of public classes from package - for (ClassMetrics classMetric : classesMetrics.getClassMetricsList()) { - if (classMetric.isPublic() && classMetric.getPackageName().equals(packageName)) { - for (MethodMetrics method : classMetric.getMethods()) { - if (method.isPublic()) { - collectedMethods.add(method); - methodsToVisit.add(method); - } - } - } - } - - // expand all internal methods (internal calls) - while (!methodsToVisit.isEmpty()) { - MethodMetrics investigatedMethod = methodsToVisit.remove(0); - for (MethodMetrics methodCall : investigatedMethod.getMethodCalls()) { - if (!collectedMethods.contains(methodCall)) { - collectedMethods.add(methodCall); - if (methodCall.isInternal()) { - methodsToVisit.add(methodCall); - } - } - } - } - - int internalNonAbstract = 0; - int internalAbstract = 0; - int external = 0; - - // count internal and external methods - for (MethodMetrics methodCall : collectedMethods) { - if (methodCall.isInternal()) { - if (methodCall.isAbstract()) { - internalAbstract++; - } - else { - internalNonAbstract++; - } - } - else { - external++; - } - } - - long rippleEffectValue = internalNonAbstract + internalAbstract + external; - - return Long.valueOf(rippleEffectValue); - } -} diff --git a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/impl/WTCohMetrics.java b/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/impl/WTCohMetrics.java deleted file mode 100644 index db42df5e..00000000 --- a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/impl/WTCohMetrics.java +++ /dev/null @@ -1,168 +0,0 @@ -package cz.zcu.kiv.crce.handler.metrics.impl; - -import java.util.ArrayList; -import java.util.List; - -import javax.annotation.Nonnull; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import cz.zcu.kiv.crce.handler.metrics.ComponentMetrics; -import cz.zcu.kiv.crce.handler.metrics.asm.ClassMetrics; -import cz.zcu.kiv.crce.handler.metrics.asm.ClassesMetrics; -import cz.zcu.kiv.crce.handler.metrics.asm.FieldMetrics; -import cz.zcu.kiv.crce.handler.metrics.asm.MethodMetrics; - -/** - * Implementation of computing WTCoh metrics published in - * 'Measuring Software Component Reusability by Coupling and Cohesion Metrics' - * - Gui Gui, Paul D. Scott (2009) - * - * This implementation include static fields and methods. - * - * @author Jan Smajcl (smajcl@students.zcu.cz) - * - * @see Measuring Software Component Reusability by Coupling and Cohesion Metrics - */ -public class WTCohMetrics implements ComponentMetrics { - - private static final Logger logger = LoggerFactory.getLogger(WTCoupMetrics.class); - - private ClassesMetrics classesMetrics; - - /** - * New instance. - * - * @param classesMetrics Wrapper of parsed ClassMetrics list. - */ - public WTCohMetrics(ClassesMetrics classesMetrics) { - this.classesMetrics = classesMetrics; - } - - @Override - public void init() { - // nothing to do here - } - - @Override - @Nonnull - public String getName() { - return "wt-cohesion"; - } - - @Override - @Nonnull - @SuppressWarnings("rawtypes") - public Class getType() { - return Double.class; - } - - @Override - @Nonnull - public Object computeValue() { - - List methods = new ArrayList(); - int classCount = 0; - double classCohSum = 0; - - for (ClassMetrics classMetric : classesMetrics.getClassMetricsList()) { - - methods.clear(); - if (!classMetric.isInterface()) { - - for (MethodMetrics methodMetrics : classMetric.getMethods()) { - if (!methodMetrics.isAbstract()) { - methods.add(methodMetrics); - } - } - - int methodCount = methods.size(); - - // Cohesion is defined only for classes with 2 or more methods - if (methodCount > 1) { - double[][] sim = new double[methodCount][methodCount]; - - for (int i = 0; i < methodCount; i++) { - sim [i][i] = 0; - } - - // SimD - for (int j = 1; j < methodCount; j++) { - for (int i = 0; i < j; i++) { - - MethodMetrics methodI = methods.get(i); - MethodMetrics methodJ = methods.get(j); - - FieldMetrics[] vI = methodI.getUsedInClassFields(); - FieldMetrics[] vJ = methodJ.getUsedInClassFields(); - - int unionVIVJSize = vI.length; - int intersectionVIVJSize = 0; - - for (FieldMetrics fieldJ : vJ) { - - boolean found = false; - - for (FieldMetrics fieldI : vI) { - if (fieldJ.equals(fieldI)) { - found = true; - break; - } - } - - if (found) { - intersectionVIVJSize += 1; - } - else { - unionVIVJSize += 1; - } - } - - double simD = 0; - if (unionVIVJSize != 0) { - simD = (double)intersectionVIVJSize / unionVIVJSize; - } - - sim[i][j] = sim[j][i] = simD; - } - } - - // SimT - modified Floyd–Warshall algorithm - for (int k = 0; k < methodCount; k++) { - for (int i = 0; i < methodCount; i++) { - for (int j = 0; j < methodCount; j++) { - - if (i == k || j == k || i == j) { - continue; - } - - sim[i][j] = Math.max(sim[i][j], sim[i][k] * sim[k][j]); - } - } - } - - double simSum = 0; - - for (int j = 1; j < methodCount; j++) { - for (int i = 0; i < j; i++) { - - simSum += sim[i][j] + sim[j][i]; - } - } - - double classCohT = simSum / (methodCount * methodCount - methodCount); - classCohSum += classCohT; - classCount += 1; - } - } - } - - // If no implemented classes in component, WTCoh is not defined - double wTCoh = (classCount == 0) ? Double.NaN : classCohSum / classCount; - - logger.debug("WTCoh {} ", wTCoh); - - return new Double(wTCoh); - } -} diff --git a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/impl/WTCoupMetrics.java b/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/impl/WTCoupMetrics.java deleted file mode 100644 index 4f4b58f5..00000000 --- a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/impl/WTCoupMetrics.java +++ /dev/null @@ -1,206 +0,0 @@ -package cz.zcu.kiv.crce.handler.metrics.impl; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import javax.annotation.Nonnull; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import cz.zcu.kiv.crce.handler.metrics.ComponentMetrics; -import cz.zcu.kiv.crce.handler.metrics.asm.ClassMetrics; -import cz.zcu.kiv.crce.handler.metrics.asm.ClassesMetrics; -import cz.zcu.kiv.crce.handler.metrics.asm.FieldMetrics; -import cz.zcu.kiv.crce.handler.metrics.asm.MethodMetrics; - -/** - * Implementation of computing WTCoup metrics published in - * 'Measuring Software Component Reusability by Coupling and Cohesion Metrics' - * - Gui Gui, Paul D. Scott (2009) - * - * This implementation include static fields and methods. - * - * @author Jan Smajcl (smajcl@students.zcu.cz) - * - * @see Measuring Software Component Reusability by Coupling and Cohesion Metrics - */ -public class WTCoupMetrics implements ComponentMetrics { - - private static final Logger logger = LoggerFactory.getLogger(WTCoupMetrics.class); - - private ClassesMetrics classesMetrics; - - /** - * New instance. - * - * @param classesMetrics Wrapper of parsed ClassMetrics list. - */ - public WTCoupMetrics(ClassesMetrics classesMetrics) { - this.classesMetrics = classesMetrics; - } - - @Override - public void init() { - - classesMetrics.connectUsedOutClassFields(); - classesMetrics.connectCalledMethods(); - } - - @Override - @Nonnull - public String getName() { - return "wt-coupling"; - } - - @Override - @Nonnull - @SuppressWarnings("rawtypes") - public Class getType() { - return Double.class; - } - - @Override - @Nonnull - public Object computeValue() { - - List classes = new ArrayList(); - for (ClassMetrics classMetric : classesMetrics.getClassMetricsList()) { - - // include only classes with at least one non-abstract method - for (MethodMetrics method : classMetric.getMethods()) { - if (!method.isAbstract()) { - - classes.add(classMetric); - break; - } - } - } - - // if is only 1 or no classes with implemented methods, WTCoup not defined - double wTCoup = Double.NaN; - - int classCount = classes.size(); - if (classCount > 1) { - - double[][] coup = new double[classCount][classCount]; - double[] outJarCoup = new double[classCount]; - - Set calledMethods = new HashSet(); - Set usedOutClassFields = new HashSet(); - - // CoupD - for (int i = 0; i < classCount; i++) { - - calledMethods.clear(); - usedOutClassFields.clear(); - - ClassMetrics classI = classes.get(i); - - for (MethodMetrics method : classI.getMethods()) { - - for (MethodMetrics calledMethod : method.getMethodCalls()) { - calledMethods.add(calledMethod); - } - - for (FieldMetrics usedField : method.getUsedOutClassFields()) { - usedOutClassFields.add(usedField); - } - } - - int mVICount = calledMethods.size() + usedOutClassFields.size(); - int mICount = classI.getMethods().size(); - int vICount = classI.getFields().size(); - - int denominator = mVICount + mICount + vICount; - - for (int j = 0; j < classCount; j++) { - - double coupD = 0; - if (denominator != 0 && i != j) { - - int mVIJ = 0; - - ClassMetrics classJ = classes.get(j); - String classJName = classJ.getFullClassName(); - - for (MethodMetrics calledMethod : calledMethods) { - if (calledMethod.getClassName().equals(classJName)) { - mVIJ += 1; - } - } - - for (FieldMetrics usedField : usedOutClassFields) { - if (usedField.getClassName().equals(classJName)) { - mVIJ += 1; - } - } - - coupD = (double)mVIJ / denominator; - } - - coup[i][j] = coupD; - } - - // out jar coup - int outJarMV = 0; - - for (MethodMetrics calledMethod : calledMethods) { - if (!calledMethod.isInternal()) { - outJarMV += 1; - } - } - - for (FieldMetrics usedField : usedOutClassFields) { - if (!usedField.isInternal()) { - outJarMV += 1; - } - } - - if (denominator != 0) { - outJarCoup[i] = (double)outJarMV / denominator; - } - else { - outJarCoup[i] = 0; - } - } - - // CoupT - modified Floyd–Warshall algorithm - for (int k = 0; k < classCount; k++) { - for (int i = 0; i < classCount; i++) { - for (int j = 0; j < classCount; j++) { - - if (i == k || j == k || i == j) { - continue; - } - - coup[i][j] = Math.max(coup[i][j], coup[i][k] * coup[k][j]); - } - } - } - - double coupSum = 0; - - for (int j = 1; j < classCount; j++) { - for (int i = 0; i < j; i++) { - - coupSum += coup[i][j] + coup[j][i]; - } - } - - // out jar coup - for (int i = 0; i < classCount; i++) { - - coupSum += outJarCoup[i]; - } - - wTCoup = coupSum / (classCount * classCount - classCount); - } - - logger.debug("WTCoup {} ", wTCoup); - - return new Double(wTCoup); - } -} diff --git a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/internal/Activator.java b/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/internal/Activator.java deleted file mode 100644 index 6ea22f00..00000000 --- a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/internal/Activator.java +++ /dev/null @@ -1,43 +0,0 @@ -package cz.zcu.kiv.crce.handler.metrics.internal; - -import org.apache.felix.dm.DependencyActivatorBase; -import org.apache.felix.dm.DependencyManager; -import org.osgi.framework.BundleContext; - -import cz.zcu.kiv.crce.concurrency.service.TaskRunnerService; -import cz.zcu.kiv.crce.metadata.MetadataFactory; -import cz.zcu.kiv.crce.metadata.dao.MetadataDao; -import cz.zcu.kiv.crce.metadata.service.MetadataService; -import cz.zcu.kiv.crce.metadata.service.validation.MetadataValidator; -import cz.zcu.kiv.crce.plugin.Plugin; -import cz.zcu.kiv.crce.repository.plugins.ActionHandler; - - -/** - * Activator of this plugin (indexer). - * - * @author Jan Smajcl (smajcl@students.zcu.cz) - */ -public class Activator extends DependencyActivatorBase { - - @Override - public void init(BundleContext context, DependencyManager manager) throws Exception { - - String services[] = { Plugin.class.getName(), ActionHandler.class.getName() }; - - manager.add(createComponent() - .setInterface(services, null) - .setImplementation(MetricsIndexerActionHandler.class) - .add(createServiceDependency().setRequired(true).setService(TaskRunnerService.class)) - .add(createServiceDependency().setRequired(true).setService(MetadataService.class)) - .add(createServiceDependency().setRequired(true).setService(MetadataValidator.class)) - .add(createServiceDependency().setRequired(true).setService(MetadataFactory.class)) - .add(createServiceDependency().setRequired(true).setService(MetadataDao.class)) - ); - } - - @Override - public void destroy(BundleContext context, DependencyManager manager) throws Exception { - // do nothing - } -} diff --git a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/internal/MetricsIndexer.java b/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/internal/MetricsIndexer.java deleted file mode 100644 index 9a2a29a9..00000000 --- a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/internal/MetricsIndexer.java +++ /dev/null @@ -1,256 +0,0 @@ -package cz.zcu.kiv.crce.handler.metrics.internal; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.List; - -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; - -import javax.annotation.Nonnull; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.tree.ClassNode; - -import cz.zcu.kiv.crce.handler.metrics.ComponentMetrics; -import cz.zcu.kiv.crce.handler.metrics.Metrics; -import cz.zcu.kiv.crce.handler.metrics.PackageMetrics; -import cz.zcu.kiv.crce.handler.metrics.asm.ClassMetrics; -import cz.zcu.kiv.crce.handler.metrics.asm.ClassesMetrics; -import cz.zcu.kiv.crce.handler.metrics.asm.impl.ClassMetricsImpl; -import cz.zcu.kiv.crce.handler.metrics.asm.impl.ClassesMetricsImpl; -import cz.zcu.kiv.crce.handler.metrics.impl.AverageCyclomaticComplexity; -import cz.zcu.kiv.crce.handler.metrics.impl.CpcMetrics; -import cz.zcu.kiv.crce.handler.metrics.impl.MaximumCyclomaticComplexity; -import cz.zcu.kiv.crce.handler.metrics.impl.MinimumCyclomaticComplexity; -import cz.zcu.kiv.crce.handler.metrics.impl.NumberOfImportsMetrics; -import cz.zcu.kiv.crce.handler.metrics.impl.RippleEffectMetrics; -import cz.zcu.kiv.crce.handler.metrics.impl.WTCohMetrics; -import cz.zcu.kiv.crce.handler.metrics.impl.WTCoupMetrics; -import cz.zcu.kiv.crce.metadata.Attribute; -import cz.zcu.kiv.crce.metadata.Capability; -import cz.zcu.kiv.crce.metadata.Property; -import cz.zcu.kiv.crce.metadata.Resource; -import cz.zcu.kiv.crce.metadata.MetadataFactory; -import cz.zcu.kiv.crce.metadata.osgi.namespace.NsOsgiPackage; -import cz.zcu.kiv.crce.metadata.service.MetadataService; - -/** - * Measurement of metrics computed on OSGI bundle implementation (jar file). - * Store computed values into Resources. - * - * @author Jan Smajcl (smajcl@students.zcu.cz) - */ -public class MetricsIndexer { - - private static final Logger logger = LoggerFactory.getLogger(MetricsIndexer.class); - - private MetadataFactory metadataFactory; - private MetadataService metadataService; - - private List classMetricsList; - private ClassesMetrics classesMetrics; - - /** - * New instance. - * - * @param metadataFactory MetadataFactory - * @param metadataService MetadataService - */ - public MetricsIndexer(@Nonnull MetadataFactory metadataFactory, @Nonnull MetadataService metadataService) { - this.metadataFactory = metadataFactory; - this.metadataService = metadataService; - } - - /** - * Compute metrics for jar file (OSGI bundle). - * - * @param input InputStream of jar file. - * @param resource Resource to save computed data. - */ - public void index(final InputStream input, @Nonnull Resource resource) { - - classMetricsList = new ArrayList(); - - // parsing input stream and collect class entry informations (ClassMetrics) - try { - ZipInputStream jis = new ZipInputStream(input); - for (ZipEntry e = jis.getNextEntry(); e != null; e = jis.getNextEntry()) { - if (e.getName().endsWith(".class")) { - parseClass(new ClassReader(getEntryImputStream(jis))); - } - } - } catch (IOException e) { - - logger.error("Could not index resource.", e); - return; - } - - classesMetrics = new ClassesMetricsImpl(classMetricsList); - } - - /** - * Create metrics objects, compute metrics and computed values put into Resource. - * - * This method is a point, where to add new implemented metrics. You should create metrics computing object - * and add it to at least 'allMetrics' collection (init call). You probably will add it to at least one other - * metrics collection to compute values and add it into metadata. - * - * @param resource Resource to save computed data. - */ - public void computeAndSaveMetrics(Resource resource) { - - // create objects - List allMetrics = new ArrayList(); - List componentMetrics = new ArrayList(); - List packageMetrics = new ArrayList(); - - NumberOfImportsMetrics numberOfImportsMetrics = new NumberOfImportsMetrics(resource); - CpcMetrics cpcMetrics = new CpcMetrics(classesMetrics); - RippleEffectMetrics rippleEffectMetrics = new RippleEffectMetrics(classesMetrics); - AverageCyclomaticComplexity averageCyclomaticComplexity = new AverageCyclomaticComplexity(classesMetrics); - MaximumCyclomaticComplexity maximumCyclomaticComplexity = new MaximumCyclomaticComplexity(classesMetrics); - MinimumCyclomaticComplexity minimumCyclomaticComplexity = new MinimumCyclomaticComplexity(classesMetrics); - WTCohMetrics wTCohMetrics = new WTCohMetrics(classesMetrics); - WTCoupMetrics wTCoupMetrics = new WTCoupMetrics(classesMetrics); - - // fill metrics lists - allMetrics.add(numberOfImportsMetrics); - allMetrics.add(cpcMetrics); - allMetrics.add(rippleEffectMetrics); - allMetrics.add(averageCyclomaticComplexity); - allMetrics.add(maximumCyclomaticComplexity); - allMetrics.add(minimumCyclomaticComplexity); - allMetrics.add(wTCohMetrics); - allMetrics.add(wTCoupMetrics); - - componentMetrics.add(numberOfImportsMetrics); - componentMetrics.add(averageCyclomaticComplexity); - componentMetrics.add(maximumCyclomaticComplexity); - componentMetrics.add(minimumCyclomaticComplexity); - componentMetrics.add(wTCohMetrics); - componentMetrics.add(wTCoupMetrics); - - packageMetrics.add(cpcMetrics); - packageMetrics.add(rippleEffectMetrics); - - // init metrics - for (Metrics metric : allMetrics) { - metric.init(); - } - - // compute metrics - for (ComponentMetrics metric : componentMetrics) { - computeMetricsForComponent(metric, resource); - } - - for (PackageMetrics metric : packageMetrics) { - computeMetricsForPackages(metric, resource.getCapabilities(NsOsgiPackage.NAMESPACE__OSGI_PACKAGE)); - } - - // "metrics" tag indicate, that the resource has been measured - metadataService.addCategory(resource, "metrics"); - } - - /** - * Reading single entry from ZipInputStream. - * - * @param jis ZipInputStream. - * @return Single entry InputStream. - * @throws IOException - */ - private InputStream getEntryImputStream(ZipInputStream jis) throws IOException { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - byte[] buf = new byte[1024]; - int n; - while ((n = jis.read(buf, 0, buf.length)) > 0) { - baos.write(buf, 0, n); - } - - return new ByteArrayInputStream(baos.toByteArray()); - } - - /** - * Parse class metrics (data) from single ClassReader using ASM. - * - * @param classReader ClassReader of single class node. - */ - private void parseClass(ClassReader classReader) { - ClassNode byteCodeNode = new ClassNode(); - classReader.accept(byteCodeNode, ClassReader.SKIP_DEBUG); - - classMetricsList.add(new ClassMetricsImpl(byteCodeNode)); - } - - /** - * Compute selected metrics for entire component and save it into resource. - * - * @param metrics Object of metrics to be computed. - * @param resource Resource to save computed metrics property. - */ - private void computeMetricsForComponent(ComponentMetrics metrics, Resource resource) { - - Property metricsProperty = metadataFactory.createProperty(NsMetrics.NAMESPACE__METRICS); - addAtrributesToMetricsProperty(metricsProperty, metrics.getName(), metrics.computeValue()); - - resource.addProperty(metricsProperty); - } - - /** - * Compute selected metrics for all packages and save it into corresponding capability. - * - * @param metrics Object of metrics to be computed. - * @param exportPackageCapabilities Package capabilities. - */ - private void computeMetricsForPackages(PackageMetrics metrics, List exportPackageCapabilities) { - - // log if no export packages are set in Resources -> nothing to compute - if (exportPackageCapabilities.isEmpty()) { - - logger.error("No export packages found in metadata capabilities."); - return; - } - - // for each package - for (Capability exportPackageCapability : exportPackageCapabilities) { - - Attribute packageNameAttribute = exportPackageCapability.getAttribute(NsOsgiPackage.ATTRIBUTE__NAME); - - if (packageNameAttribute != null) { - String packageName = packageNameAttribute.getValue(); - - Property metricsProperty = metadataFactory.createProperty(NsMetrics.NAMESPACE__METRICS); - addAtrributesToMetricsProperty(metricsProperty, metrics.getName(), metrics.computeValueForPackage(packageName)); - - exportPackageCapability.addProperty(metricsProperty); - } - } - } - - /** - * Fill metrics property with metrics values. - * - * @param metricsProperty Metrics property. - * @param name Name of property. - * @param value Metrics value. - */ - private void addAtrributesToMetricsProperty(Property metricsProperty, String name, Object value) { - - metricsProperty.setAttribute(NsMetrics.ATTRIBUTE__NAME, name); - if (value instanceof Long) { - metricsProperty.setAttribute(NsMetrics.ATTRIBUTE__LONG__VALUE, (Long)value); - } - else if (value instanceof Double) { - metricsProperty.setAttribute(NsMetrics.ATTRIBUTE__DOUBLE__VALUE, (Double)value); - } - else { - metricsProperty.setAttribute(NsMetrics.ATTRIBUTE__STRING__VALUE, value.toString()); - } - } -} diff --git a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/internal/MetricsIndexerActionHandler.java b/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/internal/MetricsIndexerActionHandler.java deleted file mode 100644 index f9287020..00000000 --- a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/internal/MetricsIndexerActionHandler.java +++ /dev/null @@ -1,46 +0,0 @@ -package cz.zcu.kiv.crce.handler.metrics.internal; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import cz.zcu.kiv.crce.concurrency.service.TaskRunnerService; -import cz.zcu.kiv.crce.metadata.Resource; -import cz.zcu.kiv.crce.metadata.MetadataFactory; -import cz.zcu.kiv.crce.metadata.dao.MetadataDao; -import cz.zcu.kiv.crce.metadata.service.MetadataService; -import cz.zcu.kiv.crce.metadata.service.validation.MetadataValidator; -import cz.zcu.kiv.crce.repository.RefusedArtifactException; -import cz.zcu.kiv.crce.repository.Store; -import cz.zcu.kiv.crce.repository.plugins.AbstractActionHandler; - -/** - * Implementation of AbstractActionHandler which start MetricsIndexerTask. - * - * @author Jan Smajcl (smajcl@students.zcu.cz) - */ -public class MetricsIndexerActionHandler extends AbstractActionHandler { - - private static final Logger logger = LoggerFactory.getLogger(MetricsIndexerActionHandler.class); - - private volatile TaskRunnerService taskRunnerService; - private volatile MetadataService metadataService; - private volatile MetadataValidator metadataValidator; - private volatile MetadataFactory metadataFactory; - private volatile MetadataDao metadataDao; - - @Override - public Resource afterPutToStore(Resource resource, Store store) throws RefusedArtifactException { - - logger.debug("afterPutToStore called."); - - MetricsIndexer metricsIndexer = new MetricsIndexer(metadataFactory, metadataService); - - MetricsIndexerTask task = new MetricsIndexerTask(resource.getId(), metadataService, metadataValidator, metricsIndexer, resource, metadataDao); - - taskRunnerService.scheduleTask(task); - - logger.debug("task scheduled"); - - return resource; - } -} diff --git a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/internal/MetricsIndexerTask.java b/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/internal/MetricsIndexerTask.java deleted file mode 100644 index f2ef7173..00000000 --- a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/internal/MetricsIndexerTask.java +++ /dev/null @@ -1,100 +0,0 @@ -package cz.zcu.kiv.crce.handler.metrics.internal; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.net.URI; - -import javax.annotation.Nonnull; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import cz.zcu.kiv.crce.concurrency.model.Task; -import cz.zcu.kiv.crce.metadata.Resource; -import cz.zcu.kiv.crce.metadata.dao.MetadataDao; -import cz.zcu.kiv.crce.metadata.service.MetadataService; -import cz.zcu.kiv.crce.metadata.service.validation.MetadataValidator; -import cz.zcu.kiv.crce.metadata.service.validation.ResourceValidationResult; - -/** - * Implementation of Task which compute metrics for selected Resource. - * - * @author Jan Smajcl (smajcl@students.zcu.cz) - */ -@SuppressWarnings("rawtypes") -public class MetricsIndexerTask extends Task { - - private static final Logger logger = LoggerFactory.getLogger(MetricsIndexerTask.class); - - private MetadataService metadataService; - private MetadataValidator metadataValidator; - private MetricsIndexer metricsIndexer; - private Resource resource; - private MetadataDao metadataDao; - - /** - * New instance. - * - * @param id Job ID. - * @param metadataService MetadataService. - * @param metadataValidator MetadataValidator. - * @param metricsIndexer MetricsIndexer. - * @param resource Resource. - * @param resourceDAO ResourceDAO. - */ - protected MetricsIndexerTask(@Nonnull String id, @Nonnull MetadataService metadataService, @Nonnull MetadataValidator metadataValidator, - @Nonnull MetricsIndexer metricsIndexer, @Nonnull Resource resource, @Nonnull MetadataDao resourceDAO) { - - super(id, "Calculates metrics for a provided resource.", "crce-handler-metrics"); - - this.metadataService = metadataService; - this.metadataValidator = metadataValidator; - this.metricsIndexer = metricsIndexer; - this.resource = resource; - this.metadataDao = resourceDAO; - } - - @Override - protected Object run() throws Exception { - - logger.debug("Started computing metrics for resource {} ", resource.getId()); - - if (metadataService.getCategories(resource).contains("osgi")) { - - URI uri = metadataService.getUri(resource); - File file = new File(uri); - logger.debug("file name: {}", file.getName()); - try (FileInputStream fis = new FileInputStream(file)) { - metricsIndexer.index(fis, resource); - } - - metricsIndexer.computeAndSaveMetrics(resource); - - ResourceValidationResult validationResult = metadataValidator.validate(resource); - if (!validationResult.isContextValid()) { - - logger.error("Indexed Resource {} is not valid:\r\n{}", resource.getId(), validationResult); - } - else { - - logger.info("Indexed resource {} is valid.", resource.getId()); - - try { - metadataDao.saveResource(resource); - } - catch (IOException e) { - logger.error("Could not save indexed resource for file {}: {}", file, resource.getId(), e); - } - } - } - else { - - logger.debug("Resource {} not OSGI", resource.getId()); - } - - logger.debug("Finished computing metrics for resource {} ", resource.getId()); - return null; - } - -} diff --git a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/internal/NsMetrics.java b/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/internal/NsMetrics.java deleted file mode 100644 index 3c281691..00000000 --- a/modules/crce-handler-metrics/src/main/java/cz/zcu/kiv/crce/handler/metrics/internal/NsMetrics.java +++ /dev/null @@ -1,23 +0,0 @@ -package cz.zcu.kiv.crce.handler.metrics.internal; - -import cz.zcu.kiv.crce.metadata.AttributeType; -import cz.zcu.kiv.crce.metadata.impl.SimpleAttributeType; - -/** - * Namespace and attributes specification for Capability metadata api. - * - * @author Jan Smajcl (smajcl@students.zcu.cz) - */ -public interface NsMetrics { - - String NAMESPACE__METRICS = "crce.metrics"; - - AttributeType ATTRIBUTE__NAME = new SimpleAttributeType<>("name", String.class); - - AttributeType ATTRIBUTE__LONG__VALUE = new SimpleAttributeType<>("value", Long.class); - - AttributeType ATTRIBUTE__DOUBLE__VALUE = new SimpleAttributeType<>("value", Double.class); - - AttributeType ATTRIBUTE__STRING__VALUE = new SimpleAttributeType<>("value", String.class); - -} diff --git a/modules/crce-integration-tests/.project b/modules/crce-integration-tests/.project new file mode 100644 index 00000000..944831af --- /dev/null +++ b/modules/crce-integration-tests/.project @@ -0,0 +1,17 @@ + + + crce-integration-tests + + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + + diff --git a/modules/crce-metadata-osgi-bundle/.classpath b/modules/crce-metadata-osgi-bundle/.classpath new file mode 100644 index 00000000..dfdb3d58 --- /dev/null +++ b/modules/crce-metadata-osgi-bundle/.classpath @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/crce-metadata-osgi-bundle/.project b/modules/crce-metadata-osgi-bundle/.project new file mode 100644 index 00000000..11d2bf88 --- /dev/null +++ b/modules/crce-metadata-osgi-bundle/.project @@ -0,0 +1,55 @@ + + + crce-metadata-osgi-bundle + + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.fusesource.ide.project.RiderProjectBuilder + + + + + org.jboss.tools.jst.web.kb.kbbuilder + + + + + org.jboss.tools.cdi.core.cdibuilder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.pde.PluginNature + org.fusesource.ide.project.RiderProjectNature + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + org.eclipse.wst.common.project.facet.core.nature + org.jboss.tools.jst.web.kb.kbnature + org.jboss.tools.cdi.core.cdinature + + diff --git a/modules/crce-metadata-osgi-bundle/pom.xml b/modules/crce-metadata-osgi-bundle/pom.xml index b7e57f99..97a60764 100644 --- a/modules/crce-metadata-osgi-bundle/pom.xml +++ b/modules/crce-metadata-osgi-bundle/pom.xml @@ -26,6 +26,14 @@ org.apache.felix org.apache.felix.dependencymanager.annotation + + org.apache.maven.plugins + maven-compiler-plugin + + 10 + 10 + + @@ -63,7 +71,7 @@ cz.zcu.kiv.crce crce-metadata-impl - 3.0.0 + 3.0.1-SNAPSHOT test diff --git a/modules/crce-metadata-osgi-bundle/src/main/java/cz/zcu/kiv/crce/metadata/osgi/internal/OsgiManifestBundleIndexer.java b/modules/crce-metadata-osgi-bundle/src/main/java/cz/zcu/kiv/crce/metadata/osgi/internal/OsgiManifestBundleIndexer.java index 0e3e01c4..b1e52e52 100644 --- a/modules/crce-metadata-osgi-bundle/src/main/java/cz/zcu/kiv/crce/metadata/osgi/internal/OsgiManifestBundleIndexer.java +++ b/modules/crce-metadata-osgi-bundle/src/main/java/cz/zcu/kiv/crce/metadata/osgi/internal/OsgiManifestBundleIndexer.java @@ -35,55 +35,39 @@ */ package cz.zcu.kiv.crce.metadata.osgi.internal; +import cz.zcu.kiv.crce.metadata.*; +import cz.zcu.kiv.crce.metadata.impl.SimpleAttributeType; +import cz.zcu.kiv.crce.metadata.indexer.AbstractResourceIndexer; import cz.zcu.kiv.crce.metadata.namespace.NsCrceIdentity; -import cz.zcu.kiv.crce.metadata.osgi.namespace.NsOsgiPackage; -import cz.zcu.kiv.crce.metadata.osgi.namespace.NsOsgiFragment; +import cz.zcu.kiv.crce.metadata.osgi.namespace.NsMap; import cz.zcu.kiv.crce.metadata.osgi.namespace.NsOsgiBundle; import cz.zcu.kiv.crce.metadata.osgi.namespace.NsOsgiExecutionEnvironment; +import cz.zcu.kiv.crce.metadata.osgi.namespace.NsOsgiFragment; import cz.zcu.kiv.crce.metadata.osgi.namespace.NsOsgiIdentity; +import cz.zcu.kiv.crce.metadata.osgi.namespace.NsOsgiPackage; import cz.zcu.kiv.crce.metadata.osgi.namespace.NsOsgiService; - -import java.io.*; -import java.net.MalformedURLException; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.URL; -import java.net.URLConnection; -import java.net.URLStreamHandler; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Properties; -import java.util.Set; -import java.util.jar.JarFile; -import java.util.jar.Manifest; -import java.util.zip.ZipEntry; -import java.util.zip.ZipException; -import java.util.zip.ZipInputStream; - -import org.apache.felix.utils.manifest.Attribute; +import cz.zcu.kiv.crce.metadata.service.MetadataService; +import cz.zcu.kiv.crce.metadata.type.Version; import org.apache.felix.utils.manifest.Clause; import org.apache.felix.utils.manifest.Directive; import org.apache.felix.utils.manifest.Parser; import org.apache.felix.utils.version.VersionCleaner; import org.apache.felix.utils.version.VersionRange; - import org.osgi.framework.Constants; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import cz.zcu.kiv.crce.metadata.AttributeType; -import cz.zcu.kiv.crce.metadata.Capability; -import cz.zcu.kiv.crce.metadata.Operator; -import cz.zcu.kiv.crce.metadata.Requirement; -import cz.zcu.kiv.crce.metadata.Resource; -import cz.zcu.kiv.crce.metadata.MetadataFactory; -import cz.zcu.kiv.crce.metadata.impl.SimpleAttributeType; -import cz.zcu.kiv.crce.metadata.indexer.AbstractResourceIndexer; -import cz.zcu.kiv.crce.metadata.service.MetadataService; -import cz.zcu.kiv.crce.metadata.type.Version; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.*; +import java.util.*; +import java.util.jar.JarFile; +import java.util.jar.Manifest; +import java.util.zip.ZipEntry; +import java.util.zip.ZipException; +import java.util.zip.ZipInputStream; /** * This is original class DataModelHelperImpl adopted from org.apache.felix.bundlerepository. @@ -143,16 +127,16 @@ public InputStream getInputStream() throws IOException { return Collections.emptyList(); } - cz.zcu.kiv.crce.metadata.Attribute pn = osgiIdentity.getAttribute(NsOsgiIdentity.ATTRIBUTE__PRESENTATION_NAME); + Attribute pn = osgiIdentity.getAttribute(NsOsgiIdentity.ATTRIBUTE__PRESENTATION_NAME); if (pn != null) { metadataService.setPresentationName(resource, pn.getValue()); } - cz.zcu.kiv.crce.metadata.Attribute sn = osgiIdentity.getAttribute(NsOsgiIdentity.ATTRIBUTE__SYMBOLIC_NAME); + Attribute sn = osgiIdentity.getAttribute(NsOsgiIdentity.ATTRIBUTE__SYMBOLIC_NAME); if(sn != null) { metadataService.setExternalId(resource, sn.getValue()); } - cz.zcu.kiv.crce.metadata.Attribute ver = osgiIdentity.getAttribute(NsOsgiIdentity.ATTRIBUTE__VERSION); + Attribute ver = osgiIdentity.getAttribute(NsOsgiIdentity.ATTRIBUTE__VERSION); if(ver != null) { Capability identity = metadataService.getIdentity(resource); identity.setAttribute(NsCrceIdentity.ATTRIBUTE__VERSION, ver.getValue()); @@ -172,6 +156,10 @@ public List getProvidedCategories() { return result; } + public Map> getIndexedAttributes() { + return NsMap.getAttributeMap(); + } + public Resource fillResource(final URL bundleUrl, Resource resource) throws IOException { fillResource(new Headers() { private final Manifest manifest; @@ -190,6 +178,7 @@ public Resource fillResource(final URL bundleUrl, Resource resource) throws IOEx @Override public String getHeader(String name) throws IOException { String value = manifest.getMainAttributes().getValue(name); + // #5: this will only index properties in manifest which start with '%' symbol if (value != null && value.startsWith("%")) { if (localization == null) { localization = new Properties(); @@ -370,9 +359,9 @@ private void createServiceFilter(Requirement ri, Clause clause) { private Capability createServiceCapability(Clause clause) { Capability capability = metadataFactory.createCapability(NsOsgiService.NAMESPACE__OSGI_SERVICE); capability.setAttribute(NsOsgiService.ATTRIBUTE__NAME, clause.getName()); - Attribute[] attributes = clause.getAttributes(); + org.apache.felix.utils.manifest.Attribute[] attributes = clause.getAttributes(); if (attributes != null) { - for (Attribute attribute : attributes) { + for (org.apache.felix.utils.manifest.Attribute attribute : attributes) { capability.setAttribute(new SimpleAttributeType<>(attribute.getName(), String.class), attribute.getValue()); } } @@ -460,7 +449,7 @@ private Capability createCapability(Clause clause) { Capability capability = metadataFactory.createCapability(NsOsgiPackage.NAMESPACE__OSGI_PACKAGE); capability.setAttribute(NsOsgiPackage.ATTRIBUTE__NAME, clause.getName()); capability.setAttribute(NsOsgiPackage.ATTRIBUTE__VERSION, new Version(getVersion(clause))); - Attribute[] attributes = clause.getAttributes(); + org.apache.felix.utils.manifest.Attribute[] attributes = clause.getAttributes(); for (int i = 0; attributes != null && i < attributes.length; i++) { String key = attributes[i].getName(); if (!key.equalsIgnoreCase(Constants.PACKAGE_SPECIFICATION_VERSION) && !key.equalsIgnoreCase(Constants.VERSION_ATTRIBUTE)) { @@ -494,7 +483,7 @@ private void doImportPackages(Resource resource, Headers headers) throws IOExcep private void createImportFilter(Requirement requirement, AttributeType name, Clause clause) { requirement.addAttribute(name, clause.getName()); appendVersion(requirement, NsOsgiPackage.ATTRIBUTE__VERSION, getVersionRange(clause)); - Attribute[] attributes = clause.getAttributes(); + org.apache.felix.utils.manifest.Attribute[] attributes = clause.getAttributes(); Set attrs = doImportPackageAttributes(requirement, attributes); // The next code is using the subset operator @@ -518,7 +507,7 @@ private void createImportFilter(Requirement requirement, AttributeType n } @SuppressWarnings("deprecation") - private Set doImportPackageAttributes(Requirement requirement, Attribute[] attributes) { + private Set doImportPackageAttributes(Requirement requirement, org.apache.felix.utils.manifest.Attribute[] attributes) { HashSet set = new HashSet<>(); for (int i = 0; attributes != null && i < attributes.length; i++) { String name = attributes[i].getName(); diff --git a/modules/crce-metadata-osgi-bundle/src/main/java/cz/zcu/kiv/crce/metadata/osgi/namespace/NsMap.java b/modules/crce-metadata-osgi-bundle/src/main/java/cz/zcu/kiv/crce/metadata/osgi/namespace/NsMap.java new file mode 100644 index 00000000..bfda2074 --- /dev/null +++ b/modules/crce-metadata-osgi-bundle/src/main/java/cz/zcu/kiv/crce/metadata/osgi/namespace/NsMap.java @@ -0,0 +1,70 @@ +package cz.zcu.kiv.crce.metadata.osgi.namespace; + +import cz.zcu.kiv.crce.metadata.AttributeType; + +import java.io.Serializable; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Singleton class which holds information about namespaces and attributes + * this indexer is capable of indexing. + */ +public class NsMap implements Serializable { + + /** + * Map of namespace -> indexable attribtues. + */ + private static Map> attributeMap; + + public static Map> getAttributeMap() { + if (attributeMap == null) { + initMap(); + } + + return attributeMap; + } + + private static void initMap() { + attributeMap = new HashMap<>(); + attributeMap.put(NsOsgiBundle.NAMESPACE__OSGI_BUNDLE, Arrays.asList( + (AttributeType)NsOsgiBundle.ATTRIBUTE__MANIFEST_VERSION, + NsOsgiBundle.ATTRIBUTE__PRESENTATION_NAME, + NsOsgiBundle.ATTRIBUTE__SYMBOLIC_NAME, + NsOsgiBundle.ATTRIBUTE__VERSION + )); + + attributeMap.put(NsOsgiExecutionEnvironment.NAMESPACE__OSGI_EXECUTION_ENVIRONMENT, Arrays.asList( + (AttributeType)NsOsgiExecutionEnvironment.ATTRIBUTE__EXECUTION_ENVIRONMENT + )); + + attributeMap.put(NsOsgiFragment.NAMESPACE__OSGI_FRAGMENT, Arrays.asList( + (AttributeType)NsOsgiFragment.ATTRIBUTE__HOST, + NsOsgiFragment.ATTRIBUTE__VERSION + )); + + attributeMap.put(NsOsgiIdentity.NAMESPACE__OSGI_IDENTITY, Arrays.asList( + (AttributeType)NsOsgiIdentity.ATTRIBUTE__CATEGORY, + NsOsgiIdentity.ATTRIBUTE__COPYRIGHT, + NsOsgiIdentity.ATTRIBUTE__DESCRIPTION, + NsOsgiIdentity.ATTRIBUTE__DOCUMENTATION_URI, + NsOsgiIdentity.ATTRIBUTE__LICENSES, + NsOsgiIdentity.ATTRIBUTE__NAME, + NsOsgiIdentity.ATTRIBUTE__PRESENTATION_NAME, + NsOsgiIdentity.ATTRIBUTE__SOURCE_URI, + NsOsgiIdentity.ATTRIBUTE__SYMBOLIC_NAME, + NsOsgiIdentity.ATTRIBUTE__VERSION + )); + + attributeMap.put(NsOsgiPackage.NAMESPACE__OSGI_PACKAGE, Arrays.asList( + (AttributeType)NsOsgiPackage.ATTRIBUTE__NAME, + NsOsgiPackage.ATTRIBUTE__VERSION + )); + + attributeMap.put(NsOsgiService.NAMESPACE__OSGI_SERVICE, Arrays.asList( + (AttributeType)NsOsgiService.ATTRIBUTE__NAME + )); + } +} diff --git a/modules/crce-metadata-osgi-bundle/src/test/java/cz/zcu/kiv/crce/metadata/osgi/internal/OsgiManifestBundleIndexerTest.java b/modules/crce-metadata-osgi-bundle/src/test/java/cz/zcu/kiv/crce/metadata/osgi/internal/OsgiManifestBundleIndexerTest.java new file mode 100644 index 00000000..e6bc9cc8 --- /dev/null +++ b/modules/crce-metadata-osgi-bundle/src/test/java/cz/zcu/kiv/crce/metadata/osgi/internal/OsgiManifestBundleIndexerTest.java @@ -0,0 +1,80 @@ +package cz.zcu.kiv.crce.metadata.osgi.internal; + +import cz.zcu.kiv.crce.metadata.Capability; +import cz.zcu.kiv.crce.metadata.MetadataFactory; +import cz.zcu.kiv.crce.metadata.Resource; +import cz.zcu.kiv.crce.metadata.indexer.AbstractResourceIndexer; +import cz.zcu.kiv.crce.metadata.internal.MetadataFactoryImpl; +import cz.zcu.kiv.crce.metadata.internal.ResourceImpl; +import cz.zcu.kiv.crce.metadata.service.MetadataService; +import cz.zcu.kiv.crce.metadata.service.internal.MetadataServiceImpl; +import org.junit.BeforeClass; +import org.junit.Ignore; +import org.junit.Test; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.lang.reflect.Field; +import java.net.URISyntaxException; +import java.util.List; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +/** + * Simple test to check that {@link OsgiManifestBundleIndexer} is capable + * of indexing generic jars. + */ +public class OsgiManifestBundleIndexerTest { + + private static AbstractResourceIndexer indexer; + private static MetadataService metadataService; + + @BeforeClass + public static void beforeClass() throws NoSuchFieldException, IllegalAccessException { + indexer = new OsgiManifestBundleIndexer(); + final MetadataFactory metadataFactory = new MetadataFactoryImpl(); + metadataService = new MetadataServiceImpl(); + + // set needed fields via reflection + Field field = MetadataServiceImpl.class.getDeclaredField("metadataFactory"); + field.setAccessible(true); + field.set(metadataService, metadataFactory); + + field = OsgiManifestBundleIndexer.class.getDeclaredField("metadataFactory"); + field.setAccessible(true); + field.set(indexer, metadataFactory); + field = OsgiManifestBundleIndexer.class.getDeclaredField("metadataService"); + field.setAccessible(true); + field.set(indexer, metadataService); + + } + + /** + * Test jar contains only a manifest file with following parameters: + * Manifest-Version: 1.0 + * Test-property: test + */ + @Test + @Ignore // OsgiManifestBundleIndexer currently only index osgi bundles + public void testIndexGenericJar() throws FileNotFoundException, URISyntaxException { + // jar name in resource folder + final String jarName = "/test.jar"; + final File testJar = new File(OsgiManifestBundleIndexerTest.class.getResource(jarName).toURI()); +// final String testPropName = "Test-property"; +// final String expTestPropValue = "test"; + Resource r = new ResourceImpl("test-resource"); + + // make sure that the test jar really exists + assertTrue("Test jar does not exist!", testJar.exists()); + + indexer.index(new FileInputStream(testJar), r); + + // test that jar was indexed correctly + List capabilityList = r.getRootCapabilities(); + assertFalse("No capabilities indexed for test jar!", capabilityList.isEmpty()); + assertFalse("No child capabilities indexed for test jar!", capabilityList.get(0).getChildren().isEmpty()); + } + +} diff --git a/modules/crce-metadata-osgi-bundle/src/test/resources/test.jar b/modules/crce-metadata-osgi-bundle/src/test/resources/test.jar new file mode 100644 index 00000000..e51395a6 Binary files /dev/null and b/modules/crce-metadata-osgi-bundle/src/test/resources/test.jar differ diff --git a/modules/crce-optimizer-functions/.classpath b/modules/crce-optimizer-functions/.classpath new file mode 100644 index 00000000..b8b4abe0 --- /dev/null +++ b/modules/crce-optimizer-functions/.classpath @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/crce-optimizer-functions/.project b/modules/crce-optimizer-functions/.project new file mode 100644 index 00000000..91e76148 --- /dev/null +++ b/modules/crce-optimizer-functions/.project @@ -0,0 +1,30 @@ + + + crce-optimizer-functions + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.fusesource.ide.project.RiderProjectBuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.pde.PluginNature + org.fusesource.ide.project.RiderProjectNature + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/modules/crce-optimizer-functions/pom.xml b/modules/crce-optimizer-functions/pom.xml index fc4852dd..ebe5f1f1 100644 --- a/modules/crce-optimizer-functions/pom.xml +++ b/modules/crce-optimizer-functions/pom.xml @@ -18,7 +18,7 @@ ${namespace}.optimizer-functions ${namespace}.optimizer - 3.0.0 + 3.0.1-SNAPSHOT 3.0.1-SNAPSHOT 2.2.0-SNAPSHOT 2.2.0-SNAPSHOT @@ -38,26 +38,8 @@ cz.zcu.kiv.crce - crce-metadata-api - ${crce.metadata.api.version} - - - - cz.zcu.kiv.crce - crce-resolver-api - ${crce.resolver.api.version} - - - - cz.zcu.kiv.crce - crce-repository-api - ${crce.repository.api.version} - - - - cz.zcu.kiv.crce - crce-plugin-api - ${crce.plugin.api.version} + crce-core + pom diff --git a/modules/crce-repository-maven-impl/osgi.bnd b/modules/crce-repository-maven-impl/osgi.bnd deleted file mode 100644 index 427b5f1d..00000000 --- a/modules/crce-repository-maven-impl/osgi.bnd +++ /dev/null @@ -1,26 +0,0 @@ -#----------------------------------------------------------------- -# Use this file to add customized Bnd instructions for the bundle -#----------------------------------------------------------------- - -Bundle-Activator: ${bundle.namespace}.internal.Activator - -Export-Package: - -Import-Package:\ - !org.apache.lucene.*,\ - !de.schlichtherle.*,\ - !org.apache.maven.*,\ - !org.sonatype.aether.*,\ - !junit.framework,\ - * - -Embed-Dependency:\ - indexer-artifact,\ - indexer-core,\ - lucene-core,\ - groupId=org.sonatype.aether;artifactId=aether-api,\ - groupId=org.sonatype.aether;artifactId=aether-util,\ - maven-aether-provider,\ - maven-model,\ - maven-model-builder,\ - maven-repository-metadata diff --git a/modules/crce-repository-maven-impl/pom.xml b/modules/crce-repository-maven-impl/pom.xml deleted file mode 100644 index 33009a8e..00000000 --- a/modules/crce-repository-maven-impl/pom.xml +++ /dev/null @@ -1,251 +0,0 @@ - - - - 4.0.0 - - - ../pom - cz.zcu.kiv.crce - crce-modules-parent - 2.1.1-SNAPSHOT - - - crce-repository-maven-impl - bundle - - CRCE - Maven Repository Implementation - - - ${namespace}.repository.maven.impl - ${namespace}.repository.maven - 5.1.1 - 0.9.1.v20140329 - 3.2.1 - true - - - - - - org.apache.felix - org.apache.felix.dependencymanager.annotation - - - - - - - - - - org.apache.felix - org.osgi.service.obr - - - - - - commons-io - commons-io - - - - org.eclipse.sisu - org.eclipse.sisu.plexus - 0.2.1 - - - org.codehaus.plexus - plexus-classworlds - - - - - - org.eclipse.sisu - org.eclipse.sisu.inject - 0.2.1 - - - org.sonatype.sisu - sisu-guice - 3.2.1 - - - org.codehaus.plexus - plexus-classworlds - 2.5.1 - - - com.google.inject - guice - 3.0 - - - - org.eclipse.aether - aether-api - ${version.org.eclipse.aether} - - - org.eclipse.aether - aether-impl - ${version.org.eclipse.aether} - - - org.eclipse.aether - aether-spi - ${version.org.eclipse.aether} - - - org.eclipse.aether - aether-connector-basic - ${version.org.eclipse.aether} - - - org.eclipse.aether - aether-transport-file - ${version.org.eclipse.aether} - - - org.eclipse.aether - aether-transport-http - ${version.org.eclipse.aether} - - - org.eclipse.aether - aether-util - ${version.org.eclipse.aether} - - - - - - - cz.zcu.kiv.crce.wrapper - org.apache.httpcomponents.httpclient - 4.2.6 - - - cz.zcu.kiv.crce.wrapper - org.apache.httpcomponents.httpcore - 4.2.5 - - - cz.zcu.kiv.crce.wrapper - org.codehaus.plexus.plexus-utils - 3.0.17 - - - cz.zcu.kiv.crce.wrapper - org.codehaus.plexus.plexus-interpolation - 1.19 - - - cz.zcu.kiv.crce.wrapper - org.codehaus.plexus.plexus-component-annotations - 1.5.5 - - - - - - org.apache.maven.indexer - indexer-artifact - ${version.org.apache.maven.indexer} - - - org.apache.maven.indexer - indexer-core - ${version.org.apache.maven.indexer} - - - org.apache.maven - maven-model - ${version.org.apache.maven} - - - org.apache.maven - maven-model-builder - ${version.org.apache.maven} - - - org.apache.maven - maven-aether-provider - ${version.org.apache.maven} - - - org.apache.maven - maven-repository-metadata - ${version.org.apache.maven} - - - org.apache.lucene - lucene-core - 3.6.2 - - - org.glassfish.hk2.external - javax.inject - 2.2.0 - - - - org.sonatype.aether - aether-api - 1.13.1 - - - org.sonatype.aether - aether-util - 1.13.1 - - - - - - ${project.groupId} - crce-core - pom - - - - ${project.groupId} - crce-concurrency - ${project.version} - - - - - - junit - junit - - - org.apache.felix.dependencymanager.annotation - org.apache.felix - - - maven-project - org.apache.maven - - - - - - - - \ No newline at end of file diff --git a/modules/crce-repository-maven-impl/src/main/java/cz/zcu/kiv/crce/repository/maven/internal/Activator.java b/modules/crce-repository-maven-impl/src/main/java/cz/zcu/kiv/crce/repository/maven/internal/Activator.java deleted file mode 100644 index 2b7ddfc7..00000000 --- a/modules/crce-repository-maven-impl/src/main/java/cz/zcu/kiv/crce/repository/maven/internal/Activator.java +++ /dev/null @@ -1,170 +0,0 @@ -package cz.zcu.kiv.crce.repository.maven.internal; - -import java.io.File; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.Dictionary; -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; - -import org.apache.felix.dm.Component; -import org.apache.felix.dm.DependencyActivatorBase; -import org.apache.felix.dm.DependencyManager; - -import org.osgi.framework.BundleContext; -import org.osgi.framework.Constants; -import org.osgi.service.cm.ConfigurationException; -import org.osgi.service.cm.ManagedServiceFactory; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import cz.zcu.kiv.crce.concurrency.service.TaskRunnerService; -import cz.zcu.kiv.crce.metadata.MetadataFactory; -import cz.zcu.kiv.crce.metadata.dao.MetadataDao; -import cz.zcu.kiv.crce.metadata.indexer.ResourceIndexerService; -import cz.zcu.kiv.crce.metadata.service.MetadataService; -import cz.zcu.kiv.crce.metadata.service.validation.MetadataValidator; -import cz.zcu.kiv.crce.repository.Store; -import cz.zcu.kiv.crce.resolver.ResourceLoader; - -/** - * Activator of this bundle. - * @author Jiri Kucera (jiri.kucera@kalwi.eu) - */ -public class Activator extends DependencyActivatorBase implements ManagedServiceFactory { - - private static final Logger logger = LoggerFactory.getLogger(Activator.class); - - public static final String PID = "cz.zcu.kiv.crce.repository.maven"; - - public static final String CFG_PROPERTY__STORE_URI = "store.uri"; - - /** - * PID to component. - */ - private final Map components = new HashMap<>(); - /** - * PID to URI. - */ - private final Map uris = new HashMap<>(); - - private volatile DependencyManager dependencyManager; /* injected by dependency manager */ - - @Override - public void init(BundleContext bc, DependencyManager dm) throws Exception { - logger.debug("Initializing maven repository."); - - Properties props = new Properties(); - props.put(Constants.SERVICE_PID, PID); - dm.add(createComponent() - .setInterface(ManagedServiceFactory.class.getName(), props) - .setImplementation(this) - ); - } - - @Override - public void destroy(BundleContext bc, DependencyManager dm) throws Exception { - for (Component component : components.values()) { - dependencyManager.remove(component); - } - logger.debug("Maven repository destroyed."); - } - - @Override - public String getName() { - return "Maven repository store factory."; - } - - @Override - public void updated(String pid, Dictionary properties) throws ConfigurationException { - logger.trace("ManagedServiceFactory updated with pid: {}", pid); - - if (properties == null) { - logger.warn("Repository ({}) configuration is empty!", pid); - return; - } - - logger.debug("Updating maven repository ({}) configuration: {}", properties); - - String path = (String) properties.get(CFG_PROPERTY__STORE_URI); - - URI uri; - File file = null; - try { - uri = new URI(path); - if (uri.getScheme() == null) { - file = new File(path); - uri = file.toURI(); - } else if ("file".equals(uri.getScheme())) { - file = new File(uri); - } else { - throw new ConfigurationException(CFG_PROPERTY__STORE_URI, "Unsupported URI scheme for filebased repository: " + uri.getScheme()); - } - } catch (URISyntaxException ex) { - logger.warn("Invalid URI syntax: " + path, ex); - file = new File(path); - uri = file.toURI(); - } - - final String absolutePath = file.getAbsolutePath(); - - logger.debug("Repository URI: {}, file: {}", uri, absolutePath); - - if (!file.isDirectory()) { - throw new ConfigurationException(CFG_PROPERTY__STORE_URI, "Store URI is not a directory: " + path); - } - - for (Map.Entry entry : uris.entrySet()) { - if (entry.getValue().equals(absolutePath) && !entry.getKey().equals(pid)) { - throw new ConfigurationException(CFG_PROPERTY__STORE_URI, - "Another repository (PID: " + entry.getKey() + ") is already configured for this path: " + absolutePath); - } - } - - String oldPath = uris.get(pid); - if (oldPath != null) { - if (oldPath.equals(absolutePath)) { - logger.debug("Repository (PID: {}) is already configured for this path: {}", pid, absolutePath); - return; - } else { - deleted(pid); - } - } - - Properties props = new Properties(); - props.put("id", pid); - props.put("name", "Maven: " + uri); - - Component storeComponent = createComponent() - .setInterface(Store.class.getName(), props) - .setImplementation(new MavenStoreImpl(uri)) -// .add(dependencyManager.createConfigurationDependency().setPid(pid).setPropagate(true)) - .add(createServiceDependency().setRequired(true).setService(MetadataService.class)) - .add(createServiceDependency().setRequired(true).setService(MetadataDao.class)) - .add(createServiceDependency().setRequired(true).setService(MetadataFactory.class)) - .add(createServiceDependency().setRequired(true).setService(MetadataValidator.class)) - .add(createServiceDependency().setRequired(true).setService(ResourceLoader.class)) - .add(createServiceDependency().setRequired(true).setService(IdentityIndexer.class)) - .add(createServiceDependency().setRequired(true).setService(ResourceIndexerService.class)) - .add(createServiceDependency().setRequired(true).setService(TaskRunnerService.class)); - - logger.debug("Registering repository store: {}", storeComponent); - - uris.put(pid, absolutePath); - components.put(pid, storeComponent); - dependencyManager.add(storeComponent); - } - - @Override - public void deleted(String pid) { - Component storeComponent = components.remove(pid); - if (storeComponent != null) { - logger.debug("Unregistering repository store: {}", storeComponent); - - dependencyManager.remove(storeComponent); - uris.remove(pid); - } - } -} diff --git a/modules/crce-repository-maven-impl/src/main/java/cz/zcu/kiv/crce/repository/maven/internal/CloseableIndexingContext.java b/modules/crce-repository-maven-impl/src/main/java/cz/zcu/kiv/crce/repository/maven/internal/CloseableIndexingContext.java deleted file mode 100644 index 2d59bff8..00000000 --- a/modules/crce-repository-maven-impl/src/main/java/cz/zcu/kiv/crce/repository/maven/internal/CloseableIndexingContext.java +++ /dev/null @@ -1,221 +0,0 @@ -package cz.zcu.kiv.crce.repository.maven.internal; - -import java.io.Closeable; -import java.io.File; -import java.io.IOException; -import java.util.Collection; -import java.util.Date; -import java.util.List; -import java.util.Set; - -import org.apache.lucene.analysis.Analyzer; -import org.apache.lucene.index.IndexWriter; -import org.apache.lucene.search.IndexSearcher; -import org.apache.lucene.store.Directory; -import org.apache.maven.index.Indexer; -import org.apache.maven.index.artifact.GavCalculator; -import org.apache.maven.index.context.DocumentFilter; -import org.apache.maven.index.context.IndexCreator; -import org.apache.maven.index.context.IndexingContext; - -/** - * - * @author Jiri Kucera (jiri.kucera@kalwi.eu) - */ -public class CloseableIndexingContext implements IndexingContext, Closeable { - - private final IndexingContext delegate; - private final Indexer indexer; - private boolean closed; - - public CloseableIndexingContext(IndexingContext delegate, Indexer indexer) { - this.delegate = delegate; - this.indexer = indexer; - } - - @Override - public String getId() { - return delegate.getId(); - } - - @Override - public String getRepositoryId() { - return delegate.getRepositoryId(); - } - - @Override - public File getRepository() { - return delegate.getRepository(); - } - - @Override - public String getRepositoryUrl() { - return delegate.getRepositoryUrl(); - } - - @Override - public String getIndexUpdateUrl() { - return delegate.getIndexUpdateUrl(); - } - - @Override - public boolean isSearchable() { - return delegate.isSearchable(); - } - - @Override - public void setSearchable(boolean searchable) { - delegate.setSearchable(searchable); - } - - @Override - public Date getTimestamp() { - return delegate.getTimestamp(); - } - - @Override - public void updateTimestamp() throws IOException { - delegate.updateTimestamp(); - } - - @Override - public void updateTimestamp(boolean save) throws IOException { - delegate.updateTimestamp(save); - } - - @Override - public void updateTimestamp(boolean save, Date date) throws IOException { - delegate.updateTimestamp(save, date); - } - - @Override - public int getSize() throws IOException { - return delegate.getSize(); - } - - @Override - public IndexSearcher acquireIndexSearcher() throws IOException { - return delegate.acquireIndexSearcher(); - } - - @Override - public void releaseIndexSearcher(IndexSearcher s) throws IOException { - delegate.releaseIndexSearcher(s); - } - - @Override - public IndexWriter getIndexWriter() throws IOException { - return delegate.getIndexWriter(); - } - - @Override - public List getIndexCreators() { - return delegate.getIndexCreators(); - } - - @Override - public Analyzer getAnalyzer() { - return delegate.getAnalyzer(); - } - - @Override - public void commit() throws IOException { - delegate.commit(); - } - - @Override - public void rollback() throws IOException { - delegate.rollback(); - } - - @Override - public void optimize() throws IOException { - delegate.optimize(); - } - - @Override - public void close(boolean deleteFiles) throws IOException { - delegate.close(deleteFiles); - } - - @Override - public void purge() throws IOException { - delegate.purge(); - } - - @Override - public void merge(Directory directory) throws IOException { - delegate.merge(directory); - } - - @Override - public void merge(Directory directory, DocumentFilter filter) throws IOException { - delegate.merge(directory, filter); - } - - @Override - public void replace(Directory directory) throws IOException { - delegate.replace(directory); - } - - @Override - public Directory getIndexDirectory() { - return delegate.getIndexDirectory(); - } - - @Override - public File getIndexDirectoryFile() { - return delegate.getIndexDirectoryFile(); - } - - @Override - public GavCalculator getGavCalculator() { - return delegate.getGavCalculator(); - } - - @Override - public void setAllGroups(Collection groups) throws IOException { - delegate.setAllGroups(groups); - } - - @Override - public Set getAllGroups() throws IOException { - return delegate.getAllGroups(); - } - - @Override - public void setRootGroups(Collection groups) throws IOException { - delegate.setRootGroups(groups); - } - - @Override - public Set getRootGroups() throws IOException { - return delegate.getRootGroups(); - } - - @Override - public void rebuildGroups() throws IOException { - delegate.rebuildGroups(); - } - - @Override - public boolean isReceivingUpdates() { - return delegate.isReceivingUpdates(); - } - - @Override - public void close() throws IOException { - if (!closed) { - if (indexer != null) { - indexer.closeIndexingContext(delegate, false); - } else { - delegate.close(true); - } - closed = true; - } - } - - public Indexer getIndexer() { - return indexer; - } -} diff --git a/modules/crce-repository-maven-impl/src/main/java/cz/zcu/kiv/crce/repository/maven/internal/IdentityIndexer.java b/modules/crce-repository-maven-impl/src/main/java/cz/zcu/kiv/crce/repository/maven/internal/IdentityIndexer.java deleted file mode 100644 index aafbc5da..00000000 --- a/modules/crce-repository-maven-impl/src/main/java/cz/zcu/kiv/crce/repository/maven/internal/IdentityIndexer.java +++ /dev/null @@ -1,89 +0,0 @@ -package cz.zcu.kiv.crce.repository.maven.internal; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; - -import org.apache.felix.dm.annotation.api.Component; -import org.apache.felix.dm.annotation.api.ServiceDependency; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import cz.zcu.kiv.crce.metadata.Attribute; -import cz.zcu.kiv.crce.metadata.Capability; -import cz.zcu.kiv.crce.metadata.Resource; -import cz.zcu.kiv.crce.metadata.impl.SimpleAttributeType; -import cz.zcu.kiv.crce.metadata.service.MetadataService; - -/** - * - * @author Jiri Kucera (jiri.kucera@kalwi.eu) - */ -@Component(provides = IdentityIndexer.class) -public class IdentityIndexer { - - private static final Logger logger = LoggerFactory.getLogger(IdentityIndexer.class); - - private static final String MIME__APPLICATION_OCTET_STREAM = "application/octet-stream"; - - - @ServiceDependency private volatile MetadataService metadataService; - - public void preIndex(File file, String name, Resource resource) { - Capability identity = metadataService.getIdentity(resource); - - metadataService.setUri(resource, file.toURI().normalize()); - metadataService.setFileName(resource, name); - - identity.setAttribute("original-file-name", String.class, name); // TODO hardcoded - } - - public void postIndex(File file, Resource resource) { - Capability identity = metadataService.getIdentity(resource); - - metadataService.setSize(resource, file.length()); - String hash = getSHA(file); - if (hash != null) { - identity.setAttribute("hash", String.class, hash); // TODO hardcoded - } - - SimpleAttributeType mime = new SimpleAttributeType<>("mime", String.class); // TODO hardcoded - Attribute attribute = identity.getAttribute(mime); - if (attribute == null) { - identity.setAttribute(mime, MIME__APPLICATION_OCTET_STREAM); - } - } - - /** - * Get hexadecimal SHA-256 of file with resource or null, if error occurred during counting digest. - * - * @param file - * @return hexadecimal SHA-256 of file with resource or null - */ - private String getSHA(File file) { - try (FileInputStream fis = new FileInputStream(file)) { - MessageDigest md = MessageDigest.getInstance("SHA-256"); - - byte[] buffer = new byte[10 * 1024]; - - int nread; - while ((nread = fis.read(buffer)) != -1) { - md.update(buffer, 0, nread); - } - byte[] mdbytes = md.digest(); - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < mdbytes.length; i++) { - sb.append(Integer.toString((mdbytes[i] & 0xff) + 0x100, 16).substring(1)); // NOPMD better clarity - } - - return sb.toString(); - - } catch (NoSuchAlgorithmException | IOException e) { - logger.warn("Hash generation failed.", e); - return null; - } - } -} diff --git a/modules/crce-repository-maven-impl/src/main/java/cz/zcu/kiv/crce/repository/maven/internal/LocalRepositoryIndexer.java b/modules/crce-repository-maven-impl/src/main/java/cz/zcu/kiv/crce/repository/maven/internal/LocalRepositoryIndexer.java deleted file mode 100644 index ecd274df..00000000 --- a/modules/crce-repository-maven-impl/src/main/java/cz/zcu/kiv/crce/repository/maven/internal/LocalRepositoryIndexer.java +++ /dev/null @@ -1,263 +0,0 @@ -package cz.zcu.kiv.crce.repository.maven.internal; - -import java.io.File; -import java.io.IOException; -import java.net.URI; -import java.util.ArrayList; -import java.util.List; - -import org.apache.lucene.search.BooleanClause; -import org.apache.lucene.search.BooleanQuery; -import org.apache.maven.index.ArtifactInfo; -import org.apache.maven.index.FlatSearchRequest; -import org.apache.maven.index.FlatSearchResponse; -import org.apache.maven.index.MAVEN; -import org.apache.maven.index.expr.SourcedSearchExpression; -import org.apache.maven.repository.internal.MavenRepositorySystemUtils; - -import org.eclipse.aether.DefaultRepositorySystemSession; -import org.eclipse.aether.RepositorySystem; -import org.eclipse.aether.RepositorySystemSession; -import org.eclipse.aether.artifact.DefaultArtifact; -import org.eclipse.aether.connector.basic.BasicRepositoryConnectorFactory; -import org.eclipse.aether.impl.DefaultServiceLocator; -import org.eclipse.aether.repository.LocalRepository; -import org.eclipse.aether.resolution.ArtifactRequest; -import org.eclipse.aether.resolution.ArtifactResult; -import org.eclipse.aether.spi.connector.RepositoryConnectorFactory; -import org.eclipse.aether.spi.connector.transport.TransporterFactory; -import org.eclipse.aether.transport.file.FileTransporterFactory; -import org.eclipse.aether.transport.http.HttpTransporterFactory; - -import org.apache.lucene.store.FSDirectory; -import org.apache.maven.index.DefaultScannerListener; -import org.apache.maven.index.Indexer; -import org.apache.maven.index.IndexerEngine; -import org.apache.maven.index.Scanner; -import org.apache.maven.index.ScanningRequest; -import org.apache.maven.index.context.DefaultIndexingContext; -import org.apache.maven.index.context.IndexCreator; -import org.apache.maven.index.context.IndexUtils; -import org.apache.maven.index.context.IndexingContext; - -import org.codehaus.plexus.ContainerConfiguration; -import org.codehaus.plexus.DefaultContainerConfiguration; -import org.codehaus.plexus.DefaultPlexusContainer; -import org.codehaus.plexus.PlexusContainer; -import org.codehaus.plexus.PlexusContainerException; -import org.codehaus.plexus.classworlds.realm.ClassRealm; -import org.codehaus.plexus.component.repository.exception.ComponentLookupException; -import org.codehaus.plexus.util.FileUtils; -import org.eclipse.aether.resolution.ArtifactResolutionException; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import cz.zcu.kiv.crce.concurrency.model.Task; - -/** - * - * @author Jiri Kucera (jiri.kucera@kalwi.eu) - */ -public class LocalRepositoryIndexer extends Task { - - private static final Logger logger = LoggerFactory.getLogger(LocalRepositoryIndexer.class); - - private final URI uri; - private final MetadataIndexerCallback metadataIndexerCallback; - - public LocalRepositoryIndexer(URI uri, MetadataIndexerCallback metadataIndexerCallback) { - super(uri.toString(), "Indexes local maven repository.", "crce-repository-maven-impl"); - this.uri = uri; - this.metadataIndexerCallback = metadataIndexerCallback; - } - - @Override - protected Object run() throws Exception { - logger.info("Indexing local Maven repository started: {}", uri); - - logger.debug("Updating Maven repository index."); - FlatSearchResponse response; - try (CloseableIndexingContext indexingContext = index("local", new File(uri), new File("target/mavenindex"), true)) { - Indexer indexer = indexingContext.getIndexer(); - - BooleanQuery query = new BooleanQuery(); - query.add(indexer.constructQuery(MAVEN.PACKAGING, new SourcedSearchExpression("bundle")), BooleanClause.Occur.MUST); - - response = indexer.searchFlat(new FlatSearchRequest(query, indexingContext)); - } catch (Exception e) { - logger.error("Error updating Maven repository index.", e); - return null; - } - logger.debug("Updating Maven repository index done."); - - RepositorySystem repositorySystem = newRepositorySystem(); - RepositorySystemSession session = newSession(repositorySystem, uri); - - logger.debug("Indexing artifacts (amount: {}).", response.getTotalHitsCount()); - - ArtifactRequest artifactRequest = new ArtifactRequest(); - for (ArtifactInfo ai : response.getResults()) { - artifactRequest.setArtifact(new DefaultArtifact(ai.groupId + ":" + ai.artifactId + ":" + ai.version)); - ArtifactResult result; - try { - result = repositorySystem.resolveArtifact(session, artifactRequest); - } catch (ArtifactResolutionException e) { - logger.info("Artifact is not present in local repository: " + artifactRequest.toString()); - // TODO optionally download the artifact from a remote repository - continue; - } - File artifact = result.getArtifact().getFile().getAbsoluteFile(); - - logger.trace("Indexing artifact {}", artifact); - - metadataIndexerCallback.index(artifact); - } - - logger.info("Indexing local Maven repository finished: {}", uri); - return null; - } - - - private static RepositorySystem newRepositorySystem() { - DefaultServiceLocator locator = MavenRepositorySystemUtils.newServiceLocator(); - locator.addService(RepositoryConnectorFactory.class, BasicRepositoryConnectorFactory.class); - locator.addService(TransporterFactory.class, FileTransporterFactory.class); - locator.addService(TransporterFactory.class, HttpTransporterFactory.class); - - return locator.getService(RepositorySystem.class); - } - - private static RepositorySystemSession newSession(RepositorySystem system, URI uri) { - DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession(); - - LocalRepository localRepo = new LocalRepository(new File(uri)); - session.setLocalRepositoryManager(system.newLocalRepositoryManager(session, localRepo)); - - return session; - } - - - private CloseableIndexingContext index(String name, File repository, File indexParentDir, boolean update) - throws PlexusContainerException, ComponentLookupException, IOException { - logger.trace("Updating index '{}' at '{}' for local repo '{}', update: {}", name, indexParentDir, repository, update); - if (repository == null || indexParentDir == null) { - return null; - } - - if (!repository.exists()) { - throw new IOException("Repository directory " + repository + " does not exist"); - } - - if (!indexParentDir.exists() && !indexParentDir.mkdirs()) { - throw new IOException("Cannot create parent directory for indices: " + indexParentDir); - } - - logger.trace("Initializing Plexus container."); - - PlexusContainer plexusContainer; - Indexer indexer; - try { - ContainerConfiguration configuration = new DefaultContainerConfiguration(); - - ClassRealm classRealm = new ClassRealm(null, "crce-maven-repo-indexer", getClass().getClassLoader()); - configuration.setRealm(classRealm); - - plexusContainer = new DefaultPlexusContainer(configuration); - indexer = plexusContainer.lookup(Indexer.class); -// final IndexUpdater indexUpdater = plexusContainer.lookup(IndexUpdater.class); - } catch (Exception e) { - logger.error("Error initializing Plexus container.", e); - throw new IllegalStateException(e); - } - - List indexers = new ArrayList<>(); - indexers.add(plexusContainer.lookup(IndexCreator.class, "min")); -// indexers.add(plexusContainer.lookup(IndexCreator.class, "jarContent")); // indexes classes - - logger.trace("Creating indexing context."); - - IndexingContext indexingContext = indexer.createIndexingContext( - name + "-context", - name, - repository, - new File(indexParentDir, name), - null, - null, - true, - true, - indexers - ); - - // always use temporary context when reindexing - final File tmpFile = File.createTempFile(indexingContext.getId(), "-tmp", indexParentDir); - final File tmpDir = new File(indexParentDir, tmpFile.getName() + ".dir"); - if (!tmpDir.mkdirs()) { - throw new IOException("Cannot create temporary directory: " + tmpDir); - } - - logger.trace("Temporary dir: " + tmpDir); - - try { - Scanner scanner = plexusContainer.lookup(Scanner.class); - IndexerEngine indexerEngine = plexusContainer.lookup(IndexerEngine.class); - - final FSDirectory directory = FSDirectory.open(tmpDir); - if (update) { - IndexUtils.copyDirectory(indexingContext.getIndexDirectory(), directory); - } - - logger.trace("Creating temporary indexing context."); - - try (CloseableIndexingContext tmpContext = new CloseableIndexingContext( - new DefaultIndexingContext( - indexingContext.getId() + "-tmp", - indexingContext.getRepositoryId(), - indexingContext.getRepository(), - directory, - indexingContext.getRepositoryUrl(), - indexingContext.getIndexUpdateUrl(), - indexingContext.getIndexCreators(), - true - ), - null) - ) { - - logger.trace("Scanning."); - - ScanningRequest scanningRequest = new ScanningRequest( - tmpContext, - new DefaultScannerListener(tmpContext, indexerEngine, update, null), - null - ); - - scanner.scan(scanningRequest); - tmpContext.updateTimestamp(true); - - logger.trace("Replacing contexts."); - - indexingContext.replace(tmpContext.getIndexDirectory()); - } catch (Throwable t) { - logger.error("Error indexing local Maven repository 1.", t); - } - } catch (IOException | ComponentLookupException ex) { - logger.error("Error indexing local Maven repository 2.", ex); - throw new IOException("Error scanning context " + indexingContext.getId() + ": " + ex, ex); - } catch (Throwable t) { - logger.error("Error indexing local Maven repository 3.", t); - } finally { - try { - if (tmpFile.exists()) { - tmpFile.delete(); - } - } finally { - FileUtils.deleteDirectory(tmpDir); // TODO replace plexus utils - } - } - - logger.trace("Indexing done."); - - return new CloseableIndexingContext(indexingContext, indexer); - } - -} diff --git a/modules/crce-repository-maven-impl/src/main/java/cz/zcu/kiv/crce/repository/maven/internal/MavenStoreImpl.java b/modules/crce-repository-maven-impl/src/main/java/cz/zcu/kiv/crce/repository/maven/internal/MavenStoreImpl.java deleted file mode 100644 index a4d964e3..00000000 --- a/modules/crce-repository-maven-impl/src/main/java/cz/zcu/kiv/crce/repository/maven/internal/MavenStoreImpl.java +++ /dev/null @@ -1,179 +0,0 @@ -package cz.zcu.kiv.crce.repository.maven.internal; - -import java.io.File; -import java.io.IOException; -import java.net.URI; -import java.util.Collections; -import java.util.List; -import java.util.Properties; -import java.util.Set; - -import javax.annotation.Nonnull; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import cz.zcu.kiv.crce.concurrency.service.TaskRunnerService; -import cz.zcu.kiv.crce.metadata.MetadataFactory; -import cz.zcu.kiv.crce.metadata.Repository; -import cz.zcu.kiv.crce.metadata.Requirement; -import cz.zcu.kiv.crce.metadata.Resource; -import cz.zcu.kiv.crce.metadata.dao.MetadataDao; -import cz.zcu.kiv.crce.metadata.indexer.ResourceIndexerService; -import cz.zcu.kiv.crce.metadata.service.MetadataService; -import cz.zcu.kiv.crce.metadata.service.validation.MetadataValidator; -import cz.zcu.kiv.crce.metadata.service.validation.ResourceValidationResult; -import cz.zcu.kiv.crce.repository.RefusedArtifactException; -import cz.zcu.kiv.crce.repository.Store; -import cz.zcu.kiv.crce.repository.plugins.Executable; -import cz.zcu.kiv.crce.resolver.Operator; -import cz.zcu.kiv.crce.resolver.ResourceLoader; - -/** - * - * @author Jiri Kucera (jiri.kucera@kalwi.eu) - */ -public class MavenStoreImpl implements Store { - - private static final Logger logger = LoggerFactory.getLogger(MavenStoreImpl.class); - - private volatile MetadataFactory metadataFactory; - private volatile MetadataDao metadataDao; - private volatile TaskRunnerService taskRunnerService; - private volatile ResourceIndexerService resourceIndexerService; - private volatile ResourceLoader resourceLoader; - private volatile MetadataService metadataService; - private volatile IdentityIndexer identityIndexer; - private volatile MetadataValidator metadataValidator; - - private Repository repository; - private final URI baseUri; - - MavenStoreImpl(URI baseUri) { - this.baseUri = baseUri; - } - - @Override - public Resource put(Resource resource) throws IOException, RefusedArtifactException { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public boolean remove(Resource resource) throws IOException { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public List getResources() { - try { - return metadataDao.loadResources(repository); - } catch (IOException e) { - logger.error("Could not load resources of repository {}.", baseUri, e); - } - return Collections.emptyList(); - } - - @Override - public synchronized List getResources(Requirement requirement) { - return getResources(Collections.singleton(requirement)); - } - - @Nonnull - @Override - public synchronized List getResources(Set requirement) { - return internalGetResources(requirement, Operator.AND); - } - - @Nonnull - @Override - public synchronized List getPossibleResources(Set requirement) { - return internalGetResources(requirement, Operator.OR); - } - - private List internalGetResources(Set requirement, Operator op) { - List resources = Collections.emptyList(); - try { - resources = resourceLoader.getResources(repository, requirement, op); - } catch (IOException e) { - logger.error("Could not load resources for requirement ({})", requirement.toString()); - logger.error(e.getMessage(), e); - } - - if (logger.isDebugEnabled()) { - logger.debug("getResources(requirement={}) returns {}", requirement.toString(), resources.size()); - } - return resources; - } - - @Override - public void execute(List resources, Executable executable, Properties properties) { - throw new UnsupportedOperationException("Not supported yet."); - } - - - synchronized void start() { - try { - repository = metadataDao.loadRepository(baseUri); - } catch (IOException ex) { - logger.error("Could not load repository for {}", baseUri, ex); - } - - if (repository == null) { // TODO this is wrong when indexing fails - repository = metadataFactory.createRepository(baseUri); - try { - metadataDao.saveRepository(repository); - } catch (IOException ex) { - logger.error("Could not save repository for {}", baseUri, ex); - } - index(); - } - } - - void stop() { - logger.info("Stopping DM component {}", this); - } - - private void index() { - taskRunnerService.scheduleTask(new LocalRepositoryIndexer(baseUri, new MetadataIndexerCallback() { - - @Override - public void index(File file) { - try { - if (resourceIndexerService != null && !metadataDao.existsResource(file.toURI())) { - Resource resource; - try { - resource = resourceIndexerService.indexResource(file); - } catch (IOException e) { - logger.error("Could not index file {}", file, e); - return; - } - metadataService.getIdentity(resource).setAttribute("repository-id", String.class, repository.getId()); - - identityIndexer.preIndex(file, file.getName(), resource); - identityIndexer.postIndex(file, resource); - - ResourceValidationResult validationResult = metadataValidator.validate(resource); - if (!validationResult.isContextValid()) { - logger.error("Indexed Resource {} is not valid:\r\n{}", resource.getId(), validationResult); - return; - } - logger.info("Indexed resource {} is valid.", resource.getId()); - - try { - metadataDao.saveResource(resource); - } catch (IOException e) { - logger.error("Could not save indexed resource for file {}: {}", file, resource, e); - } - } - } catch (IOException e) { - logger.error("Could not check that resource exists: {}", file, e); - } - } - })); - } - - @Override - public String toString() { - return "MavenStoreImpl{" + "baseUri=" + baseUri + '}'; - } -} diff --git a/modules/crce-repository-maven-impl/src/main/java/cz/zcu/kiv/crce/repository/maven/internal/MetadataIndexerCallback.java b/modules/crce-repository-maven-impl/src/main/java/cz/zcu/kiv/crce/repository/maven/internal/MetadataIndexerCallback.java deleted file mode 100644 index e558d16e..00000000 --- a/modules/crce-repository-maven-impl/src/main/java/cz/zcu/kiv/crce/repository/maven/internal/MetadataIndexerCallback.java +++ /dev/null @@ -1,12 +0,0 @@ -package cz.zcu.kiv.crce.repository.maven.internal; - -import java.io.File; - -/** - * - * @author Jiri Kucera (jiri.kucera@kalwi.eu) - */ -public interface MetadataIndexerCallback { - - void index(File file); -} diff --git a/modules/crce-rest-v2/.classpath b/modules/crce-rest-v2/.classpath new file mode 100644 index 00000000..f3b0f012 --- /dev/null +++ b/modules/crce-rest-v2/.classpath @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/crce-rest-v2/.project b/modules/crce-rest-v2/.project new file mode 100644 index 00000000..c4dd3cf2 --- /dev/null +++ b/modules/crce-rest-v2/.project @@ -0,0 +1,50 @@ + + + crce-rest-v2 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.jboss.tools.ws.jaxrs.metamodelBuilder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + org.fusesource.ide.project.RiderProjectBuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.pde.PluginNature + org.fusesource.ide.project.RiderProjectNature + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + org.eclipse.wst.common.project.facet.core.nature + org.eclipse.wst.jsdt.core.jsNature + org.jboss.tools.ws.jaxrs.nature + + diff --git a/modules/crce-rest-v2/pom.xml b/modules/crce-rest-v2/pom.xml index b173521f..72ad13c7 100644 --- a/modules/crce-rest-v2/pom.xml +++ b/modules/crce-rest-v2/pom.xml @@ -59,20 +59,41 @@ war + + + org.apache.felix + org.apache.felix.dependencymanager.annotation + 5.0.1 + + - org.apache.felix - org.apache.felix.dependencymanager.annotation - 3.1.0 + org.apache.maven.plugins + maven-compiler-plugin - war + 10 + 10 + + + + + + + + + + + org.apache.felix + org.apache.felix.dependencymanager.annotation + + @@ -95,11 +116,6 @@ crce-metadata-osgi-bundle ${project.version} - - cz.zcu.kiv.crce - crce-compatibility-api - ${project.version} - cz.zcu.kiv.crce crce-vo @@ -152,6 +168,10 @@ com.fasterxml.jackson.jaxrs jackson-jaxrs-json-provider + + org.glassfish.jersey.inject + jersey-hk2 + diff --git a/modules/crce-rest-v2/src/main/java/cz/zcu/kiv/crce/rest/v2/internal/RestApplication.java b/modules/crce-rest-v2/src/main/java/cz/zcu/kiv/crce/rest/v2/internal/RestApplication.java index 5f8a16f1..4692bcde 100644 --- a/modules/crce-rest-v2/src/main/java/cz/zcu/kiv/crce/rest/v2/internal/RestApplication.java +++ b/modules/crce-rest-v2/src/main/java/cz/zcu/kiv/crce/rest/v2/internal/RestApplication.java @@ -1,13 +1,13 @@ package cz.zcu.kiv.crce.rest.v2.internal; -import java.util.HashSet; -import java.util.Set; - -import javax.ws.rs.core.Application; -import org.glassfish.jersey.filter.LoggingFilter; import org.glassfish.jersey.jackson.JacksonFeature; +import org.glassfish.jersey.logging.LoggingFeature; import org.glassfish.jersey.media.multipart.MultiPartFeature; +import javax.ws.rs.core.Application; +import java.util.HashSet; +import java.util.Set; + /** * Registers features to Jersey. * @@ -19,7 +19,7 @@ public class RestApplication extends Application { public Set> getClasses() { final Set> classes = new HashSet<>(); classes.add(MultiPartFeature.class); - classes.add(LoggingFilter.class); + classes.add(LoggingFeature.class); classes.add(JacksonFeature.class); return classes; } diff --git a/modules/crce-rest/pom.xml b/modules/crce-rest/pom.xml index 69c9f1e3..d2e80916 100644 --- a/modules/crce-rest/pom.xml +++ b/modules/crce-rest/pom.xml @@ -193,11 +193,6 @@ crce-metadata-osgi-bundle ${project.version} - - cz.zcu.kiv.crce - crce-compatibility-api - ${project.version} - diff --git a/modules/crce-restimpl-indexer/pom.xml b/modules/crce-restimpl-indexer/pom.xml index 6dcfe5c3..7d3d8447 100644 --- a/modules/crce-restimpl-indexer/pom.xml +++ b/modules/crce-restimpl-indexer/pom.xml @@ -61,18 +61,11 @@ crce-core pom - - ${project.groupId} - crce-concurrency - 2.1.0-SNAPSHOT - jar - org.ow2.asm - asm-all - 5.0.3 + asm diff --git a/modules/crce-target/pom.xml b/modules/crce-target/pom.xml deleted file mode 100644 index 6b363eb3..00000000 --- a/modules/crce-target/pom.xml +++ /dev/null @@ -1,555 +0,0 @@ - - - - 4.0.0 - - - cz.zcu.kiv.crce - crce-modules-parent - 2.1.1-SNAPSHOT - - - crce-target - pom - - CRCE - Target - - - 3.0.3 - - - - - - org.ops4j.pax.runner - pax-runner - 1.9.0 - - - org.apache.maven - maven-aether-provider - - - org.apache.maven - maven-settings-builder - - - org.apache.maven.wagon - wagon-provider-api - - - org.apache.maven.wagon - wagon-http - - - org.eclipse.aether - aether-connector-basic - - - org.eclipse.aether - aether-spi - - - org.eclipse.aether - aether-transport-wagon - - - org.sonatype.plexus - plexus-cipher - - - - - - - - org.ops4j.pax.web - pax-web-extender-war - ${pax.version} - provided - - - org.ops4j.pax.web - pax-web-extender-whiteboard - ${pax.version} - provided - - - org.ops4j.pax.web - pax-web-jetty-bundle - ${pax.version} - provided - - - org.ops4j.pax.web - pax-web-api - ${pax.version} - provided - - - org.ops4j.pax.web - pax-web-jsp - ${pax.version} - provided - - - - org.ops4j.pax.web - pax-web-spi - ${pax.version} - provided - - - - org.ops4j.pax.logging - pax-logging-api - 1.8.2 - - - - - - - org.osgi - org.osgi.compendium - provided - - - - - - org.slf4j - osgi-over-slf4j - - - org.slf4j - log4j-over-slf4j - - - org.slf4j - jcl-over-slf4j - - - org.slf4j - jul-to-slf4j - - - ch.qos.logback - logback-core - - - ch.qos.logback - logback-classic - - - - - - - org.apache.felix - org.apache.felix.scr - provided - - - animal-sniffer-annotations - org.codehaus.mojo - - - - - org.apache.felix - org.apache.felix.dependencymanager - provided - - - org.apache.felix - org.apache.felix.dependencymanager.runtime - provided - - - org.apache.felix - org.apache.felix.dependencymanager.shell - provided - - - org.apache.felix - org.apache.felix.gogo.runtime - - - - - org.apache.felix - org.apache.felix.eventadmin - provided - - - org.apache.felix - org.apache.felix.bundlerepository - provided - - - easymock - org.easymock - - - - - org.apache.felix - org.apache.felix.configadmin - provided - - - org.apache.felix - org.apache.felix.shell - provided - - - org.apache.felix - org.apache.felix.fileinstall - provided - - - - - - cz.zcu.kiv.crce.wrapper - com.datumbox.lpsolve - 5.5.2.3 - provided - - - asm - asm-all - provided - - - org.ow2.asm - asm-all - provided - - 5.0.3 - - - org.apache.servicemix.bundles - org.apache.servicemix.bundles.jaxp-ri - - - org.apache.servicemix.bundles - org.apache.servicemix.bundles.bcel - provided - - - org.apache.servicemix.bundles - org.apache.servicemix.bundles.commons-vfs - provided - - - commons-logging - commons-logging - - - - - commons-fileupload - commons-fileupload - provided - - - commons-io - commons-io - provided - - - commons-beanutils - commons-beanutils - provided - - - commons-logging - commons-logging - - - - - org.apache.commons - commons-lang3 - provided - - - commons-logging - commons-logging - - - - - de.twentyeleven.skysail - org.json-osgi - provided - - - json - org.json - - - - - com.h2database - h2 - provided - - - org.apache.xbean - xbean-finder - 3.13 - provided - - - org.apache.xbean - xbean-asm-util - - - - - org.apache.xbean - xbean-bundleutils - 3.13 - provided - - - - org.mybatis - mybatis - provided - - - javax.ws.rs - javax.ws.rs-api - provided - - - org.glassfish.jersey.containers - jersey-container-servlet-core - provided - - - org.glassfish.jersey.media - jersey-media-multipart - provided - - - org.glassfish.jersey.media - jersey-media-json-jackson - provided - - - - javax.annotation - javax.annotation-api - 1.2 - provided - - - - org.mongodb - mongo-java-driver - provided - - - com.fasterxml.jackson.core - jackson-annotations - provided - - - com.fasterxml.jackson.core - jackson-core - provided - - - com.fasterxml.jackson.dataformat - jackson-dataformat-xml - provided - - - com.fasterxml.jackson.jaxrs - jackson-jaxrs-base - provided - - - com.fasterxml.jackson.module - jackson-module-jaxb-annotations - provided - - - com.fasterxml.jackson.jaxrs - jackson-jaxrs-xml-provider - provided - - - javax.xml.stream - stax-api - - - - - com.fasterxml.jackson.jaxrs - jackson-jaxrs-json-provider - provided - - - com.fasterxml.jackson.core - jackson-databind - provided - - - - - - ${project.groupId} - crce-core - pom - runtime - - - - ${project.groupId} - crce-compatibility-api - ${project.version} - runtime - - - ${project.groupId} - crce-compatibility-dao-api - ${project.version} - runtime - - - - - - ${project.groupId} - crce-metadata-osgi-bundle - ${project.version} - runtime - - - kxml2 - net.sf.kxml - - - org.apache.felix.utils - org.apache.felix - - - - - ${project.groupId} - crce-rest-v2 - ${project.version} - war - runtime - - - ${project.groupId} - crce-vo - ${project.version} - runtime - - - ${project.groupId} - crce-webui - ${project.version} - war - runtime - - - ${project.groupId} - crce-compatibility-dao-mongodb - ${project.version} - runtime - - - ${project.groupId} - crce-concurrency - ${project.version} - runtime - - - ${project.groupId} - crce-handler-metrics - ${project.version} - runtime - - - cz.zcu.kiv.crce - crce-optimizer-functions - ${project.version} - runtime - - - - - org.apache.felix.dependencymanager.annotation - org.apache.felix - jar - provided - - - classworlds - classworlds - - - maven-project - org.apache.maven - - - maven-artifact - org.apache.maven - - - plexus-utils - org.codehaus.plexus - - - json - org.json - - - maven-plugin-api - org.apache.maven - - - - - - - - - maven-assembly-plugin - 2.4 - - - create-target - package - - attached - - - - src/main/assembly/assembly.xml - - ${project.outputDirectory} - - - - - - - - \ No newline at end of file diff --git a/modules/crce-target/src/main/assembly/assembly.xml b/modules/crce-target/src/main/assembly/assembly.xml deleted file mode 100644 index 590988bc..00000000 --- a/modules/crce-target/src/main/assembly/assembly.xml +++ /dev/null @@ -1,113 +0,0 @@ - - - - distribution - - dir - zip - - crce - - - - .. - - README - - . - true - - - src/main/resources/conf/ - conf - - ** - - true - - - store - store - - ** - - true - - - ../conf.default - conf - - *.cfg - *.xml - - true - - - - - - src/main/resources/run.sh - 0777 - - - src/main/resources/run.bat - 0777 - - - src/main/resources/platform.properties - - - - - false - true - crce-bundles - runtime - - *:war:* - cz.zcu.kiv.crce:crce-core - org.apache.felix:org.apache.felix.utils - - - - false - true - crce-wars - runtime - - *:war:* - - - ${artifact.artifactId}.${artifact.extension} - - - - false - false - provided - required-bundles - - *:jar:* - - - org.ops4j.pax.runner:pax-runner - org.apache.felix:org.apache.felix.dependencymanager.annotation - com.google.code.findbugs:jsr305 - org.apache.tomcat.embed:* - - - - false - false - provided - - org.ops4j.pax.runner:pax-runner - - - ${artifact.artifactId}.${artifact.extension} - - - - diff --git a/modules/crce-target/src/main/resources/platform.properties b/modules/crce-target/src/main/resources/platform.properties deleted file mode 100644 index 181b038e..00000000 --- a/modules/crce-target/src/main/resources/platform.properties +++ /dev/null @@ -1,12 +0,0 @@ --Dorg.osgi.framework.bootdelegation=sun.*,com.sun.* --Dorg.osgi.service.http.port=8080 --Dorg.osgi.service.http.port.secure=8443 --Dorg.osgi.service.http.secure.enabled=false --Dfelix.fileinstall.bundles.new.start=false --Dfelix.fileinstall.poll=2000 --Dfelix.fileinstall.dir=conf --Dfelix.fileinstall.filter=.*\\.cfg --Dlogback.configurationFile=conf/logback.xml --Dorg.ops4j.pax.logging.DefaultServiceLog.level=WARN - -#-Dorg.apache.felix.http.nio=true diff --git a/modules/crce-target/src/main/resources/run.bat b/modules/crce-target/src/main/resources/run.bat deleted file mode 100644 index 525f861d..00000000 --- a/modules/crce-target/src/main/resources/run.bat +++ /dev/null @@ -1,8 +0,0 @@ -@ECHO OFF -IF EXIST .\sandbox GOTO START - -MKDIR .\sandbox\conf -COPY .\conf .\sandbox\conf - -:START -CALL java -jar pax-runner.jar --ups --workingDirectory=.\sandbox scan-dir:required-bundles scan-dir:crce-bundles war:file:crce-wars/crce-webui.war scan-bundle:file:crce-wars/crce-rest-v2.war scan-file:file:platform.properties %1 %2 %3 diff --git a/modules/crce-target/src/main/resources/run.sh b/modules/crce-target/src/main/resources/run.sh deleted file mode 100644 index 95887736..00000000 --- a/modules/crce-target/src/main/resources/run.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -if [ ! -d ./sandbox ]; then - mkdir ./sandbox - cp -r ./conf ./sandbox -fi -java -jar pax-runner.jar --ups --workingDirectory=./sandbox scan-dir:required-bundles scan-dir:crce-bundles war:file:crce-wars/crce-webui.war scan-bundle:file:crce-wars/crce-rest-v2.war scan-file:file:platform.properties diff --git a/modules/crce-vo/.classpath b/modules/crce-vo/.classpath new file mode 100644 index 00000000..83fc9ed7 --- /dev/null +++ b/modules/crce-vo/.classpath @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/crce-vo/.project b/modules/crce-vo/.project new file mode 100644 index 00000000..f1c272fb --- /dev/null +++ b/modules/crce-vo/.project @@ -0,0 +1,55 @@ + + + crce-vo + + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.fusesource.ide.project.RiderProjectBuilder + + + + + org.jboss.tools.jst.web.kb.kbbuilder + + + + + org.jboss.tools.cdi.core.cdibuilder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.pde.PluginNature + org.fusesource.ide.project.RiderProjectNature + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + org.eclipse.wst.common.project.facet.core.nature + org.jboss.tools.jst.web.kb.kbnature + org.jboss.tools.cdi.core.cdinature + + diff --git a/modules/crce-vo/pom.xml b/modules/crce-vo/pom.xml index b9dffd8e..f846240a 100644 --- a/modules/crce-vo/pom.xml +++ b/modules/crce-vo/pom.xml @@ -2,7 +2,19 @@ 4.0.0 - + + + + org.apache.maven.plugins + maven-compiler-plugin + + 10 + 10 + + + + + crce-modules-parent cz.zcu.kiv.crce @@ -18,25 +30,15 @@ ${namespace}.vo ${namespace}.vo - 3.0.0 + 3.0.1-SNAPSHOT - cz.zcu.kiv.crce - crce-metadata-api - ${crce.metadata.api.version} - - - cz.zcu.kiv.crce - crce-compatibility-api - ${project.version} - - - cz.zcu.kiv.crce - crce-metadata-service-api - 3.0.0 + ${project.groupId} + crce-core + pom @@ -75,6 +77,12 @@ test + + junit + junit + test + + diff --git a/modules/crce-vo/src/main/java/cz/zcu/kiv/crce/vo/service/MappingService.java b/modules/crce-vo/src/main/java/cz/zcu/kiv/crce/vo/service/MappingService.java index ad7643a6..9ee8e154 100644 --- a/modules/crce-vo/src/main/java/cz/zcu/kiv/crce/vo/service/MappingService.java +++ b/modules/crce-vo/src/main/java/cz/zcu/kiv/crce/vo/service/MappingService.java @@ -1,11 +1,5 @@ package cz.zcu.kiv.crce.vo.service; -import java.util.List; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; - import cz.zcu.kiv.crce.compatibility.Compatibility; import cz.zcu.kiv.crce.metadata.Requirement; import cz.zcu.kiv.crce.metadata.Resource; @@ -18,6 +12,11 @@ import cz.zcu.kiv.crce.vo.model.optimizer.CostFunctionDescriptorVO; import cz.zcu.kiv.crce.vo.model.optimizer.ResultOptimizerVO; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import javax.annotation.ParametersAreNonnullByDefault; +import java.util.List; + /** * * Service for mapping CRCE inner representation APIs into diff --git a/modules/crce-webservices-indexer/.classpath b/modules/crce-webservices-indexer/.classpath new file mode 100644 index 00000000..b8b4abe0 --- /dev/null +++ b/modules/crce-webservices-indexer/.classpath @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/crce-webservices-indexer/.project b/modules/crce-webservices-indexer/.project new file mode 100644 index 00000000..79478aee --- /dev/null +++ b/modules/crce-webservices-indexer/.project @@ -0,0 +1,30 @@ + + + crce-webservices-indexer + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.fusesource.ide.project.RiderProjectBuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.pde.PluginNature + org.fusesource.ide.project.RiderProjectNature + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/modules/crce-webservices-indexer/pom.xml b/modules/crce-webservices-indexer/pom.xml index 0f2ae495..b5d6e40d 100644 --- a/modules/crce-webservices-indexer/pom.xml +++ b/modules/crce-webservices-indexer/pom.xml @@ -1,6 +1,18 @@ 4.0.0 + + + + org.apache.maven.plugins + maven-compiler-plugin + + 10 + 10 + + + + ../pom @@ -43,8 +55,14 @@ ${project.groupId} crce-concurrency - 2.1.0-SNAPSHOT + 2.2.0-SNAPSHOT jar + + + + org.json + json + diff --git a/modules/crce-webui-v2/.classpath b/modules/crce-webui-v2/.classpath new file mode 100644 index 00000000..9b7de225 --- /dev/null +++ b/modules/crce-webui-v2/.classpath @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/crce-webui-v2/.project b/modules/crce-webui-v2/.project new file mode 100644 index 00000000..eac49f46 --- /dev/null +++ b/modules/crce-webui-v2/.project @@ -0,0 +1,56 @@ + + + crce-webui-v2 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.jboss.tools.jst.web.kb.kbbuilder + + + + + org.jboss.tools.cdi.core.cdibuilder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + org.fusesource.ide.project.RiderProjectBuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.fusesource.ide.project.RiderProjectNature + org.eclipse.pde.PluginNature + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + org.eclipse.wst.common.project.facet.core.nature + org.eclipse.wst.jsdt.core.jsNature + org.jboss.tools.jst.web.kb.kbnature + org.jboss.tools.cdi.core.cdinature + + diff --git a/modules/crce-webui-v2/README.md b/modules/crce-webui-v2/README.md new file mode 100644 index 00000000..ce4dfaa3 --- /dev/null +++ b/modules/crce-webui-v2/README.md @@ -0,0 +1,52 @@ +crce-webui-v2 +============== + +Template for a simple Vaadin application that only requires a Servlet 3.0 container to run. + + +Workflow +======== + +To compile the entire project, run "mvn install". + +To run the application, run "mvn jetty:run" and open http://localhost:8080/crce-webui . + +To produce a deployable production mode WAR: +- change productionMode to true in the servlet class configuration (nested in the UI class) +- run "mvn clean package" +- test the war file with "mvn jetty:run-war" + +Client-Side compilation +------------------------- + +The generated maven project is using an automatically generated widgetset by default. +When you add a dependency that needs client-side compilation, the maven plugin will +automatically generate it for you. Your own client-side customisations can be added into +package "client". + +Debugging client side code + - run "mvn vaadin:run-codeserver" on a separate console while the application is running + - activate Super Dev Mode in the debug window of the application + +Developing a theme using the runtime compiler +------------------------- + +When developing the theme, Vaadin can be configured to compile the SASS based +theme at runtime in the server. This way you can just modify the scss files in +your IDE and reload the browser to see changes. + +To use the runtime compilation, open pom.xml and comment out the compile-theme +goal from vaadin-maven-plugin configuration. To remove a possibly existing +pre-compiled theme, run "mvn clean package" once. + +When using the runtime compiler, running the application in the "run" mode +(rather than in "debug" mode) can speed up consecutive theme compilations +significantly. + +It is highly recommended to disable runtime compilation for production WAR files. + +Using Vaadin pre-releases +------------------------- + +If Vaadin pre-releases are not enabled by default, use the Maven parameter +"-P vaadin-prerelease" or change the activation default value of the profile in pom.xml . diff --git a/modules/crce-webui-v2/pom.xml b/modules/crce-webui-v2/pom.xml new file mode 100644 index 00000000..70f41790 --- /dev/null +++ b/modules/crce-webui-v2/pom.xml @@ -0,0 +1,237 @@ + + + 4.0.0 + + + ../pom + cz.zcu.kiv.crce + crce-modules-parent + 2.1.1-SNAPSHOT + + + crce-webui-v2 + war + 1.5 + CRCE - Web UI + + + + + CRCE - Web UI + ${namespace}.crce_webui_v2 + 7.7.10 + 7.7.10 + 9.3.9.v20160517 + UTF-8 + 10 + + + + local + + + + + vaadin-addons + http://maven.vaadin.com/vaadin-addons + + + + + + + com.vaadin + vaadin-bom + ${vaadin.version} + pom + import + + + + + + javax.servlet + javax.servlet-api + 3.0.1 + provided + + + com.vaadin + vaadin-server + + + com.vaadin + vaadin-push + + + com.vaadin + vaadin-client-compiled + + + com.vaadin + vaadin-themes + + + cz.zcu.kiv.crce + crce-metadata-osgi-bundle + 2.1.1-SNAPSHOT + bundle + + + cz.zcu.kiv.crce + crce-core + 3.0.0-SNAPSHOT + pom + + + cz.zcu.kiv.crce + crce-external-repository + 1.0 + bundle + + + cz.zcu.kiv.crce + crce-component-versioning + 1.0 + bundle + + + + + + + org.apache.maven.plugins + maven-war-plugin + + + false + + WEB-INF/classes/VAADIN/widgetsets/WEB-INF/** + + ${project.build.directory}/META-INF/MANIFEST.MF + + WEB-INF/classes + + + + + + com.vaadin + vaadin-maven-plugin + ${vaadin.plugin.version} + + + + update-theme + update-widgetset + compile + + compile-theme + + + + + + org.apache.maven.plugins + maven-clean-plugin + 3.0.0 + + + + + src/main/webapp/VAADIN/themes + + **/styles.css + **/styles.scss.cache + + + + + + + org.apache.felix + maven-bundle-plugin + + true + + + bundle-manifest + process-classes + + manifest + + + + + ${project.build.directory}/META-INF + + bundle + war + + + + * + + + cz.zcu.kiv.crce.crce_external_repository.api, + cz.zcu.kiv.crce.crce_component_versioning.api, + !${bundle.namespace}.internal.* + + ${bundle.namespace}.internal.Activator + ${project.artifactId} + + WEB-INF/classes + + crce-webui + crce-webui + <_wab>src/main/webapp + + + + + + + + + + vaadin-prerelease + + false + + + + vaadin-prereleases + http://maven.vaadin.com/vaadin-prereleases + + + vaadin-snapshots + https://oss.sonatype.org/content/repositories/vaadin-snapshots/ + + false + + + true + + + + + + vaadin-prereleases + http://maven.vaadin.com/vaadin-prereleases + + + vaadin-snapshots + https://oss.sonatype.org/content/repositories/vaadin-snapshots/ + + false + + + true + + + + + + diff --git a/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/internal/Activator.java b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/internal/Activator.java new file mode 100644 index 00000000..7c8dc49d --- /dev/null +++ b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/internal/Activator.java @@ -0,0 +1,178 @@ +package cz.zcu.kiv.crce.crce_webui_v2.internal; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +import javax.annotation.Nonnull; + +import org.apache.felix.dm.DependencyActivatorBase; +import org.apache.felix.dm.DependencyManager; +import org.osgi.framework.BundleContext; +import org.osgi.service.blueprint.container.ServiceUnavailableException; +import org.osgi.framework.InvalidSyntaxException; +import org.osgi.framework.ServiceReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.vaadin.server.WrappedSession; + +import cz.zcu.kiv.crce.compatibility.service.CompatibilitySearchService; +import cz.zcu.kiv.crce.metadata.MetadataFactory; +//import cz.zcu.kiv.crce.metadata.dao.ResourceDAO; +import cz.zcu.kiv.crce.metadata.dao.MetadataDao; +import cz.zcu.kiv.crce.metadata.service.MetadataService; +import cz.zcu.kiv.crce.plugin.PluginManager; +import cz.zcu.kiv.crce.repository.Buffer; +import cz.zcu.kiv.crce.repository.SessionRegister; +import cz.zcu.kiv.crce.repository.Store; + +public class Activator extends DependencyActivatorBase { + + private static final Logger logger = LoggerFactory.getLogger(Activator.class); + + private static volatile Activator instance; + + private volatile BundleContext bundleContext; + private volatile MetadataFactory metadataFactory; + //private volatile ResourceDAO resourceDAO; + private volatile MetadataDao metadataDao; + private volatile PluginManager pluginManager; + private volatile SessionRegister sessionRegister; + private volatile MetadataService metadataService; + private volatile CompatibilitySearchService compatibilityService; + + public static Activator instance() { + if (instance == null) { + throw new IllegalStateException("Activator instance is null."); + } + return instance; + } + + public PluginManager getPluginManager() { + return pluginManager; + } + + public SessionRegister getSessionRegister() { + if (sessionRegister == null) { + throw new IllegalStateException("sessionRegister is null."); + } + return sessionRegister; + } + + /*public ResourceDAO getResourceDAO() { + return resourceDAO; + }*/ + + public MetadataDao getMetadataDAO() { + return metadataDao; + } + + public MetadataFactory getMetadataFactory() { + return metadataFactory; + } + + @Nonnull + public Map getRepositories() { + Map stores = new HashMap<>(); + + Collection> serviceReferences; + try { + serviceReferences = bundleContext.getServiceReferences(Store.class, null); + } catch (InvalidSyntaxException e) { + logger.error("Invalid filter.", e); // this should not happen + return stores; + } + + if (serviceReferences == null) { + logger.trace("No stores found."); + return stores; + } + + for (ServiceReference serviceReference : serviceReferences) { + String id = (String) serviceReference.getProperty("id"); + String name = (String) serviceReference.getProperty("name"); + if (id != null) { + stores.put(id, name != null ? name : id); + } + } + + return stores; + } + + public Store getStore(String repositoryId) { + String filter = "(id=" + repositoryId + ")"; + + Collection> serviceReferences; + try { + serviceReferences = bundleContext.getServiceReferences(Store.class, filter); + } catch (InvalidSyntaxException ex) { + logger.error("Invalid filter: " + filter); + return null; + } + + if (serviceReferences == null || serviceReferences.isEmpty()) { + logger.warn("Store not found for repository ID: {}", repositoryId); + return null; + } + + if (serviceReferences.size() > 1) { + logger.warn("More than one stores found for repository ID: {}, using the first one.", repositoryId); + } + + return bundleContext.getService(serviceReferences.iterator().next()); + } + + public CompatibilitySearchService getCompatibilityService() { + if (compatibilityService != null) { + return compatibilityService; + } else { + throw new ServiceUnavailableException("This installation does not support compatibility services!", ""); + } + } + + public boolean isCompatibilityServicePresent() { + return compatibilityService != null; + } + + public Buffer getBuffer(WrappedSession wSes) { + if (wSes == null) { + return null; + } + + String sid = wSes.getId(); + return sessionRegister.getSessionData(sid).getBuffer(); + } + + /* + * public Buffer getBuffer(HttpServletRequest req) { if (req == null) { + * return null; } + * + * String sid = req.getSession(true).getId(); return + * sessionRegister.getSessionData(sid).getBuffer(); } + */ + + public MetadataService getMetadataService() { + return metadataService; + } + + @edu.umd.cs.findbugs.annotations.SuppressFBWarnings(value = "ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD", justification = "Workaround for providing DM components.") + @Override + public void init(BundleContext context, DependencyManager manager) throws Exception { + instance = this; + + manager.add(createComponent().setImplementation(this) + .add(createServiceDependency().setService(SessionRegister.class).setRequired(true)) + .add(createServiceDependency().setService(PluginManager.class).setRequired(true)) + .add(createServiceDependency().setService(MetadataFactory.class).setRequired(true)) + .add(createServiceDependency().setService(MetadataService.class).setRequired(true)) + .add(createServiceDependency().setService(CompatibilitySearchService.class).setRequired(false))); + + logger.debug("WebUI activator initialized."); + } + + @Override + public void destroy(BundleContext context, DependencyManager manager) throws Exception { + // nothing to do + } +} diff --git a/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/other/KeyWord.java b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/other/KeyWord.java new file mode 100644 index 00000000..5550eb74 --- /dev/null +++ b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/other/KeyWord.java @@ -0,0 +1,13 @@ +package cz.zcu.kiv.crce.crce_webui_v2.other; + +public class KeyWord { + private String keyWord; + + public KeyWord(String keyWord){ + this.keyWord = keyWord; + } + + public String getKeyWord() { + return keyWord; + } +} diff --git a/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/other/VersionInfo.java b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/other/VersionInfo.java new file mode 100644 index 00000000..c45f7222 --- /dev/null +++ b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/other/VersionInfo.java @@ -0,0 +1,46 @@ +package cz.zcu.kiv.crce.crce_webui_v2.other; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.vaadin.server.VaadinServlet; + +public class VersionInfo { + private static final Logger logger = LoggerFactory.getLogger(VersionInfo.class); + + private static final String MANIFEST = "/META-INF/MANIFEST.MF"; + private static final String PRODUCT_VERSION = "Bundle-Version"; + private static final String IMPLEMENTATION_BUILD = "Implementation-Build"; + private static final String UNKNOWN = "unknown"; + + private static VersionInfo instance = null; + private String productVersion; + private String buildRevision; + + public static synchronized VersionInfo getVersionInfo() { + if (instance == null) { + instance = new VersionInfo(); + Properties properties = new Properties(); + try (InputStream stream + = VaadinServlet.getCurrent().getServletContext().getResourceAsStream(MANIFEST)) { + properties.load(stream); + instance.productVersion = properties.getProperty(PRODUCT_VERSION); + instance.buildRevision = properties.getProperty(IMPLEMENTATION_BUILD); + } catch (IOException e) { + logger.error("Could not read version info from Manifest.", e); + } + } + return instance; + } + public String getProductVersion() { + return productVersion != null ? productVersion : UNKNOWN; + } + + public String getBuildRevision() { + return buildRevision != null ? buildRevision : UNKNOWN; + } +} diff --git a/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/outer/CentralMavenForm.java b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/outer/CentralMavenForm.java new file mode 100644 index 00000000..20a72ae4 --- /dev/null +++ b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/outer/CentralMavenForm.java @@ -0,0 +1,407 @@ +package cz.zcu.kiv.crce.crce_webui_v2.outer; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.List; + +import com.vaadin.data.util.BeanItemContainer; +import com.vaadin.server.FontAwesome; +import com.vaadin.server.Page; +import com.vaadin.shared.Position; +import com.vaadin.shared.ui.MarginInfo; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.FormLayout; +import com.vaadin.ui.Grid; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Label; +import com.vaadin.ui.NativeSelect; +import com.vaadin.ui.Notification; +import com.vaadin.ui.OptionGroup; +import com.vaadin.ui.Panel; +import com.vaadin.ui.TextField; +import com.vaadin.ui.Tree; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Grid.SelectionMode; +import com.vaadin.ui.themes.ValoTheme; + +import cz.zcu.kiv.crce.crce_external_repository.api.ArtifactTree; +import cz.zcu.kiv.crce.crce_external_repository.api.CentralMaven; +import cz.zcu.kiv.crce.crce_external_repository.api.ResultSearchArtifactTree; +import cz.zcu.kiv.crce.crce_external_repository.api.SettingsUrl; +import cz.zcu.kiv.crce.crce_webui_v2.internal.Activator; +import cz.zcu.kiv.crce.crce_webui_v2.repository.classes.ResourceBean; +import cz.zcu.kiv.crce.crce_webui_v2.repository.services.ResourceService; +import cz.zcu.kiv.crce.crce_webui_v2.webui.MyUI; +import cz.zcu.kiv.crce.repository.RefusedArtifactException; + +@SuppressWarnings("serial") +public class CentralMavenForm extends FormLayout { + private Label caption = new Label("Central Maven repository"); + private Panel formPanel = new Panel("Content"); + private TextField group = new TextField("Group Id"); + private TextField artifact = new TextField("Artifact Id"); + private TextField version = new TextField("Version"); + private TextField packaging = new TextField("Packaging"); + private OptionGroup directIndexOption = new OptionGroup("Direct or search index"); + private NativeSelect rangeOption = new NativeSelect("Range"); + private Button searchButton = new Button("Search"); + private Button clearButton = new Button("Clear"); + private Label notFound = new Label("No artifact found"); + private Panel treePanel = new Panel("Result list"); + private Button uploadButton = new Button("Upload"); + private Tree tree = new Tree(); + private VerticalLayout bufferLayout = new VerticalLayout(); + private Panel bufferPanel = new Panel("Buffer"); + private Grid bufferGrid = new Grid(); + private ResourceService resourceService; + + public CentralMavenForm() { + HorizontalLayout content = new HorizontalLayout(); + addComponent(content); + } + + public CentralMavenForm(MyUI myUI) { + VerticalLayout userForm = new VerticalLayout(); + HorizontalLayout versionLayout = new HorizontalLayout(); + VerticalLayout formPanelButtonLayout = new VerticalLayout(); + HorizontalLayout contentForm = new HorizontalLayout(); + VerticalLayout content = new VerticalLayout(); + + caption.addStyleName(ValoTheme.LABEL_BOLD); + + group.setWidth("250px"); + artifact.setWidth("250px"); + + directIndexOption.addItems("Direct", "Index"); + directIndexOption.setValue("Direct"); + + if (myUI.getSession().getAttribute("mavenIndex") == null + || myUI.getSession().getAttribute("settingsUrl") != null + && ((SettingsUrl) myUI.getSession().getAttribute("settingsUrl")).isEnableGroupSearch()) { + directIndexOption.setItemEnabled("Index", false); + directIndexOption.setDescription( + "The central maven repository index is not created or it is allowed to search only by group. Check the settings menu"); + } + + group.setRequired(true); + group.setRequiredError("The item can not be empty!"); + + if (myUI.getSession().getAttribute("settingsUrl") == null + || !((SettingsUrl) myUI.getSession().getAttribute("settingsUrl")).isEnableGroupSearch()) { + artifact.setRequired(true); + artifact.setRequiredError("The item can not be empty!"); + version.setRequired(true); + version.setRequiredError("The item can not be empty!"); + packaging.setRequired(true); + packaging.setRequiredError("The item can not be empty!"); + } + + rangeOption.addItem("<="); + rangeOption.addItem("="); + rangeOption.addItem(">="); + rangeOption.select("="); + rangeOption.setNullSelectionAllowed(false); + rangeOption.setEnabled(false); + + versionLayout.addComponents(version, rangeOption); + versionLayout.setSpacing(true); + + searchButton.setStyleName(ValoTheme.BUTTON_PRIMARY); + + HorizontalLayout buttons = new HorizontalLayout(searchButton, clearButton); + buttons.setSpacing(true); + userForm.addComponents(group, artifact, versionLayout, packaging, directIndexOption, buttons); + userForm.setSpacing(true); + + treePanel.setWidth("600px"); + treePanel.setHeight("380px"); + + contentForm.addComponent(userForm); + contentForm.setMargin(true); + formPanel.setContent(contentForm); + formPanel.setHeight("570px"); + + resourceService = new ResourceService(Activator.instance().getMetadataService()); + List resourceBeanList = resourceService.getAllResourceBeanFromBuffer(myUI.getSession().getSession()); + + HorizontalLayout bufferPanelLayout = new HorizontalLayout(); + bufferGrid.setContainerDataSource(new BeanItemContainer<>(ResourceBean.class, resourceBeanList)); + bufferGrid.getColumn("resource").setHidden(true); + bufferGrid.getColumn("size").setHidden(true); + bufferGrid.setColumnOrder("presentationName", "symbolicName", "version", "categories"); + bufferGrid.addStyleName("my-style"); + bufferGrid.setSelectionMode(SelectionMode.NONE); + bufferLayout.addComponent(bufferGrid); + bufferGrid.setSizeFull(); + bufferPanelLayout.setSizeFull(); + bufferPanelLayout.addComponent(bufferLayout); + bufferPanelLayout.setExpandRatio(bufferLayout, 1); + bufferPanel.setContent(bufferPanelLayout); + + if(!resourceBeanList.isEmpty()) { + bufferPanel.setVisible(true); + } + else { + bufferPanel.setVisible(false); + } + + // Add tree + searchButton.addClickListener(e -> { + // clear tree + tree.removeAllItems(); // no function tree.clear(); + // erasing any previous components shown + if (contentForm.getComponentIndex(formPanelButtonLayout) != -1) { + contentForm.removeComponent(formPanelButtonLayout); + } + // check filling form + if (myUI.getSession().getAttribute("settingsUrl") == null + && (group.getValue().trim().isEmpty() || artifact.getValue().trim().isEmpty() + || version.getValue().trim().isEmpty() || packaging.getValue().trim().isEmpty())) { + Notification notif = new Notification("Incomplete assignment!", Notification.Type.WARNING_MESSAGE); + notif.setDelayMsec(5000); + notif.show(Page.getCurrent()); + } else if (myUI.getSession().getAttribute("settingsUrl") != null + && !((SettingsUrl) myUI.getSession().getAttribute("settingsUrl")).isEnableGroupSearch() + && (group.getValue().trim().isEmpty() || artifact.getValue().trim().isEmpty() + || version.getValue().trim().isEmpty() || packaging.getValue().trim().isEmpty())) { + Notification notif = new Notification("Incomplete assignment!", Notification.Type.WARNING_MESSAGE); + notif.setDelayMsec(5000); + notif.show(Page.getCurrent()); + } else if (myUI.getSession().getAttribute("settingsUrl") != null + && ((SettingsUrl) myUI.getSession().getAttribute("settingsUrl")).isEnableGroupSearch() + && group.getValue().trim().isEmpty()) { + Notification notif = new Notification("Incomplete assignment!", Notification.Type.WARNING_MESSAGE); + notif.setDelayMsec(5000); + notif.show(Page.getCurrent()); + } else { + // check exist component from central Maven repository + if (directIndexOption.getValue().equals("Direct")) { + ResultSearchArtifactTree artifactList = new CentralMaven( + (SettingsUrl) myUI.getSession().getAttribute("settingsUrl")).getArtifactTree( + group.getValue(), artifact.getValue(), version.getValue(), packaging.getValue(), + directIndexOption.getValue(), null); + if (artifactList.getArtifactTreeList() != null && artifactList.getStatus().equals("direct")) { + ArtifactTree artifactTree = artifactList.getArtifactTreeList().get(0); + String[] pom = artifactTree.getGroupId().split("\\."); + tree.addItem(pom[0]); + for (int i = 1; i < pom.length; i++) { + tree.addItem(pom[i]); + tree.setParent(pom[i], pom[i - 1]); + } + // addArtifactToTree(artifactTree, pom[pom.length - 1]); + addArtifactToTree(artifactTree.getUrl(), artifactTree.getGroupId(), + artifactTree.getArtefactId(), artifactTree.getVersions().get(0), + artifactTree.getPackaging(), pom[pom.length - 1]); + + // for margin + HorizontalLayout treePanelLayout = new HorizontalLayout(); + treePanelLayout.addComponent(tree); + treePanelLayout.setMargin(true); + treePanel.setContent(treePanelLayout); + formPanelButtonLayout.addComponents(treePanel, uploadButton); + formPanelButtonLayout.setMargin(new MarginInfo(false, true)); + formPanelButtonLayout.setSpacing(true); + formPanelButtonLayout.setComponentAlignment(uploadButton, Alignment.BOTTOM_CENTER); + uploadButton.setVisible(false); + } else if (artifactList.getArtifactTreeList() != null && artifactList.getStatus().equals("group")) { + for (ArtifactTree artifactTree : artifactList.getArtifactTreeList()) { + String[] pom = artifactTree.getGroupId().split("/"); + String uniqueItemChildren, uniqueItemParent = "/"; + + /* + * for central maven2 url - the correct is the listing over all items, but in + * this case the first is empty and the second is maven2 + */ + for (int i = 2; i < pom.length; i++) { + uniqueItemChildren = uniqueItemParent + pom[i] + "/"; + if (tree.getItem(uniqueItemChildren) == null) { + tree.addItem(uniqueItemChildren); + tree.setItemCaption(uniqueItemChildren, pom[i]); + tree.setParent(uniqueItemChildren, uniqueItemParent); + } + uniqueItemParent = uniqueItemChildren; + } + addArtefactToTreeGroup(artifactTree, uniqueItemParent); + } + // for margin + HorizontalLayout treePanelLayout = new HorizontalLayout(); + treePanelLayout.addComponent(tree); + treePanelLayout.setMargin(true); + treePanel.setContent(treePanelLayout); + formPanelButtonLayout.addComponents(treePanel, uploadButton); + //formPanelButtonLayout.setMargin(true); + formPanelButtonLayout.setSpacing(true); + formPanelButtonLayout.setComponentAlignment(uploadButton, Alignment.BOTTOM_CENTER); + uploadButton.setVisible(false); + } else { + // for margin + HorizontalLayout treePanelLayout = new HorizontalLayout(); + treePanelLayout.addComponent(notFound); + treePanelLayout.setMargin(true); + treePanel.setContent(treePanelLayout); + formPanelButtonLayout.addComponents(treePanel); + formPanelButtonLayout.setMargin(new MarginInfo(false, true)); + } + } + // index search + else if (group.getValue().charAt(0) == '*' || group.getValue().charAt(0) == '?' + || artifact.getValue().charAt(0) == '*' || artifact.getValue().charAt(0) == '?') { + Notification notif = new Notification("Can not start a search term with '*' or '?'", + Notification.Type.WARNING_MESSAGE); + notif.setDelayMsec(5000); + notif.show(Page.getCurrent()); + } else { + ResultSearchArtifactTree artifactList = new CentralMaven( + (SettingsUrl) myUI.getSession().getAttribute("settingsUrl")).getArtifactTree( + group.getValue(), artifact.getValue(), version.getValue(), packaging.getValue(), + directIndexOption.getValue(), rangeOption.getValue().toString()); + if (artifactList.getStatus().equals("found")) { + for (ArtifactTree artifactTree : artifactList.getArtifactTreeList()) { + String[] pom = artifactTree.getGroupId().split("\\."); + tree.addItem(pom[0]); + for (int i = 1; i < pom.length; i++) { + tree.addItem(pom[i]); + tree.setParent(pom[i], pom[i - 1]); + } + for (String s : artifactTree.getVersions()) { + addArtifactToTree(artifactTree.getUrl(), artifactTree.getGroupId(), + artifactTree.getArtefactId(), s, artifactTree.getPackaging(), + pom[pom.length - 1]); + } + } + // for margin + HorizontalLayout treePanelLayout = new HorizontalLayout(); + treePanelLayout.addComponent(tree); + treePanelLayout.setMargin(true); + treePanel.setContent(treePanelLayout); + formPanelButtonLayout.addComponents(treePanel, uploadButton); + formPanelButtonLayout.setMargin(new MarginInfo(false, true)); + formPanelButtonLayout.setSpacing(true); + formPanelButtonLayout.setComponentAlignment(uploadButton, Alignment.BOTTOM_CENTER); + uploadButton.setVisible(false); + } else if (artifactList.getStatus().equals("notfound")) { + HorizontalLayout treePanelLayout = new HorizontalLayout(); + treePanelLayout.addComponent(notFound); + treePanelLayout.setMargin(true); + treePanel.setContent(treePanelLayout); + formPanelButtonLayout.addComponents(treePanel); + formPanelButtonLayout.setMargin(new MarginInfo(false, true)); + } + } + } + contentForm.addComponent(formPanelButtonLayout); + contentForm.setSpacing(true); + }); + + tree.addCollapseListener(e -> { + uploadButton.setVisible(false); + }); + + tree.addExpandListener(e -> { + uploadButton.setVisible(true); + }); + + uploadButton.addClickListener(e -> { + if (tree.getValue() != null && !(tree.areChildrenAllowed((Object) tree.getValue()))) { + File file; + try { + URL url = new URL(tree.getValue().toString()); + file = new File(url.toString()); + InputStream input = url.openStream(); + Activator.instance().getBuffer(myUI.getSession().getSession()).put(file.getName(), input); + bufferLayout.removeComponent(bufferGrid); + bufferGrid.setContainerDataSource(new BeanItemContainer<>(ResourceBean.class, + resourceService.getAllResourceBeanFromBuffer(myUI.getSession().getSession()))); + bufferLayout.addComponent(bufferGrid); + bufferPanel.setVisible(true); + Notification notif = new Notification("Info", "Artefact from central maven upload sucess", + Notification.Type.ASSISTIVE_NOTIFICATION); + notif.setPosition(Position.TOP_RIGHT); + notif.show(Page.getCurrent()); + } catch (IOException | RefusedArtifactException ex) { + new Notification("Could not open or load file from url", ex.getMessage(), + Notification.Type.ERROR_MESSAGE).show(Page.getCurrent()); + } + } else { + new Notification("No artefact selected", Notification.Type.WARNING_MESSAGE).show(Page.getCurrent()); + } + }); + + directIndexOption.addValueChangeListener(e -> { + if (directIndexOption.getValue().equals("Direct")) { + rangeOption.setEnabled(false); + } else { + rangeOption.setEnabled(true); + } + }); + + // Clear user form + clearButton.addClickListener(e -> { + formPanelButtonLayout.removeAllComponents(); + contentForm.removeAllComponents(); + group.clear(); + artifact.clear(); + version.clear(); + packaging.clear(); + tree.removeAllItems(); + contentForm.addComponent(userForm); + }); + + + content.addComponents(caption, formPanel, bufferPanel); + content.setSpacing(true); + content.setMargin(new MarginInfo(false, true)); + + addComponent(content); + } + + private void addArtifactToTree(String url, String group, String artifact, String version, String packaging, + String parent) { + String uniqueVersion = artifact + version; + + tree.addItem(artifact); + tree.setParent(artifact, parent); + tree.addItem(uniqueVersion); + tree.setItemCaption(uniqueVersion, version); + tree.setParent(uniqueVersion, artifact); + + // konečný artefact je komplet url link např. pro wget - UPRAVIT DLE + // POTŘEBY + String artifactText = url + group.replace('.', '/') + "/" + artifact + "/" + version + "/" + artifact + "-" + + version + "." + packaging; + + tree.addItem(artifactText); + tree.setParent(artifactText, uniqueVersion); + tree.setItemCaption(artifactText, artifact + "-" + version + "." + packaging); + tree.setChildrenAllowed(artifactText, false); + if (packaging.equals("jar") || packaging.equals("war")) { + tree.setItemIcon(artifactText, FontAwesome.GIFT); + } else if (packaging.equals("xml") || packaging.equals("pom")) { + tree.setItemIcon(artifactText, FontAwesome.CODE); + } else { + tree.setItemIcon(artifactText, FontAwesome.FILE); + } + } + + private void addArtefactToTreeGroup(ArtifactTree artifactTree, String parent) { + // konečný artefact je komplet url link např. pro wget - UPRAVIT DLE + // POTŘEBY + String artifactText = artifactTree.getArtefactId(); + String artifactUrl = artifactTree.getUrl(); + + tree.addItem(artifactUrl); + tree.setParent(artifactUrl, parent); + tree.setItemCaption(artifactUrl, artifactText); + tree.setChildrenAllowed(artifactUrl, false); + if (artifactTree.getPackaging().equals("jar") || artifactTree.getPackaging().equals("war")) { + tree.setItemIcon(artifactUrl, FontAwesome.GIFT); + } else if (artifactTree.getPackaging().equals("xml") || artifactTree.getPackaging().equals("pom")) { + tree.setItemIcon(artifactUrl, FontAwesome.CODE); + } else { + tree.setItemIcon(artifactUrl, FontAwesome.FILE); + } + } +} diff --git a/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/outer/CheckMavenIndexForm.java b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/outer/CheckMavenIndexForm.java new file mode 100644 index 00000000..0831e4fd --- /dev/null +++ b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/outer/CheckMavenIndexForm.java @@ -0,0 +1,82 @@ +package cz.zcu.kiv.crce.crce_webui_v2.outer; + +import com.vaadin.server.VaadinSession; +import com.vaadin.ui.Button; +import com.vaadin.ui.FormLayout; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Label; +import com.vaadin.ui.ProgressBar; +import com.vaadin.ui.VerticalLayout; + +import cz.zcu.kiv.crce.crce_external_repository.api.MavenIndex; +import cz.zcu.kiv.crce.crce_external_repository.api.SettingsUrl; +import cz.zcu.kiv.crce.crce_webui_v2.webui.MyUI; + +@SuppressWarnings("serial") +public class CheckMavenIndexForm extends FormLayout { + private Button checkButton = new Button("Check index"); + private ProgressBar bar = new ProgressBar(); + private Label statusLabel = new Label("This might take a while on first run, so please be patient!"); + private MyUI myUI; + private String result; + + public CheckMavenIndexForm(MyUI myUI) { + this.myUI = myUI; + VerticalLayout content = new VerticalLayout(); + HorizontalLayout progressLayout = new HorizontalLayout(); + bar.setVisible(false); + + checkButton.addClickListener(e -> { + statusLabel.setValue("Please waiting..."); + checkButton.setEnabled(false); + bar.setIndeterminate(true); + bar.setVisible(true); + new HelperIndexingThread(myUI.getSession()).start(); + }); + + progressLayout.addComponents(checkButton, bar); + progressLayout.setSpacing(true); + content.addComponents(statusLabel, progressLayout); + content.setSpacing(true); + addComponent(content); + } + + class HelperIndexingThread extends Thread { + VaadinSession session; + public HelperIndexingThread(VaadinSession session){ + this.session = session; + } + public void run() { + try { + MavenIndex check = new MavenIndex(); + result = check.checkIndex((SettingsUrl)session.getAttribute("settingsUrl")); + } catch (Exception e) { + e.printStackTrace(); + } finally { + myUI.access(() -> checkButton.setEnabled(true)); + myUI.access(() -> bar.setVisible(false)); + myUI.access(() -> bar.setIndeterminate(false)); + if (result != null) { + myUI.access(() -> statusLabel.setValue(result)); + session.setAttribute("mavenIndex", true); + } + else{ + myUI.access(() -> statusLabel.setValue("Error when creating index!")); + } + } + // Inform that we have stopped running + + /*// Another way without using lambda expressions + myUI.access(new Runnable() { + @Override + public void run() { + statusLabel.setValue("Done!"); + checkButton.setEnabled(true); + bar.setIndeterminate(false); + bar.setVisible(false); + } + });*/ + + } + } +} diff --git a/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/outer/DefinedMavenForm.java b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/outer/DefinedMavenForm.java new file mode 100644 index 00000000..7bac9e32 --- /dev/null +++ b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/outer/DefinedMavenForm.java @@ -0,0 +1,358 @@ +package cz.zcu.kiv.crce.crce_webui_v2.outer; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.StandardOpenOption; +import java.util.List; + +import com.vaadin.data.util.BeanItemContainer; +import com.vaadin.server.FontAwesome; +import com.vaadin.server.Page; +import com.vaadin.shared.Position; +import com.vaadin.shared.ui.MarginInfo; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.CssLayout; +import com.vaadin.ui.FormLayout; +import com.vaadin.ui.Grid; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Label; +import com.vaadin.ui.Notification; +import com.vaadin.ui.Panel; +import com.vaadin.ui.TextField; +import com.vaadin.ui.Tree; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Grid.SelectionMode; +import com.vaadin.ui.themes.ValoTheme; + +import cz.zcu.kiv.crce.crce_external_repository.api.ArtifactTree; +import cz.zcu.kiv.crce.crce_external_repository.api.DefinedMaven; +import cz.zcu.kiv.crce.crce_external_repository.api.SettingsUrl; +import cz.zcu.kiv.crce.crce_webui_v2.internal.Activator; +import cz.zcu.kiv.crce.crce_webui_v2.repository.classes.ResourceBean; +import cz.zcu.kiv.crce.crce_webui_v2.repository.services.ResourceService; +import cz.zcu.kiv.crce.crce_webui_v2.webui.MyUI; +import cz.zcu.kiv.crce.repository.RefusedArtifactException; + +public class DefinedMavenForm extends FormLayout{ + private static final long serialVersionUID = 4172878715304331198L; + private transient DefinedMaven definedMaven; + private Panel formPanel = new Panel("Content"); + private TextField definedUrl = new TextField(); + private Label caption = new Label("Defined Maven repository"); + private TextField group = new TextField("Group Id"); + private TextField artifact = new TextField("Artifact Id"); + private TextField version = new TextField("Version"); + private TextField packaging = new TextField("Packaging"); + private Button searchButton = new Button("Search"); + private Button clearButton = new Button("Clear"); + private Button uploadButton = new Button("Upload"); + private Button resolveButton = new Button("Resolve"); + private Panel treePanel = new Panel("Result list"); + private Label notFound = new Label("No artifact found"); + private Tree tree; + private VerticalLayout bufferLayout = new VerticalLayout(); + private Panel bufferPanel = new Panel("Buffer"); + private Grid bufferGrid = new Grid(); + private ResourceService resourceService; + + public DefinedMavenForm() { + HorizontalLayout content = new HorizontalLayout(); + addComponent(content); + } + + public DefinedMavenForm(MyUI myUI) { + if (myUI.getSession().getAttribute("settingsUrl") == null) { + SettingsUrl settings = new SettingsUrl(); + definedUrl.setValue(settings.getExternalAetherUrl()); + } else { + definedUrl.setValue(((SettingsUrl) myUI.getSession().getAttribute("settingsUrl")).getExternalAetherUrl()); + } + + VerticalLayout fieldLayout = new VerticalLayout(); + HorizontalLayout treePanelLayout = new HorizontalLayout(); + VerticalLayout treePanelButtonLayout = new VerticalLayout(); + HorizontalLayout buttonUploadResolveLayout = new HorizontalLayout(); + HorizontalLayout treeLayout = new HorizontalLayout(); + VerticalLayout formLayout = new VerticalLayout(); + HorizontalLayout contentForm = new HorizontalLayout(); + VerticalLayout content = new VerticalLayout(); + + caption.addStyleName(ValoTheme.LABEL_BOLD); + + definedUrl.setWidth("450px"); + + group.setRequired(true); + group.setRequiredError("The item can not be empty!"); + artifact.setRequired(true); + artifact.setRequiredError("The item can not be empty!"); + packaging.setRequired(true); + packaging.setRequiredError("The item can not be empty!"); + + searchButton.setStyleName(ValoTheme.BUTTON_PRIMARY); + + HorizontalLayout buttonsSearchClearLayout = new HorizontalLayout(searchButton, clearButton); + buttonsSearchClearLayout.setSpacing(true); + + Button setUrl = new Button("Set"); + CssLayout definedCss = new CssLayout(); + definedCss.setStyleName(ValoTheme.LAYOUT_COMPONENT_GROUP); + definedCss.addComponents(definedUrl, setUrl); + + fieldLayout.addComponents(group, artifact, version, packaging, buttonsSearchClearLayout); + fieldLayout.setSpacing(true); + fieldLayout.setMargin(new MarginInfo(false, true, false, false)); + + treeLayout.setMargin(true); + treePanel.setContent(treeLayout); + treePanel.setWidth("600px"); + treePanel.setHeight("283px"); + treePanel.setVisible(false); + buttonUploadResolveLayout.setVisible(false); + + buttonUploadResolveLayout.addComponents(resolveButton, uploadButton); + buttonUploadResolveLayout.setSpacing(true); + + treePanelButtonLayout.addComponents(treePanel, buttonUploadResolveLayout); + treePanelButtonLayout.setSpacing(true); + treePanelButtonLayout.setComponentAlignment(buttonUploadResolveLayout, Alignment.BOTTOM_CENTER); + + treePanelLayout.addComponents(fieldLayout, treePanelButtonLayout); + treePanelLayout.setSpacing(true); + + formLayout.addComponents(definedCss, treePanelLayout); + formLayout.setSpacing(true); + formLayout.setMargin(true); + formLayout.addComponents(definedCss, treePanelLayout); + + formPanel.setContent(formLayout); + formPanel.setHeight("500px"); + + contentForm.addComponents(formPanel); + + resourceService = new ResourceService(Activator.instance().getMetadataService()); + List resourceBeanList = resourceService.getAllResourceBeanFromBuffer(myUI.getSession().getSession()); + + HorizontalLayout bufferPanelLayout = new HorizontalLayout(); + bufferGrid.setContainerDataSource(new BeanItemContainer<>(ResourceBean.class, resourceBeanList)); + bufferGrid.getColumn("resource").setHidden(true); + bufferGrid.getColumn("size").setHidden(true); + bufferGrid.setColumnOrder("presentationName", "symbolicName", "version", "categories"); + bufferGrid.addStyleName("my-style"); + bufferGrid.setSelectionMode(SelectionMode.NONE); + bufferLayout.addComponent(bufferGrid); + bufferGrid.setSizeFull(); + bufferPanelLayout.setSizeFull(); + bufferPanelLayout.addComponent(bufferLayout); + bufferPanelLayout.setExpandRatio(bufferLayout, 1); + bufferPanel.setContent(bufferPanelLayout); + + if(!resourceBeanList.isEmpty()) { + bufferPanel.setVisible(true); + } + else { + bufferPanel.setVisible(false); + } + + content.addComponents(caption, contentForm, bufferPanel); + + contentForm.setSpacing(true); + contentForm.setSizeFull(); + content.setSpacing(true); + content.setMargin(new MarginInfo(false, true)); + + // Setting url defined repository + setUrl.addClickListener(e -> { + SettingsUrl settings; + if (myUI.getSession().getAttribute("settingsUrl") == null) { + settings = new SettingsUrl(); + settings.setExternalAetherUrl(definedUrl.getValue()); + getSession().setAttribute("settingsUrl", settings); + } else { + settings = (SettingsUrl) myUI.getSession().getAttribute("settingsUrl"); + settings.setExternalAetherUrl(definedUrl.getValue()); + getSession().setAttribute("settingsUrl", settings); + } + }); + + // clear form + clearButton.addClickListener(e -> { + group.clear(); + artifact.clear(); + version.clear(); + packaging.clear(); + // packaging.select(TypePackaging.jar); + // erasing any previous components shown + if (treeLayout.getComponentIndex(notFound) != -1) { + treeLayout.removeComponent(notFound); + } + if (treeLayout.getComponentIndex(tree) != -1) { + treeLayout.removeComponent(tree); + } + treePanel.setVisible(false); + buttonUploadResolveLayout.setVisible(false); + }); + + // search artefact from defined repository + searchButton.addClickListener(e1 -> { + if (group.getValue().trim().isEmpty() || artifact.getValue().trim().isEmpty() + || packaging.getValue().trim().isEmpty()) { + Notification notif = new Notification("Incomplete assignment!", Notification.Type.WARNING_MESSAGE); + notif.setDelayMsec(5000); + notif.show(Page.getCurrent()); + } else { + SettingsUrl settings; + if (myUI.getSession().getAttribute("settingsUrl") == null) { + settings = new SettingsUrl(); + } else { + settings = (SettingsUrl) myUI.getSession().getAttribute("settingsUrl"); + } + // erasing any previous components shown + if (treeLayout.getComponentIndex(notFound) != -1) { + treeLayout.removeComponent(notFound); + } + if (treeLayout.getComponentIndex(tree) != -1) { + treeLayout.removeComponent(tree); + } + + // předání hodnot + definedMaven = new DefinedMaven(settings); + ArtifactTree definedArtefact = definedMaven.getArtifact(group.getValue(), artifact.getValue(), + version.getValue(), packaging.getValue()); + if (definedArtefact == null) { + treeLayout.addComponent(notFound); + } else { + tree = new Tree(); + String[] pom = definedArtefact.getGroupId().split("\\."); + tree.addItem(pom[0]); + for (int i = 1; i < pom.length; i++) { + tree.addItem(pom[i]); + tree.setParent(pom[i], pom[i - 1]); + } + + if (definedArtefact.getVersions().size() > 1) { + for (String s : definedArtefact.getVersions()) { + addArtefactToTree(definedArtefact.getGroupId(), definedArtefact.getArtefactId(), s, + definedArtefact.getPackaging(), pom[pom.length - 1]); + } + } else { + addArtefactToTree(definedArtefact.getGroupId(), definedArtefact.getArtefactId(), + definedArtefact.getVersions().get(0), definedArtefact.getPackaging(), + pom[pom.length - 1]); + } + + tree.addExpandListener(e2 -> { + buttonUploadResolveLayout.setVisible(true); + }); + + tree.addCollapseListener(e3 -> { + buttonUploadResolveLayout.setVisible(false); + }); + + treeLayout.addComponent(tree); + } + treePanel.setVisible(true); + } + }); + + uploadButton.addClickListener(e -> { + SettingsUrl settings; + if (myUI.getSession().getAttribute("settingsUrl") == null) { + settings = new SettingsUrl(); + } else { + settings = (SettingsUrl) myUI.getSession().getAttribute("settingsUrl"); + } + // First check the artifact storage in the local repository + if (tree.getValue() != null && tree.getValue().toString().contains(":")) { + String artifactText = tree.getValue().toString(); + if (DefinedMaven.resolveArtifact(artifactText, settings)) { + File file = new File(settings.getLocalAetherUrl() + "/" + + artifactText.split(":")[0].replace('.', '/') + "/" + artifactText.split(":")[1] + "/" + + artifactText.split(":")[2] + "/" + artifactText.split(":")[1] + "-" + + artifactText.split(":")[2] + "." + artifactText.split(":")[3]); + try { + InputStream is = Files.newInputStream(file.toPath(), StandardOpenOption.READ); + try { + Activator.instance().getBuffer(myUI.getSession().getSession()).put(file.getName(), is); + bufferLayout.removeComponent(bufferGrid); + bufferGrid.setContainerDataSource(new BeanItemContainer<>(ResourceBean.class, + resourceService.getAllResourceBeanFromBuffer(myUI.getSession().getSession()))); + bufferLayout.addComponent(bufferGrid); + bufferPanel.setVisible(true); + Notification notif = new Notification("Info", "Artifact to buffer upload sucess", + Notification.Type.ASSISTIVE_NOTIFICATION); + notif.setPosition(Position.TOP_RIGHT); + notif.show(Page.getCurrent()); + } finally { + is.close(); + } + } catch (IOException | RefusedArtifactException ex) { + new Notification("Could not open file", ex.getMessage(), Notification.Type.ERROR_MESSAGE) + .show(Page.getCurrent()); + } + } else { + new Notification("Problem with resolving artifact", Notification.Type.WARNING_MESSAGE) + .show(Page.getCurrent()); + } + } else { + new Notification("No artefact selected", Notification.Type.WARNING_MESSAGE).show(Page.getCurrent()); + } + }); + + resolveButton.addClickListener(e -> { + SettingsUrl settings; + if (myUI.getSession().getAttribute("settingsUrl") == null) { + settings = new SettingsUrl(); + } else { + settings = (SettingsUrl) myUI.getSession().getAttribute("settingsUrl"); + } + // First check the artifact storage in the local repository + if (tree.getValue() != null && tree.getValue().toString().contains(":")) { + String artifactText = tree.getValue().toString(); + if (DefinedMaven.resolveArtifact(artifactText, settings)) { + Notification notif = new Notification("Info", "Artefact sucess resolved to Maven local repository.", + Notification.Type.ASSISTIVE_NOTIFICATION); + notif.setPosition(Position.TOP_RIGHT); + notif.show(Page.getCurrent()); + } else { + new Notification("Problem with resolving artifact", Notification.Type.WARNING_MESSAGE) + .show(Page.getCurrent()); + } + } else { + new Notification("No artefact selected", Notification.Type.WARNING_MESSAGE).show(Page.getCurrent()); + } + }); + + addComponent(content); + } + + private void addArtefactToTree(String group, String artifact, String version, String packaging, String parent) { + tree.addItem(artifact); + tree.setParent(artifact, parent); + tree.addItem(version); + tree.setParent(version, artifact); + + // konečný artefact je komplet url link např. pro wget - UPRAVIT DLE + // POTŘEBY + /* + * String artifactText = settings.getExternalAetherUrl() + "/" + groupText + "/" + * + idText + "/" + version + "." + packagingText; + */ + + String artifactText = group + ":" + artifact + ":" + version + ":" + packaging; + + tree.addItem(artifactText); + tree.setParent(artifactText, version.toString()); + tree.setItemCaption(artifactText, artifact + "-" + version + "." + packaging); + tree.setChildrenAllowed(artifactText, false); + if (packaging.equals("jar") || packaging.equals("war")) { + tree.setItemIcon(artifactText, FontAwesome.GIFT); + } else if (packaging.equals("xml") || packaging.equals("pom")) { + tree.setItemIcon(artifactText, FontAwesome.CODE); + } else { + tree.setItemIcon(artifactText, FontAwesome.FILE); + } + } +} \ No newline at end of file diff --git a/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/outer/LoadFileForm.java b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/outer/LoadFileForm.java new file mode 100644 index 00000000..3a942e1f --- /dev/null +++ b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/outer/LoadFileForm.java @@ -0,0 +1,153 @@ +package cz.zcu.kiv.crce.crce_webui_v2.outer; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.StandardOpenOption; +import java.util.List; + +import com.vaadin.data.util.BeanItemContainer; +import com.vaadin.server.Page; +import com.vaadin.shared.Position; +import com.vaadin.shared.ui.MarginInfo; +import com.vaadin.ui.Button; +import com.vaadin.ui.FormLayout; +import com.vaadin.ui.Grid; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Notification; +import com.vaadin.ui.Panel; +import com.vaadin.ui.TextField; +import com.vaadin.ui.Upload; +import com.vaadin.ui.Upload.Receiver; +import com.vaadin.ui.Upload.SucceededEvent; +import com.vaadin.ui.Upload.SucceededListener; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Grid.SelectionMode; + +import cz.zcu.kiv.crce.crce_webui_v2.internal.Activator; +import cz.zcu.kiv.crce.crce_webui_v2.repository.classes.ResourceBean; +import cz.zcu.kiv.crce.crce_webui_v2.repository.services.ResourceService; +import cz.zcu.kiv.crce.crce_webui_v2.webui.MyUI; +import cz.zcu.kiv.crce.repository.RefusedArtifactException; + +@SuppressWarnings("serial") +public class LoadFileForm extends FormLayout { + //private VaadinSession session; + private Panel filePanel = new Panel("Upload artefact from local file system"); + private Panel urlPanel = new Panel("Upload artefact from remote url"); + private Panel bufferPanel = new Panel("Buffer"); + private Grid bufferGrid = new Grid(); + private ResourceService resourceService; + private MyUI myUI; + + public LoadFileForm(MyUI myUI){ + this.myUI = myUI; + VerticalLayout content = new VerticalLayout(); + HorizontalLayout fileLayout = new HorizontalLayout(); + HorizontalLayout urlLayout = new HorizontalLayout(); + + FileUploader receiver = new FileUploader(); + Upload upload = new Upload("Directly Upload File:", receiver); + upload.setButtonCaption("Browse Files"); + upload.addSucceededListener(receiver); + upload.setImmediate(true); + + TextField urlText = new TextField(); + urlText.setWidth("400px"); + Button urlButton = new Button("Load"); + urlLayout.addComponents(urlText, urlButton); + urlLayout.setSpacing(true); + urlLayout.setMargin(true); + urlLayout.setHeight("100px"); + urlPanel.setContent(urlLayout); + + fileLayout.addComponent(upload); + fileLayout.setMargin(true); + fileLayout.setHeight("300px"); + filePanel.setContent(fileLayout); + + resourceService = new ResourceService(Activator.instance().getMetadataService()); + List resourceBeanList = resourceService.getAllResourceBeanFromBuffer(myUI.getSession().getSession()); + + if(!resourceBeanList.isEmpty()) { + HorizontalLayout bufferPanelLayout = new HorizontalLayout(); + VerticalLayout bufferLayout = new VerticalLayout(); + bufferGrid.setContainerDataSource(new BeanItemContainer<>(ResourceBean.class, resourceBeanList)); + bufferGrid.getColumn("resource").setHidden(true); + bufferGrid.getColumn("size").setHidden(true); + bufferGrid.setColumnOrder("presentationName", "symbolicName", "version", "categories"); + bufferGrid.addStyleName("my-style"); + bufferGrid.setSelectionMode(SelectionMode.NONE); + bufferLayout.addComponent(bufferGrid); + bufferGrid.setSizeFull(); + bufferPanelLayout.setSizeFull(); + bufferPanelLayout.addComponent(bufferLayout); + bufferPanelLayout.setExpandRatio(bufferLayout, 1); + bufferPanel.setContent(bufferPanelLayout); + + content.addComponents(filePanel, urlPanel, bufferPanel); + } + else { + content.addComponents(filePanel, urlPanel); + } + + content.setMargin(new MarginInfo(false, true, false, false)); + content.setSpacing(true); + + urlButton.addClickListener(e -> { + File file; + try { + URL url = new URL(urlText.getValue()); + file = new File(url.toString()); + InputStream input = url.openStream(); + Activator.instance().getBuffer(myUI.getSession().getSession()).put(file.getName(), input); + Notification notif = new Notification("Info", "Artefact from url upload sucess", + Notification.Type.ASSISTIVE_NOTIFICATION); + notif.setPosition(Position.TOP_RIGHT); + notif.show(Page.getCurrent()); + myUI.setContentBodyLoadFile(); + } catch (IOException | RefusedArtifactException ex) { + new Notification("Could not open or load file from url", ex.getMessage(), Notification.Type.ERROR_MESSAGE) + .show(Page.getCurrent()); + } + }); + + addComponent(content); + } + + class FileUploader implements Receiver, SucceededListener { + private File file; + public OutputStream receiveUpload(String filename, String mimeType) { + FileOutputStream fos = null; + try { + file = new File(filename); + fos = new FileOutputStream(file); + } catch (FileNotFoundException e) { + new Notification("Could not open file", e.getMessage(), Notification.Type.ERROR_MESSAGE) + .show(Page.getCurrent()); + return null; + } + return fos; + } + + public void uploadSucceeded(SucceededEvent event) { + try { + Activator.instance().getBuffer(myUI.getSession().getSession()) + .put(file.getName(), Files.newInputStream(file.toPath(), StandardOpenOption.READ)); + Notification notif = new Notification("Info", "Artefact from file upload sucess", + Notification.Type.ASSISTIVE_NOTIFICATION); + notif.setPosition(Position.TOP_RIGHT); + notif.show(Page.getCurrent()); + myUI.setContentBodyLoadFile(); + } catch (IOException | RefusedArtifactException e) { + new Notification("Could not open or load file", e.getMessage(), Notification.Type.ERROR_MESSAGE) + .show(Page.getCurrent()); + } + } + } +} diff --git a/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/outer/LocalMavenForm.java b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/outer/LocalMavenForm.java new file mode 100644 index 00000000..b39f51bd --- /dev/null +++ b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/outer/LocalMavenForm.java @@ -0,0 +1,183 @@ +package cz.zcu.kiv.crce.crce_webui_v2.outer; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.FileVisitResult; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.StandardOpenOption; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.List; + +import com.vaadin.data.util.BeanItemContainer; +import com.vaadin.server.Page; +import com.vaadin.shared.Position; +import com.vaadin.shared.ui.MarginInfo; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.FormLayout; +import com.vaadin.ui.Grid; +import com.vaadin.ui.Grid.SelectionMode; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Label; +import com.vaadin.ui.Panel; +import com.vaadin.ui.Notification; +import com.vaadin.ui.Tree; +import com.vaadin.ui.themes.ValoTheme; +import com.vaadin.ui.VerticalLayout; + +import cz.zcu.kiv.crce.crce_external_repository.api.SettingsUrl; +import cz.zcu.kiv.crce.crce_webui_v2.internal.Activator; +import cz.zcu.kiv.crce.crce_webui_v2.outer.classes.LocalMaven; +import cz.zcu.kiv.crce.crce_webui_v2.repository.classes.ResourceBean; +import cz.zcu.kiv.crce.crce_webui_v2.repository.services.ResourceService; +import cz.zcu.kiv.crce.crce_webui_v2.webui.MyUI; +import cz.zcu.kiv.crce.repository.RefusedArtifactException; + +@SuppressWarnings("serial") +public class LocalMavenForm extends FormLayout { + private LocalMaven localMaven = new LocalMaven(); + private Label caption = new Label("Local Maven repository"); + private Panel formPanel = new Panel("Content"); + private VerticalLayout bufferLayout = new VerticalLayout(); + private Panel bufferPanel = new Panel("Buffer"); + private Grid bufferGrid = new Grid(); + private ResourceService resourceService; + private Button uploadButton = new Button("Upload"); + private Button removeButton = new Button("Remove"); + + public LocalMavenForm() { + HorizontalLayout content = new HorizontalLayout(); + addComponent(content); + } + + public LocalMavenForm(MyUI myUI) { + VerticalLayout content = new VerticalLayout(); + caption.addStyleName(ValoTheme.LABEL_BOLD); + + VerticalLayout formLayout = new VerticalLayout(); + HorizontalLayout buttons = new HorizontalLayout(); + + removeButton.setStyleName(ValoTheme.BUTTON_DANGER); + + if (myUI.getSession().getAttribute("settingsUrl") == null + || !((SettingsUrl) myUI.getSession().getAttribute("settingsUrl")).isEnableDeleteLocalMaven()) { + buttons.addComponent(uploadButton); + } else { + buttons.addComponents(uploadButton, removeButton); + } + + buttons.setSpacing(true); + buttons.setVisible(false); + + // Tree of Maven local repository + Tree localMavenTree = localMaven.getTree(myUI.getSession()); + content.setMargin(new MarginInfo(false, true)); + if (localMavenTree == null) { + content.addComponent(new Label("Local Maven repository not found")); + } else { + HorizontalLayout treeLayout = new HorizontalLayout(); + treeLayout.addComponent(localMavenTree); + treeLayout.setMargin(true); + formPanel.setContent(treeLayout); + formPanel.setHeight("500px"); + + resourceService = new ResourceService(Activator.instance().getMetadataService()); + List resourceBeanList = resourceService.getAllResourceBeanFromBuffer(myUI.getSession().getSession()); + + HorizontalLayout bufferPanelLayout = new HorizontalLayout(); + bufferGrid.setContainerDataSource(new BeanItemContainer<>(ResourceBean.class, resourceBeanList)); + bufferGrid.getColumn("resource").setHidden(true); + bufferGrid.getColumn("size").setHidden(true); + bufferGrid.setColumnOrder("presentationName", "symbolicName", "version", "categories"); + bufferGrid.addStyleName("my-style"); + bufferGrid.setSelectionMode(SelectionMode.NONE); + bufferLayout.addComponent(bufferGrid); + bufferGrid.setSizeFull(); + bufferPanelLayout.setSizeFull(); + bufferPanelLayout.addComponent(bufferLayout); + bufferPanelLayout.setExpandRatio(bufferLayout, 1); + bufferPanel.setContent(bufferPanelLayout); + + formLayout.addComponents(caption, formPanel, buttons, bufferPanel); + + if(!resourceBeanList.isEmpty()) { + bufferPanel.setVisible(true); + } + else { + bufferPanel.setVisible(false); + } + + formLayout.setSpacing(true); + formLayout.setComponentAlignment(buttons, Alignment.BOTTOM_CENTER); + content.addComponents(formLayout); + content.setSpacing(true); + + localMavenTree.addItemClickListener(e -> { + buttons.setVisible(true); + }); + + removeButton.addClickListener(e -> { + if (localMavenTree.getValue() != null) { + File file = new File(localMavenTree.getValue().toString()); + Path directory = file.toPath(); + try { + Files.walkFileTree(directory, new SimpleFileVisitor() { + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + Files.delete(file); + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { + Files.delete(dir); + return FileVisitResult.CONTINUE; + } + }); + } catch (IOException ex) { + new Notification("Could not remove path!", ex.getMessage(), Notification.Type.ERROR_MESSAGE) + .show(Page.getCurrent()); + } finally { + myUI.setContentBodyLocalMaven(); + } + } + }); + + uploadButton.addClickListener(e -> { + if (localMavenTree.getValue() != null) { + if (!localMavenTree.areChildrenAllowed((Object) localMavenTree.getValue())) { + try { + File file = new File(localMavenTree.getValue().toString()); + InputStream is = Files.newInputStream(file.toPath(), StandardOpenOption.READ); + try { + Activator.instance().getBuffer(myUI.getSession().getSession()).put(file.getName(), is); + bufferLayout.removeComponent(bufferGrid); + bufferGrid.setContainerDataSource(new BeanItemContainer<>(ResourceBean.class, + resourceService.getAllResourceBeanFromBuffer(myUI.getSession().getSession()))); + bufferLayout.addComponent(bufferGrid); + bufferPanel.setVisible(true); + Notification notif = new Notification("Info", "Artifact to buffer upload sucess", + Notification.Type.ASSISTIVE_NOTIFICATION); + notif.setPosition(Position.TOP_RIGHT); + notif.show(Page.getCurrent()); + } finally { + is.close(); + } + } catch (IOException | RefusedArtifactException ex) { + new Notification("Could not open file", ex.getMessage(), Notification.Type.ERROR_MESSAGE) + .show(Page.getCurrent()); + } + + } else { + new Notification("No artifact is selected for upload!", Notification.Type.WARNING_MESSAGE) + .show(Page.getCurrent()); + } + } + }); + } + addComponent(content); + } +} diff --git a/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/outer/classes/LocalMaven.java b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/outer/classes/LocalMaven.java new file mode 100644 index 00000000..f917d581 --- /dev/null +++ b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/outer/classes/LocalMaven.java @@ -0,0 +1,63 @@ +package cz.zcu.kiv.crce.crce_webui_v2.outer.classes; + +import java.io.File; +import java.io.Serializable; + +import com.vaadin.server.FontAwesome; +import com.vaadin.server.VaadinSession; +import com.vaadin.ui.Tree; + +import cz.zcu.kiv.crce.crce_external_repository.api.SettingsUrl; + +@SuppressWarnings("serial") +public class LocalMaven implements Serializable{ + private Tree localMavenTree = new Tree(); + private String path; + public Tree getTree(VaadinSession session) { + // get local Maven path + if(session.getAttribute("settingsUrl") == null){ + SettingsUrl settings = new SettingsUrl(); + path = settings.getLocalAetherUrl(); + } + else{ + path = ((SettingsUrl)session.getAttribute("settingsUrl")).getLocalAetherUrl(); + } + + File f = new File(path); + if(f.exists()){ + list(f); + return localMavenTree; + } + else{ + return null; + } + } + + private void list(File file) { + File[] children = file.listFiles(); + for (File child : children) { + if (child.isDirectory() && child.getName().charAt(0) != '.') { + localMavenTree.addItem(child.getAbsolutePath()); + localMavenTree.setItemCaption(child.getAbsolutePath(), child.getName()); + localMavenTree.setParent(child.getAbsolutePath(), child.getParentFile().getAbsolutePath()); + list(child); + } + else if(child.isFile() && !child.getParentFile().getAbsolutePath().equals(path)){ + localMavenTree.addItem(child.getAbsolutePath()); + localMavenTree.setItemCaption(child.getAbsolutePath(), child.getName()); + localMavenTree.setParent(child.getAbsolutePath(), child.getParentFile().getAbsolutePath()); + localMavenTree.setChildrenAllowed(child.getAbsolutePath(), false); + if(child.getName().endsWith(".jar") || child.getName().endsWith(".war")){ + localMavenTree.setItemIcon(child.getAbsolutePath(), FontAwesome.GIFT); + } + else if(child.getName().endsWith(".xml") || child.getName().endsWith(".pom")){ + localMavenTree.setItemIcon(child.getAbsolutePath(), FontAwesome.CODE); + } + else{ + localMavenTree.setItemIcon(child.getAbsolutePath(), FontAwesome.FILE); + } + } + } + } +} + diff --git a/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/repository/ArtefactDetailForm.java b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/repository/ArtefactDetailForm.java new file mode 100644 index 00000000..46a38a26 --- /dev/null +++ b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/repository/ArtefactDetailForm.java @@ -0,0 +1,171 @@ +package cz.zcu.kiv.crce.crce_webui_v2.repository; + +import java.util.ArrayList; +import java.util.List; + +import com.vaadin.data.util.BeanItemContainer; +import com.vaadin.shared.ui.MarginInfo; +import com.vaadin.shared.ui.label.ContentMode; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.FormLayout; +import com.vaadin.ui.Grid; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Label; +import com.vaadin.ui.TabSheet; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.themes.ValoTheme; + +import cz.zcu.kiv.crce.crce_webui_v2.repository.classes.CapabilityAttributeBean; +import cz.zcu.kiv.crce.crce_webui_v2.repository.classes.RequirementAttributeBean; +import cz.zcu.kiv.crce.crce_webui_v2.repository.classes.ResourceBean; +import cz.zcu.kiv.crce.crce_webui_v2.webui.MyUI; +import cz.zcu.kiv.crce.metadata.Attribute; +import cz.zcu.kiv.crce.metadata.Capability; +import cz.zcu.kiv.crce.metadata.Requirement; + +@SuppressWarnings("serial") +public class ArtefactDetailForm extends FormLayout{ + private Label resourceLabel = new Label(); + private TabSheet tabsheet = new TabSheet(); + private Button buttonBackProperties = new Button("Back"); + private Button buttonBackCapabilities = new Button("Back"); + private Button buttonBackRequirements = new Button("Back"); + private Grid gridCapabilities = new Grid(); + private Grid gridRequirements = new Grid(); + + public ArtefactDetailForm(MyUI myUI, ResourceBean resourceBean, boolean isFromStore){ + VerticalLayout content = new VerticalLayout(); + + resourceLabel.setValue("Details of artefact: " + resourceBean.getPresentationName()); + resourceLabel.addStyleName(ValoTheme.LABEL_BOLD); + + // display property + VerticalLayout propertyContentLayout = new VerticalLayout(); + HorizontalLayout buttonPropertyLayout = new HorizontalLayout(); + + Label propertiesValues = new Label("
    "+ + "
  • Id: " + resourceBean.getResource().getId() + "
  • " + + "
  • Symbolic name: "+ resourceBean.getSymbolicName() + "
  • " + + "
  • Size: " + resourceBean.getSize() + "
  • " + + "
", ContentMode.HTML); + + buttonBackProperties.setWidth("130px"); + buttonPropertyLayout.addComponent(buttonBackProperties); + + propertyContentLayout.addComponents(propertiesValues, buttonPropertyLayout); + propertyContentLayout.setComponentAlignment(buttonPropertyLayout, Alignment.BOTTOM_CENTER); + propertyContentLayout.setSpacing(true); + propertyContentLayout.setMargin(new MarginInfo(true, false)); + propertyContentLayout.setHeight("450px"); + + // display capability + VerticalLayout capabilityContentLayout = new VerticalLayout(); + VerticalLayout capabilityTabLayout = new VerticalLayout(); + HorizontalLayout buttonCapabilityLayout = new HorizontalLayout(); + buttonCapabilityLayout.addComponents(buttonBackCapabilities); + buttonCapabilityLayout.setSpacing(true); + + buttonBackCapabilities.setWidth("130px"); + + List capabilityAttributeBeanList = new ArrayList(); + for(Capability capability : resourceBean.getResource().getCapabilities()){ + for(Attribute a : capability.getAttributes()){ + CapabilityAttributeBean capabilityAttributeBean = new CapabilityAttributeBean(); + capabilityAttributeBean.setNameSpace(capability.getNamespace()); + capabilityAttributeBean.setDesignation(a.getName()); + capabilityAttributeBean.setType(a.getType().toString()); + capabilityAttributeBean.setValue(a.getStringValue()); + capabilityAttributeBeanList.add(capabilityAttributeBean); + } + } + + gridCapabilities.setContainerDataSource(new BeanItemContainer<>(CapabilityAttributeBean.class, capabilityAttributeBeanList)); + gridCapabilities.setColumnOrder("nameSpace", "designation", "value"); + gridCapabilities.addStyleName("my-style"); + HorizontalLayout capabilityFormLayout = new HorizontalLayout(capabilityTabLayout); + capabilityFormLayout.setSizeFull(); + gridCapabilities.setSizeFull(); + capabilityTabLayout.addComponents(gridCapabilities); + capabilityFormLayout.setExpandRatio(capabilityTabLayout, 1); + + capabilityContentLayout.addComponents(capabilityFormLayout, buttonCapabilityLayout); + capabilityContentLayout.setComponentAlignment(buttonCapabilityLayout, Alignment.BOTTOM_CENTER); + capabilityContentLayout.setSpacing(true); + capabilityContentLayout.setMargin(new MarginInfo(true, false)); + + // display requirement + VerticalLayout requirementContentLayout = new VerticalLayout(); + VerticalLayout requirementTabLayout = new VerticalLayout(); + HorizontalLayout buttonRequirementLayout = new HorizontalLayout(); + buttonRequirementLayout.addComponents(buttonBackRequirements); + buttonRequirementLayout.setSpacing(true); + + buttonBackRequirements.setWidth("130px"); + + List requirementAttributeBeanList = new ArrayList(); + for(Requirement requirement : resourceBean.getResource().getRequirements()){ + for(Attribute a : requirement.getAttributes()){ + RequirementAttributeBean requirementAttributeBean = new RequirementAttributeBean(); + requirementAttributeBean.setNameSpace(requirement.getNamespace()); + requirementAttributeBean.setDesignation(a.getName()); + requirementAttributeBean.setType(a.getType().toString()); + requirementAttributeBean.setValue(a.getStringValue()); + requirementAttributeBeanList.add(requirementAttributeBean); + } + } + + gridRequirements.setContainerDataSource(new BeanItemContainer<>(RequirementAttributeBean.class, requirementAttributeBeanList)); + gridRequirements.setColumnOrder("nameSpace", "designation", "value"); + gridRequirements.addStyleName("my-style"); + HorizontalLayout requirementFormLayout = new HorizontalLayout(requirementTabLayout); + requirementFormLayout.setSizeFull(); + gridRequirements.setSizeFull(); + requirementTabLayout.addComponents(gridRequirements); + requirementFormLayout.setExpandRatio(requirementTabLayout, 1); + + requirementContentLayout.addComponents(requirementFormLayout, buttonRequirementLayout); + requirementContentLayout.setComponentAlignment(buttonRequirementLayout, Alignment.BOTTOM_CENTER); + requirementContentLayout.setSpacing(true); + requirementContentLayout.setMargin(new MarginInfo(true, false)); + + + + tabsheet.addTab(propertyContentLayout).setCaption("Properties"); + tabsheet.addTab(capabilityContentLayout).setCaption("Capability"); + tabsheet.addTab(requirementContentLayout).setCaption("Requirement"); + + buttonBackProperties.addClickListener(e ->{ + if(isFromStore){ + myUI.setContentBodyStore(); + } + else{ + myUI.setContentBodyBuffer(); + } + }); + + buttonBackCapabilities.addClickListener(e ->{ + if(isFromStore){ + myUI.setContentBodyStore(); + } + else{ + myUI.setContentBodyBuffer(); + } + }); + + buttonBackRequirements.addClickListener(e ->{ + if(isFromStore){ + myUI.setContentBodyStore(); + } + else{ + myUI.setContentBodyBuffer(); + } + }); + + content.addComponents(resourceLabel, tabsheet); + content.setSpacing(true); + content.setMargin(new MarginInfo(false, true)); + + addComponent(content); + } +} diff --git a/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/repository/BufferForm.java b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/repository/BufferForm.java new file mode 100644 index 00000000..d0f3ece0 --- /dev/null +++ b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/repository/BufferForm.java @@ -0,0 +1,181 @@ +package cz.zcu.kiv.crce.crce_webui_v2.repository; + +import java.util.List; + +import com.vaadin.data.util.BeanItemContainer; +import com.vaadin.event.ShortcutAction.KeyCode; +import com.vaadin.server.FontAwesome; +import com.vaadin.server.Page; +import com.vaadin.shared.Position; +import com.vaadin.shared.ui.MarginInfo; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.CssLayout; +import com.vaadin.ui.FormLayout; +import com.vaadin.ui.Grid; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Label; +import com.vaadin.ui.Notification; +import com.vaadin.ui.Panel; +import com.vaadin.ui.PopupView; +import com.vaadin.ui.TextField; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.themes.ValoTheme; + +import cz.zcu.kiv.crce.crce_webui_v2.internal.Activator; +import cz.zcu.kiv.crce.crce_webui_v2.repository.classes.ResourceBean; +import cz.zcu.kiv.crce.crce_webui_v2.repository.services.ResourceService; +import cz.zcu.kiv.crce.crce_webui_v2.webui.MyUI; + +public class BufferForm extends FormLayout{ + private static final long serialVersionUID = 6675695008606881678L; + private Label labelForm = new Label("Artefact in Buffer"); + private TextField idText = new TextField(); + private Grid gridBuffer = new Grid(); + private PopupView popup; + private transient ResourceBean resourceBeanSelect; + private ResourceService resourceService; + + public BufferForm(MyUI myUI){ + VerticalLayout content = new VerticalLayout(); + VerticalLayout fieldLayout = new VerticalLayout(); + HorizontalLayout buttonLayout = new HorizontalLayout(); + + resourceService = new ResourceService(Activator.instance().getMetadataService()); + + Button buttonDetail = new Button("Detail"); + buttonDetail.setWidth("100px"); + Button buttonRemove = new Button("Remove"); + buttonRemove.setWidth("100px"); + Button buttonPush = new Button("Push to Store"); + buttonPush.setDescription("Push all artefact from Buffer to Store"); + buttonPush.setStyleName(ValoTheme.BUTTON_FRIENDLY); + + buttonDetail.setStyleName(ValoTheme.BUTTON_PRIMARY); + buttonDetail.setClickShortcut(KeyCode.ENTER); + + labelForm.addStyleName(ValoTheme.LABEL_BOLD); + + List resourceBeanList = resourceService.getAllResourceBeanFromBuffer(myUI.getSession().getSession()); + + gridBuffer.setContainerDataSource(new BeanItemContainer<>(ResourceBean.class, resourceBeanList)); + gridBuffer.getColumn("resource").setHidden(true); + gridBuffer.getColumn("size").setHidden(true); + gridBuffer.setColumnOrder("presentationName", "symbolicName", "version", "categories"); + gridBuffer.addStyleName("my-style"); + + idText.setInputPrompt("search by presentation name..."); + idText.setWidth("270px"); + + Button findButton = new Button(FontAwesome.CHECK); + findButton.addClickListener(e ->{ + gridBuffer.setContainerDataSource(new BeanItemContainer<>(ResourceBean.class, + resourceService.getFindResourceBeanFromBuffer(myUI.getSession().getSession(), idText.getValue()))); + }); + + Button clearButton = new Button(FontAwesome.TIMES); + clearButton.addClickListener(e -> { + myUI.setContentBodyBuffer(); + }); + + CssLayout filtering = new CssLayout(); + filtering.setStyleName(ValoTheme.LAYOUT_COMPONENT_GROUP); + filtering.addComponents(idText, findButton, clearButton); + + HorizontalLayout filteringPushLayout = new HorizontalLayout(); + filteringPushLayout.addComponents(filtering, buttonPush); + filteringPushLayout.setSpacing(true); + filteringPushLayout.setSizeFull(); + filteringPushLayout.setComponentAlignment(buttonPush, Alignment.MIDDLE_RIGHT); + + if(resourceBeanList.isEmpty()){ + buttonPush.setVisible(false); + } + else{ + buttonPush.setVisible(true); + } + + fieldLayout.addComponents(labelForm, filteringPushLayout, gridBuffer); + fieldLayout.setSpacing(true); + + HorizontalLayout formLayout = new HorizontalLayout(fieldLayout); + formLayout.setSizeFull(); + gridBuffer.setSizeFull(); + formLayout.setExpandRatio(fieldLayout, 1); + + // Popup verification of artifact remove + VerticalLayout buttonPopupLayout = new VerticalLayout(); + Panel panel = new Panel("Really remove the artifact?"); + Button yesRemoveButton = new Button("Confirm"); + yesRemoveButton.setStyleName(ValoTheme.BUTTON_DANGER); + buttonPopupLayout.addComponents(yesRemoveButton); + buttonPopupLayout.setMargin(true); + buttonPopupLayout.setSizeFull(); + buttonPopupLayout.setComponentAlignment(yesRemoveButton, Alignment.BOTTOM_CENTER); + panel.setContent(buttonPopupLayout); + + popup = new PopupView(null, panel); + popup.setWidth("150px"); + + buttonLayout.addComponents(buttonDetail, buttonRemove); + buttonLayout.setSpacing(true); + buttonLayout.setVisible(false); + + content.addComponents(formLayout, buttonLayout, popup); + content.setComponentAlignment(buttonLayout, Alignment.MIDDLE_CENTER); + content.setComponentAlignment(popup, Alignment.MIDDLE_CENTER); + content.setMargin(new MarginInfo(false, true)); + content.setSpacing(true); + + gridBuffer.addSelectionListener(e ->{ + if(!e.getSelected().isEmpty()){ + resourceBeanSelect = (ResourceBean)e.getSelected().iterator().next(); + buttonLayout.setVisible(true); + } + else{ + resourceBeanSelect = null; + buttonLayout.setVisible(false); + } + }); + + buttonDetail.addClickListener(e ->{ + myUI.setContentArtefactDetailForm(resourceBeanSelect, false); + }); + + buttonRemove.addClickListener(e ->{ + popup.setPopupVisible(true); + yesRemoveButton.addClickListener(ev -> { + boolean result = resourceService.removeResourceFromBuffer(myUI.getSession().getSession(), + resourceBeanSelect.getResource()); + if(result){ + Notification notif = new Notification("Info", "Artifact sucess removed", + Notification.Type.ASSISTIVE_NOTIFICATION); + notif.setPosition(Position.TOP_RIGHT); + notif.show(Page.getCurrent()); + } + else{ + new Notification("Could not remove artefact from buffer", Notification.Type.WARNING_MESSAGE) + .show(Page.getCurrent()); + } + myUI.setContentBodyBuffer(); + }); + }); + + buttonPush.addClickListener(e ->{ + boolean result = resourceService.pushResourcesToStore(myUI.getSession()); + if(result){ + Notification notif = new Notification("Info", "All artifacts have been successfully moved to the Store.", + Notification.Type.ASSISTIVE_NOTIFICATION); + notif.setPosition(Position.TOP_RIGHT); + notif.show(Page.getCurrent()); + } + else{ + new Notification("Could not commit artifacts to Store", Notification.Type.WARNING_MESSAGE) + .show(Page.getCurrent()); + } + myUI.setContentBodyBuffer(); + }); + + addComponent(content); + } +} diff --git a/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/repository/PluginEditForm.java b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/repository/PluginEditForm.java new file mode 100644 index 00000000..ac164468 --- /dev/null +++ b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/repository/PluginEditForm.java @@ -0,0 +1,89 @@ +package cz.zcu.kiv.crce.crce_webui_v2.repository; + +import java.util.ArrayList; + +import com.vaadin.data.util.BeanItemContainer; +import com.vaadin.data.validator.StringLengthValidator; +import com.vaadin.event.ShortcutAction.KeyCode; +import com.vaadin.ui.Button; +import com.vaadin.ui.FormLayout; +import com.vaadin.ui.Grid; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Label; +import com.vaadin.ui.TextField; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.themes.ValoTheme; + +import cz.zcu.kiv.crce.crce_webui_v2.other.KeyWord; +import cz.zcu.kiv.crce.plugin.Plugin; + +@SuppressWarnings("serial") +public class PluginEditForm extends FormLayout{ + private int nameMaxLenght = 45; + private Label labelKeyWords = new Label("Plugin key words"); + private Grid gridKeyWords = new Grid(); + private TextField priority = new TextField("Priority"); + //private TextField version = new TextField("Version"); + private Button editButton = new Button("Edit"); + private Plugin plugin; + public PluginEditForm(PluginsForm pluginsForm){ + HorizontalLayout content = new HorizontalLayout(); + VerticalLayout editLayout = new VerticalLayout(); + VerticalLayout keyWordLayout = new VerticalLayout(); + + setSizeUndefined(); + setMargin(false); + + labelKeyWords.addStyleName(ValoTheme.LABEL_BOLD); + keyWordLayout.addComponents(labelKeyWords, gridKeyWords); + keyWordLayout.setSpacing(true); + keyWordLayout.setVisible(false); + + gridKeyWords.setWidth("200px"); + gridKeyWords.addStyleName("my-style"); + + editButton.setStyleName(ValoTheme.BUTTON_PRIMARY); + editButton.setClickShortcut(KeyCode.ENTER); + + priority.setWidth("200px"); + priority.setRequired(true); + priority.setRequiredError("Item can not be empty!"); + priority.addValidator(new StringLengthValidator("Item must have " + nameMaxLenght + " characters!", 1, + nameMaxLenght, false)); + /*version.setWidth("200px"); + version.setRequired(true); + version.setRequiredError("Item can not be empty!"); + version.addValidator(new StringLengthValidator("Item must have " + nameMaxLenght + " characters!", 1, + nameMaxLenght, false));*/ + + //editLayout.addComponents(priority, version, editButton); + editLayout.addComponents(priority, editButton); + editLayout.setSpacing(true); + + content.addComponents(keyWordLayout, editLayout); + content.setSpacing(true); + + editButton.addClickListener(e -> { + //TODO doplnit + + pluginsForm.update(); + }); + + addComponent(content); + } + + public void setPlugin(Plugin plugin) { + this.plugin = plugin; + if(!this.plugin.getPluginKeywords().isEmpty()){ + labelKeyWords.setVisible(true); + ArrayList keyWordList = new ArrayList(); + for(String s : this.plugin.getPluginKeywords()){ + keyWordList.add(new KeyWord(s)); + } + gridKeyWords.setContainerDataSource(new BeanItemContainer<>(KeyWord.class, keyWordList)); + } + priority.setValue(plugin.getPluginPriority() + ""); + //version.setValue(plugin.getPluginVersion().toString()); + setVisible(true); + } +} \ No newline at end of file diff --git a/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/repository/PluginsForm.java b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/repository/PluginsForm.java new file mode 100644 index 00000000..a7a93abd --- /dev/null +++ b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/repository/PluginsForm.java @@ -0,0 +1,75 @@ +package cz.zcu.kiv.crce.crce_webui_v2.repository; + +import com.vaadin.data.util.BeanItemContainer; +import com.vaadin.shared.ui.MarginInfo; +import com.vaadin.ui.FormLayout; +import com.vaadin.ui.Grid; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Label; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.themes.ValoTheme; + +import cz.zcu.kiv.crce.crce_webui_v2.internal.Activator; +import cz.zcu.kiv.crce.crce_webui_v2.webui.MyUI; +import cz.zcu.kiv.crce.plugin.Plugin; + +@SuppressWarnings("serial") +public class PluginsForm extends FormLayout{ + private Label labelForm = new Label("Plugins"); + private Grid gridPlugins = new Grid(); + private Grid gridKeyWords = new Grid(); + private PluginEditForm pluginEditForm; + private HorizontalLayout formLayout; + private MyUI myUI; + + public PluginsForm(MyUI myUI){ + this.myUI = myUI; + pluginEditForm = new PluginEditForm(this); + + VerticalLayout content = new VerticalLayout(); + VerticalLayout fieldLayout = new VerticalLayout(); + + labelForm.addStyleName(ValoTheme.LABEL_BOLD); + + gridPlugins.setContainerDataSource(new BeanItemContainer<>(Plugin.class, Activator.instance().getPluginManager().getPlugins())); + gridPlugins.getColumn("pluginKeywords").setHidden(true); + gridPlugins.getColumn("pluginId").setHidable(true); + gridPlugins.getColumn("pluginDescription").setHidable(true); + gridPlugins.getColumn("pluginPriority").setHidable(true); + gridPlugins.getColumn("pluginVersion").setHidable(true); + gridPlugins.setColumnOrder("pluginId", "pluginDescription", "pluginKeywords"); + gridPlugins.addStyleName("my-style"); + + gridKeyWords.setWidth("200px"); + gridKeyWords.addStyleName("my-style"); + + fieldLayout.addComponents(labelForm, gridPlugins); + fieldLayout.setSpacing(true); + + formLayout = new HorizontalLayout(fieldLayout, pluginEditForm); + formLayout.setSpacing(true); + formLayout.setSizeFull(); + gridPlugins.setSizeFull(); + formLayout.setExpandRatio(fieldLayout, 1); + pluginEditForm.setVisible(false); + + content.addComponent(formLayout); + content.setMargin(new MarginInfo(false, true)); + content.setSpacing(true); + + gridPlugins.addSelectionListener(e -> { + if (e.getSelected().isEmpty()) { + pluginEditForm.setVisible(false); + } else { + Plugin plugin = (Plugin) e.getSelected().iterator().next(); + pluginEditForm.setPlugin(plugin); + } + }); + + addComponent(content); + } + + public void update(){ + myUI.setContentBodyPlugins(); + } +} diff --git a/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/repository/StoreForm.java b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/repository/StoreForm.java new file mode 100644 index 00000000..023935c9 --- /dev/null +++ b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/repository/StoreForm.java @@ -0,0 +1,176 @@ +package cz.zcu.kiv.crce.crce_webui_v2.repository; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; + +import com.vaadin.data.util.BeanItemContainer; +import com.vaadin.event.ShortcutAction.KeyCode; +import com.vaadin.server.FileDownloader; +import com.vaadin.server.FontAwesome; +import com.vaadin.server.Page; +import com.vaadin.server.StreamResource; +import com.vaadin.server.StreamResource.StreamSource; +import com.vaadin.shared.Position; +import com.vaadin.shared.ui.MarginInfo; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.CssLayout; +import com.vaadin.ui.FormLayout; +import com.vaadin.ui.Grid; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Label; +import com.vaadin.ui.Notification; +import com.vaadin.ui.Panel; +import com.vaadin.ui.PopupView; +import com.vaadin.ui.TextField; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.themes.ValoTheme; + +import cz.zcu.kiv.crce.crce_webui_v2.internal.Activator; +import cz.zcu.kiv.crce.crce_webui_v2.repository.classes.ResourceBean; +import cz.zcu.kiv.crce.crce_webui_v2.repository.services.ResourceService; +import cz.zcu.kiv.crce.crce_webui_v2.webui.MyUI; + +public class StoreForm extends FormLayout{ + private static final long serialVersionUID = 7439970261502810719L; + private Label labelForm = new Label("Artefact in Store"); + private TextField idText = new TextField(); + private Grid gridStore = new Grid(); + private PopupView popup; + private transient ResourceBean resourceBeanSelect = null; + private ResourceService resourceService; + + public StoreForm(MyUI myUI){ + VerticalLayout content = new VerticalLayout(); + VerticalLayout fieldLayout = new VerticalLayout(); + HorizontalLayout buttonLayout = new HorizontalLayout(); + + resourceService = new ResourceService(Activator.instance().getMetadataService()); + + Button buttonDetail = new Button("Detail"); + buttonDetail.setWidth("100px"); + Button buttonRemove = new Button("Remove"); + buttonRemove.setWidth("100px"); + Button buttonDownload = new Button("Download"); + + buttonDetail.setStyleName(ValoTheme.BUTTON_PRIMARY); + buttonDetail.setClickShortcut(KeyCode.ENTER); + + labelForm.addStyleName(ValoTheme.LABEL_BOLD); + + gridStore.setContainerDataSource(new BeanItemContainer<>(ResourceBean.class, resourceService.getAllResourceBeanFromStore(myUI.getSession()))); + gridStore.getColumn("resource").setHidden(true); + gridStore.getColumn("size").setHidden(true); + gridStore.setColumnOrder("presentationName", "symbolicName", "version", "categories"); + gridStore.addStyleName("my-style"); + + idText.setInputPrompt("search by presentation name..."); + idText.setWidth("270px"); + + Button findButton = new Button(FontAwesome.CHECK); + findButton.addClickListener(e ->{ + gridStore.setContainerDataSource(new BeanItemContainer<>(ResourceBean.class, + resourceService.getFindResourceBeanFromStore(myUI.getSession(), idText.getValue()))); + }); + Button clearButton = new Button(FontAwesome.TIMES); + clearButton.addClickListener(e -> { + myUI.setContentBodyStore(); + }); + + CssLayout filtering = new CssLayout(); + filtering.setStyleName(ValoTheme.LAYOUT_COMPONENT_GROUP); + filtering.addComponents(idText, findButton, clearButton); + + fieldLayout.addComponents(labelForm, filtering, gridStore); + fieldLayout.setSpacing(true); + + HorizontalLayout formLayout = new HorizontalLayout(fieldLayout); + formLayout.setSizeFull(); + gridStore.setSizeFull(); + formLayout.setExpandRatio(fieldLayout, 1); + + // Popup verification of artifact remove + VerticalLayout buttonPopupLayout = new VerticalLayout(); + Panel panel = new Panel("Really remove the artifact?"); + Button yesRemoveButton = new Button("Confirm"); + yesRemoveButton.setStyleName(ValoTheme.BUTTON_DANGER); + buttonPopupLayout.addComponents(yesRemoveButton); + buttonPopupLayout.setMargin(true); + buttonPopupLayout.setSizeFull(); + buttonPopupLayout.setComponentAlignment(yesRemoveButton, Alignment.BOTTOM_CENTER); + panel.setContent(buttonPopupLayout); + + popup = new PopupView(null, panel); + popup.setWidth("150px"); + + buttonLayout.addComponents(buttonDetail, buttonRemove, buttonDownload); + buttonLayout.setSpacing(true); + buttonLayout.setVisible(false); + + content.addComponents(formLayout, buttonLayout, popup); + content.setComponentAlignment(buttonLayout, Alignment.MIDDLE_CENTER); + content.setComponentAlignment(popup, Alignment.MIDDLE_CENTER); + content.setMargin(new MarginInfo(false, true)); + content.setSpacing(true); + + gridStore.addSelectionListener(e ->{ + if(!e.getSelected().isEmpty()){ + resourceBeanSelect = (ResourceBean)e.getSelected().iterator().next(); + File srcFile = new File(resourceService.getUri(resourceBeanSelect.getResource())); + StreamResource res = createFileResource(srcFile); + res.setFilename(resourceService.getFileName(resourceBeanSelect.getResource())); + FileDownloader fd = new FileDownloader(res); + fd.extend(buttonDownload); + buttonLayout.setVisible(true); + } + else{ + resourceBeanSelect = null; + buttonLayout.setVisible(false); + } + }); + + buttonDetail.addClickListener(e ->{ + myUI.setContentArtefactDetailForm(resourceBeanSelect, true); + }); + + buttonRemove.addClickListener(e ->{ + popup.setPopupVisible(true); + yesRemoveButton.addClickListener(ev -> { + boolean result = resourceService.removeResorceFromStore(myUI.getSession(), resourceBeanSelect.getResource()); + if(result){ + Notification notif = new Notification("Info", "Artifact sucess removed", + Notification.Type.ASSISTIVE_NOTIFICATION); + notif.setPosition(Position.TOP_RIGHT); + notif.show(Page.getCurrent()); + } + else{ + new Notification("Could not remove artefact from store", Notification.Type.WARNING_MESSAGE) + .show(Page.getCurrent()); + } + myUI.setContentBodyStore(); + }); + }); + + addComponent(content); + } + + @SuppressWarnings("serial") + private StreamResource createFileResource(File file) { + StreamResource sr = new StreamResource(new StreamSource() { + @Override + public InputStream getStream() { + try { + return new FileInputStream(file); + } + catch (IOException e) { + e.printStackTrace(); + } + return null; + } + }, null); + sr.setCacheTime(0); + return sr; + } +} diff --git a/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/repository/classes/CapabilityAttributeBean.java b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/repository/classes/CapabilityAttributeBean.java new file mode 100644 index 00000000..fbd03afc --- /dev/null +++ b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/repository/classes/CapabilityAttributeBean.java @@ -0,0 +1,52 @@ +package cz.zcu.kiv.crce.crce_webui_v2.repository.classes; + +public class CapabilityAttributeBean { + private String designation; + private String nameSpace; + private String type; + private String value; + public String getDesignation() { + if (designation == null){ + return "unknown"; + } + else{ + return designation; + } + } + public void setDesignation(String designation) { + this.designation = designation; + } + public String getNameSpace() { + if (nameSpace == null){ + return "unknown"; + } + else{ + return nameSpace; + } + } + public void setNameSpace(String nameSpace) { + this.nameSpace = nameSpace; + } + public String getType() { + if (type == null){ + return "unknown"; + } + else{ + return type; + } + } + public void setType(String type) { + this.type = type; + } + public String getValue() { + if (value == null){ + return "unknown"; + } + else{ + return value; + } + } + public void setValue(String value) { + this.value = value; + } +} diff --git a/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/repository/classes/RequirementAttributeBean.java b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/repository/classes/RequirementAttributeBean.java new file mode 100644 index 00000000..f50e6c6b --- /dev/null +++ b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/repository/classes/RequirementAttributeBean.java @@ -0,0 +1,52 @@ +package cz.zcu.kiv.crce.crce_webui_v2.repository.classes; + +public class RequirementAttributeBean { + private String designation; + private String nameSpace; + private String type; + private String value; + public String getDesignation() { + if (designation == null){ + return "unknown"; + } + else{ + return designation; + } + } + public void setDesignation(String designation) { + this.designation = designation; + } + public String getNameSpace() { + if (nameSpace == null){ + return "unknown"; + } + else{ + return nameSpace; + } + } + public void setNameSpace(String nameSpace) { + this.nameSpace = nameSpace; + } + public String getType() { + if (type == null){ + return "unknown"; + } + else{ + return type; + } + } + public void setType(String type) { + this.type = type; + } + public String getValue() { + if (value == null){ + return "unknown"; + } + else{ + return value; + } + } + public void setValue(String value) { + this.value = value; + } +} diff --git a/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/repository/classes/ResourceBean.java b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/repository/classes/ResourceBean.java new file mode 100644 index 00000000..729f6a23 --- /dev/null +++ b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/repository/classes/ResourceBean.java @@ -0,0 +1,66 @@ +package cz.zcu.kiv.crce.crce_webui_v2.repository.classes; + +import cz.zcu.kiv.crce.metadata.Resource; +import cz.zcu.kiv.crce.metadata.type.Version; + +public class ResourceBean{ + private String presentationName; + private String symbolicName; + private String version; + private String categories; + private long size; + private Resource resource; + + public ResourceBean(String presentationName, String symbolicName, Version version, + String[] categories, long size, Resource resource) { + this.presentationName = presentationName; + this.symbolicName = symbolicName; + if(version == null){ + this.version = "unknown-version"; + } + else{ + this.version = version.toString(); + } + for(String s : categories){ + this.categories = s + ","; + } + if(!(categories.length == 0)){ + this.categories = this.categories.substring(0, this.categories.length() - 1); + } + else{ + this.categories = "unknown-categories"; + } + this.size = size; + this.resource = resource; + } + + public String getPresentationName() { + return presentationName; + } + + public String getSymbolicName() { + return symbolicName; + } + + public Resource getResource() { + return resource; + } + + public String getVersion() { + return version; + } + + public String getCategories() { + return categories; + } + + public long getSize() { + return size; + } + + @Override + public String toString(){ + return presentationName; + } + +} diff --git a/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/repository/services/ResourceService.java b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/repository/services/ResourceService.java new file mode 100644 index 00000000..d0272026 --- /dev/null +++ b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/repository/services/ResourceService.java @@ -0,0 +1,201 @@ +package cz.zcu.kiv.crce.crce_webui_v2.repository.services; + +import java.io.IOException; +import java.io.Serializable; +import java.net.URI; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Map; + +import com.vaadin.server.VaadinSession; +import com.vaadin.server.WrappedSession; + +import cz.zcu.kiv.crce.crce_webui_v2.internal.Activator; +import cz.zcu.kiv.crce.crce_webui_v2.repository.classes.ResourceBean; +import cz.zcu.kiv.crce.metadata.Capability; +import cz.zcu.kiv.crce.metadata.Resource; +import cz.zcu.kiv.crce.metadata.osgi.namespace.NsOsgiBundle; +import cz.zcu.kiv.crce.metadata.service.MetadataService; +import cz.zcu.kiv.crce.metadata.type.Version; + +public class ResourceService implements Serializable{ + private static final long serialVersionUID = 6161700434751771631L; + private Resource resource; + private transient MetadataService metadataService; + + public ResourceService(MetadataService metadataService){ + this.metadataService = metadataService; + } + + public ResourceService(Resource resource, MetadataService metadataService){ + this.resource = resource; + this.metadataService = metadataService; + } + + public void setResource(Resource resource){ + this.resource = resource; + } + + public String getPresentationName() { + return metadataService.getPresentationName(resource); + } + + public String getSymbolicName() { + String name = "unknown-symbolic-name"; + List capabilities = resource.getCapabilities(NsOsgiBundle.NAMESPACE__OSGI_BUNDLE); + if (!capabilities.isEmpty()) { + name = capabilities.get(0).getAttributeValue(NsOsgiBundle.ATTRIBUTE__SYMBOLIC_NAME); + } + return name; + } + + public String[] getCategories() { + return metadataService.getCategories(resource).toArray(new String[0]); + } + + public Version getVersion() { + Version version = null; + List capabilities = resource.getCapabilities(NsOsgiBundle.NAMESPACE__OSGI_BUNDLE); + if (!capabilities.isEmpty()) { + version = capabilities.get(0).getAttributeValue(NsOsgiBundle.ATTRIBUTE__VERSION); + } + return version; + } + + public long getSize() { + return metadataService.getSize(resource); + } + + public URI getUri(Resource resource) { + return metadataService.getUri(resource); + } + + public String getFileName(Resource resource) { + return metadataService.getFileName(resource); + } + + public List getAllResourceBeanFromBuffer(WrappedSession session){ + List resources = new ArrayList(); + for(Resource resource : Activator.instance().getBuffer(session).getResources()){ + setResource(resource); + resources.add(new ResourceBean(getPresentationName(), getSymbolicName(), getVersion(), getCategories(), getSize(), resource)); + } + return resources; + } + + // Dořešit!!! V modulu crce-repository-impl ve třídě BufferImpl v metodě isInBuffer (na konci třídy) je kontrola na začátek řetězce + // .getPath().startsWith(baseDir.getAbsolutePath())- proč? Pokud se toto zaremuje, resource LZE z Bufferu odebrat + public boolean removeResourceFromBuffer(WrappedSession wSession, Resource resource){ + boolean result; + try { + result = Activator.instance().getBuffer(wSession).remove(resource); + } catch (IOException e) { + e.printStackTrace(); + return false; + } + return result; + } + + public void clearBuffer(WrappedSession wSession) { + try { + for(Resource r : Activator.instance().getBuffer(wSession).getResources()) { + Activator.instance().getBuffer(wSession).remove(r); + } + } + catch (IOException e) { + e.printStackTrace(); + } + } + + public List getFindResourceBeanFromBuffer(WrappedSession session, String stringFilter){ + boolean passesFilter = false; + ArrayList arrayList = new ArrayList<>(); + for (ResourceBean resourceBean : getAllResourceBeanFromBuffer(session)){ + if(stringFilter == null || stringFilter.isEmpty()){ + passesFilter = true; + } + else{ + passesFilter = resourceBean.toString().toLowerCase().contains(stringFilter.toLowerCase()); + } + if (passesFilter) { + arrayList.add(resourceBean); + } + } + Collections.sort(arrayList, new Comparator() { + @Override + public int compare(ResourceBean o1, ResourceBean o2) { + return (int) (o2.hashCode() - o1.hashCode()); + } + }); + return arrayList; + } + + // for store + public boolean pushResourcesToStore(VaadinSession session){ + try { + Activator.instance().getBuffer(session.getSession()).commit(true); + } catch (IOException e) { + e.printStackTrace(); + return false; + } + return true; + } + + public List getAllResourceBeanFromStore(VaadinSession session) { + List resourceBeanList = new ArrayList(); + for(Resource resource : Activator.instance().getStore(getRepositoryId(session)).getResources()){ + setResource(resource); + resourceBeanList.add(new ResourceBean(getPresentationName(), getSymbolicName(), getVersion(), getCategories(), getSize(), resource)); + } + return resourceBeanList ; + } + + public List getFindResourceBeanFromStore(VaadinSession session, String stringFilter){ + boolean passesFilter = false; + ArrayList arrayList = new ArrayList<>(); + for (ResourceBean resourceBean : getAllResourceBeanFromStore(session)){ + if(stringFilter == null || stringFilter.isEmpty()){ + passesFilter = true; + } + else{ + passesFilter = resourceBean.toString().toLowerCase().contains(stringFilter.toLowerCase()); + } + if (passesFilter) { + arrayList.add(resourceBean); + } + } + Collections.sort(arrayList, new Comparator() { + @Override + public int compare(ResourceBean o1, ResourceBean o2) { + return (int) (o2.hashCode() - o1.hashCode()); + } + }); + return arrayList; + } + + public boolean removeResorceFromStore(VaadinSession session, Resource resource){ + boolean result; + try { + result = Activator.instance().getStore(getRepositoryId(session)).remove(resource); + } catch (IOException e) { + e.printStackTrace(); + return false; + } + return result; + } + + private String getRepositoryId(VaadinSession session) { + String id = (String) session.getAttribute("repositoryId"); + if (id == null) { + Map stores = Activator.instance().getRepositories(); + if (stores.isEmpty()) { + return null; + } + id = stores.keySet().iterator().next(); + session.setAttribute("repositoryId", id); + } + return id; + } +} diff --git a/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/versioning/VersioningEditForm.java b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/versioning/VersioningEditForm.java new file mode 100644 index 00000000..4c21086d --- /dev/null +++ b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/versioning/VersioningEditForm.java @@ -0,0 +1,259 @@ +package cz.zcu.kiv.crce.crce_webui_v2.versioning; + +import com.vaadin.data.util.BeanItemContainer; +import com.vaadin.event.ShortcutAction; +import com.vaadin.server.FontAwesome; +import com.vaadin.server.Page; +import com.vaadin.shared.Position; +import com.vaadin.shared.ui.MarginInfo; +import com.vaadin.ui.*; +import com.vaadin.ui.themes.ValoTheme; +import cz.zcu.kiv.crce.crce_component_versioning.api.bean.ComponentBean; +import cz.zcu.kiv.crce.crce_component_versioning.api.bean.ComponentDetailBean; +import cz.zcu.kiv.crce.crce_component_versioning.api.impl.VersioningService; +import cz.zcu.kiv.crce.crce_webui_v2.internal.Activator; +import cz.zcu.kiv.crce.crce_webui_v2.repository.classes.ResourceBean; +import cz.zcu.kiv.crce.crce_webui_v2.repository.services.ResourceService; +import cz.zcu.kiv.crce.crce_webui_v2.versioning.services.FindCompositeService; +import cz.zcu.kiv.crce.crce_webui_v2.webui.MyUI; + +import java.util.ArrayList; +import java.util.List; + +public class VersioningEditForm extends FormLayout { + public static final long serialVersionUID = -6571696339324055801L; + private Label labelDescription = new Label("Editing a collection."); + private TextField name = new TextField("name"); + private TextField version = new TextField("version"); + private Label labelStore = new Label("Artifact in Store"); + private Label labelVersioning = new Label("Composite component"); + private TextField idTextStore = new TextField(); + private TextField idTextVersioning = new TextField(); + private Grid gridStore = new Grid(); + private Grid gridVersioning = new Grid(); + private Grid newCompositeGrid = new Grid(); + private ResourceService resourceService; + private transient VersioningService versioningService; + private transient FindCompositeService findCompositeService; + private transient ResourceBean resourceBeanSelect; + private transient ComponentBean componentBeanSelect; + private transient ComponentBean newComponentBeanSelect; + + public VersioningEditForm(MyUI myUI, ComponentBean componentBeanTrans){ + VerticalLayout content = new VerticalLayout(); + VerticalLayout gridLeftLayout = new VerticalLayout(); + VerticalLayout gridRightLayout = new VerticalLayout(); + HorizontalLayout gridLayout = new HorizontalLayout(); + + resourceService = new ResourceService(Activator.instance().getMetadataService()); + findCompositeService = new FindCompositeService(); + + gridStore.setContainerDataSource(new BeanItemContainer<>(ResourceBean.class, + resourceService.getAllResourceBeanFromStore(myUI.getSession()))); + gridStore.getColumn("resource").setHidden(true); + gridStore.getColumn("size").setHidden(true); + gridStore.getColumn("symbolicName").setHidden(true); + gridStore.getColumn("categories").setHidden(true); + gridStore.setColumnOrder("presentationName", "version"); + gridStore.addStyleName("my-style"); + + idTextStore.setInputPrompt("search by presentation name..."); + idTextStore.setWidth("270px"); + Button findStoreButton = new Button(FontAwesome.CHECK); + findStoreButton.addClickListener(e ->{ + gridStore.setContainerDataSource(new BeanItemContainer<>(ResourceBean.class, + resourceService.getFindResourceBeanFromStore(myUI.getSession(), idTextStore.getValue()))); + }); + Button clearStoreButton = new Button(FontAwesome.TIMES); + clearStoreButton.addClickListener(e -> { + idTextStore.clear(); + gridStore.setContainerDataSource(new BeanItemContainer<>(ResourceBean.class, + resourceService.getAllResourceBeanFromStore(myUI.getSession()))); + }); + + CssLayout filteringStore = new CssLayout(); + filteringStore.setStyleName(ValoTheme.LAYOUT_COMPONENT_GROUP); + filteringStore.addComponents(idTextStore, findStoreButton, clearStoreButton); + + Button addFromStoreButton = new Button("Add artifact"); + addFromStoreButton.setEnabled(false); + gridLeftLayout.addComponents(labelStore, filteringStore, gridStore, addFromStoreButton); + gridLeftLayout.setComponentAlignment(addFromStoreButton, Alignment.BOTTOM_CENTER); + gridLeftLayout.setSpacing(true); + + versioningService = new VersioningService(); + gridVersioning.setContainerDataSource(new BeanItemContainer<>(ComponentBean.class, + versioningService.getCompositeComponentAll())); + gridVersioning.getColumn("id").setHidden(true); + gridVersioning.getColumn("composite").setHidden(true); + gridVersioning.setColumnOrder("name", "version"); + gridVersioning.addStyleName("my-style"); + + idTextVersioning.setInputPrompt("search by name..."); + idTextVersioning.setWidth("270px"); + Button findVersioningButton = new Button(FontAwesome.CHECK); + findVersioningButton.addClickListener(e ->{ + gridVersioning.setContainerDataSource(new BeanItemContainer<>(ComponentBean.class, + findCompositeService.getFindComponentBean(idTextVersioning.getValue()))); + }); + Button clearVersioningButton = new Button(FontAwesome.TIMES); + clearVersioningButton.addClickListener(e -> { + idTextVersioning.clear(); + gridVersioning.setContainerDataSource(new BeanItemContainer<>(ComponentBean.class, + versioningService.getCompositeComponentAll())); + }); + + CssLayout filteringVersioning = new CssLayout(); + filteringVersioning.setStyleName(ValoTheme.LAYOUT_COMPONENT_GROUP); + filteringVersioning.addComponents(idTextVersioning, findVersioningButton, clearVersioningButton); + + Button addFromVersioningButton = new Button("Add composite"); + addFromVersioningButton.setEnabled(false); + gridRightLayout.addComponents(labelVersioning, filteringVersioning, gridVersioning, addFromVersioningButton); + gridRightLayout.setComponentAlignment(addFromVersioningButton, Alignment.BOTTOM_CENTER); + gridRightLayout.setSpacing(true); + + gridLayout.addComponents(gridLeftLayout,gridRightLayout); + gridLayout.setSpacing(true); + gridLayout.setSizeFull(); + gridStore.setSizeFull(); + gridVersioning.setSizeFull(); + gridLayout.setExpandRatio(gridLeftLayout, 1); + gridLayout.setExpandRatio(gridRightLayout, 1); + + content.setMargin(new MarginInfo(false,true)); + content.setSpacing(true); + + List newComponentList = new ArrayList<>(); + // fill list + for(String s : versioningService.getCompositeComponentDetail(componentBeanTrans.getId()).getContent()){ + // is a composite component + ComponentDetailBean componentDetailBeanTrans = versioningService.getCompositeComponentDetail(s); + if(componentDetailBeanTrans != null){ + newComponentList.add(new ComponentBean(componentDetailBeanTrans.getId(), componentDetailBeanTrans.getName(), + componentDetailBeanTrans.getVersion(), true)); + } + // is an artifact in the store + else{ + for(ResourceBean resourceBean : resourceService.getAllResourceBeanFromStore(myUI.getSession())){ + if(resourceBean.getResource().getId().equals(s)){ + newComponentList.add(new ComponentBean(resourceBean.getResource().getId(), + resourceBean.getPresentationName(), resourceBean.getVersion(), false)); + break; + } + } + } + } + newCompositeGrid.setContainerDataSource(new BeanItemContainer<>(ComponentBean.class, newComponentList)); + newCompositeGrid.getColumn("id").setHidden(true); + newCompositeGrid.setColumnOrder("name", "version", "composite"); + newCompositeGrid.addStyleName("my-style"); + newCompositeGrid.setSizeFull(); + + HorizontalLayout buttonLayout = new HorizontalLayout(); + buttonLayout.setSpacing(true); + Button saveButton = new Button("Save"); + saveButton.setStyleName(ValoTheme.BUTTON_PRIMARY); + saveButton.setWidth("100px"); + saveButton.setClickShortcut(ShortcutAction.KeyCode.ENTER); + Button removeButton = new Button("Remove"); + removeButton.setEnabled(false); + buttonLayout.addComponents(saveButton, removeButton); + name.setWidth("270px"); + name.setValue(componentBeanTrans.getName()); + version.setWidth("270px"); + version.setValue(componentBeanTrans.getVersion()); + content.addComponents(labelDescription, name, version, gridLayout, newCompositeGrid, buttonLayout); + content.setComponentAlignment(buttonLayout,Alignment.BOTTOM_CENTER); + + gridStore.addSelectionListener(e ->{ + if(!e.getSelected().isEmpty()){ + resourceBeanSelect = (ResourceBean)e.getSelected().iterator().next(); + addFromStoreButton.setEnabled(true); + } + else{ + resourceBeanSelect = null; + } + }); + + gridVersioning.addSelectionListener(e ->{ + if(!e.getSelected().isEmpty()){ + componentBeanSelect = (ComponentBean)e.getSelected().iterator().next(); + addFromVersioningButton.setEnabled(true); + } + else{ + componentBeanSelect = null; + } + }); + + newCompositeGrid.addSelectionListener(e ->{ + if(!e.getSelected().isEmpty()){ + newComponentBeanSelect = (ComponentBean)e.getSelected().iterator().next(); + removeButton.setEnabled(true); + } + else{ + newComponentBeanSelect = null; + } + }); + + + addFromStoreButton.addClickListener(e ->{ + if(resourceBeanSelect != null){ + boolean contains = false; + for(ComponentBean cb : newComponentList){ + if(resourceBeanSelect.getResource().getId() == cb.getId()){ + contains = true; + } + } + if(!contains){ + newComponentList.add(new ComponentBean(resourceBeanSelect.getResource().getId(), + resourceBeanSelect.getPresentationName(), resourceBeanSelect.getVersion(), false)); + + newCompositeGrid.setContainerDataSource(new BeanItemContainer<>(ComponentBean.class, newComponentList)); + newCompositeGrid.clearSortOrder(); + } + } + }); + + addFromVersioningButton.addClickListener(e ->{ + if(componentBeanSelect != null){ + newComponentList.add(componentBeanSelect); + + newCompositeGrid.setContainerDataSource(new BeanItemContainer<>(ComponentBean.class, newComponentList)); + newCompositeGrid.clearSortOrder(); + } + }); + + removeButton.addClickListener(e ->{ + if(newComponentBeanSelect != null){ + newComponentList.remove(newComponentBeanSelect); + + newCompositeGrid.setContainerDataSource(new BeanItemContainer<>(ComponentBean.class, newComponentList)); + newCompositeGrid.clearSortOrder(); + } + }); + + saveButton.addClickListener(e ->{ + List idList = new ArrayList<>(); + for(ComponentBean cb: newComponentList){ + idList.add(cb.getId()); + } + boolean status = versioningService.updateCompositeComponent(componentBeanTrans.getId(), name.getValue(), + version.getValue(), idList); + if(status){ + Notification notif = new Notification("Info", "The collection has been updated " + + "successfully.", Notification.Type.ASSISTIVE_NOTIFICATION); + notif.setPosition(Position.TOP_RIGHT); + notif.show(Page.getCurrent()); + + } + else{ + new Notification("Error updating collection.", Notification.Type.WARNING_MESSAGE) + .show(Page.getCurrent()); + } + myUI.setContentBodyVersioning(); + }); + + addComponent(content); + } +} diff --git a/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/versioning/VersioningForm.java b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/versioning/VersioningForm.java new file mode 100644 index 00000000..1f0970d6 --- /dev/null +++ b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/versioning/VersioningForm.java @@ -0,0 +1,240 @@ +package cz.zcu.kiv.crce.crce_webui_v2.versioning; + +import com.vaadin.data.util.BeanItemContainer; +import com.vaadin.event.ShortcutAction; +import com.vaadin.server.FontAwesome; +import com.vaadin.server.Page; +import com.vaadin.server.VaadinSession; +import com.vaadin.shared.Position; +import com.vaadin.shared.ui.MarginInfo; +import com.vaadin.ui.*; +import com.vaadin.ui.themes.ValoTheme; +import cz.zcu.kiv.crce.crce_component_versioning.api.bean.ComponentBean; +import cz.zcu.kiv.crce.crce_component_versioning.api.bean.ComponentDetailBean; +import cz.zcu.kiv.crce.crce_component_versioning.api.impl.VersioningService; +import cz.zcu.kiv.crce.crce_webui_v2.internal.Activator; +import cz.zcu.kiv.crce.crce_webui_v2.repository.classes.ResourceBean; +import cz.zcu.kiv.crce.crce_webui_v2.repository.services.ResourceService; +import cz.zcu.kiv.crce.crce_webui_v2.versioning.services.FindCompositeService; +import cz.zcu.kiv.crce.crce_webui_v2.versioning.classes.RandomStringGenerator; +import cz.zcu.kiv.crce.crce_webui_v2.webui.MyUI; + +public class VersioningForm extends FormLayout { + private static final long serialVersionUID = 7439970261502810719L; + private Label labelForm = new Label("Composite components"); + private TextField idText = new TextField(); + private Panel panelGridComponents = new Panel("Detail of the composite component"); + private Grid gridComponents = new Grid(); + private Tree treeDetailComponent = new Tree(); + private PopupView popupRemove; + private PopupView popupCopy; + private ResourceService resourceService; + private transient VersioningService versioningService; + private transient FindCompositeService findCompositeService; + private transient ComponentBean componentBeanSelect; + private transient RandomStringGenerator randomStringGenerator; + + public VersioningForm(MyUI myUI){ + VerticalLayout content = new VerticalLayout(); + VerticalLayout formLayout = new VerticalLayout(); + HorizontalLayout gridTreeLayout = new HorizontalLayout(); + HorizontalLayout buttonLayout = new HorizontalLayout(); + + findCompositeService = new FindCompositeService(); + versioningService = new VersioningService(); + resourceService = new ResourceService(Activator.instance().getMetadataService()); + randomStringGenerator = new RandomStringGenerator(); + + Button buttonEdit = new Button("Edit"); + buttonEdit.setWidth("100px"); + Button buttonCopy = new Button("Copy"); + buttonCopy.setWidth("100px"); + Button buttonRemove = new Button("Remove"); + + buttonEdit.setStyleName(ValoTheme.BUTTON_PRIMARY); + buttonEdit.setClickShortcut(ShortcutAction.KeyCode.ENTER); + + labelForm.addStyleName(ValoTheme.LABEL_BOLD); + + idText.setInputPrompt("search by name..."); + idText.setWidth("270px"); + + Button findButton = new Button(FontAwesome.CHECK); + findButton.addClickListener(e ->{ + gridComponents.setContainerDataSource(new BeanItemContainer<>(ComponentBean.class, + findCompositeService.getFindComponentBean(idText.getValue()))); + }); + + Button clearButton = new Button(FontAwesome.TIMES); + clearButton.addClickListener(e -> { + idText.clear(); + gridComponents.setContainerDataSource(new BeanItemContainer<>(ComponentBean.class, + versioningService.getCompositeComponentAll())); + }); + + CssLayout filtering = new CssLayout(); + filtering.setStyleName(ValoTheme.LAYOUT_COMPONENT_GROUP); + filtering.addComponents(idText, findButton, clearButton); + + panelGridComponents.setVisible(false); + + gridComponents.setContainerDataSource(new BeanItemContainer<>(ComponentBean.class, + versioningService.getCompositeComponentAll())); + gridComponents.getColumn("id").setHidden(true); + gridComponents.getColumn("composite").setHidden(true); + gridComponents.setColumnOrder("name", "version"); + gridComponents.addStyleName("my-style"); + + panelGridComponents.setContent(treeDetailComponent); + panelGridComponents.setHeight("400px"); + gridTreeLayout.addComponents(gridComponents, panelGridComponents); + gridTreeLayout.setSpacing(true); + gridTreeLayout.setSizeFull(); + + gridComponents.setSizeFull(); + treeDetailComponent.setSizeFull(); + gridTreeLayout.setExpandRatio(gridComponents, 1); + gridTreeLayout.setExpandRatio(panelGridComponents, 1); + + HorizontalLayout popupLayout = new HorizontalLayout(); + + // Popup verification of component remove + VerticalLayout buttonPopupLayoutRemove = new VerticalLayout(); + Panel panelRemove = new Panel("Really remove the artifact?"); + Button yesRemoveButton = new Button("Confirm"); + yesRemoveButton.setStyleName(ValoTheme.BUTTON_DANGER); + buttonPopupLayoutRemove.addComponents(yesRemoveButton); + buttonPopupLayoutRemove.setMargin(true); + buttonPopupLayoutRemove.setSizeFull(); + buttonPopupLayoutRemove.setComponentAlignment(yesRemoveButton, Alignment.BOTTOM_CENTER); + panelRemove.setContent(buttonPopupLayoutRemove); + + popupRemove = new PopupView(null, panelRemove); + popupRemove.setWidth("150px"); + + // Popup copy set artifact + VerticalLayout buttonPopupLayoutCopy = new VerticalLayout(); + Panel panelCopy = new Panel("Input the version of the set."); + TextField textVersionSet = new TextField(); + Button saveVersionButton = new Button("Save"); + saveVersionButton.setStyleName(ValoTheme.BUTTON_PRIMARY); + buttonPopupLayoutCopy.addComponents(textVersionSet, saveVersionButton); + buttonPopupLayoutCopy.setMargin(true); + buttonPopupLayoutCopy.setSpacing(true); + buttonPopupLayoutCopy.setSizeFull(); + buttonPopupLayoutCopy.setComponentAlignment(saveVersionButton, Alignment.BOTTOM_CENTER); + panelCopy.setContent(buttonPopupLayoutCopy); + + popupCopy = new PopupView(null, panelCopy); + popupCopy.setWidth("250px"); + + buttonLayout.addComponents(buttonEdit, buttonCopy, buttonRemove); + buttonLayout.setSpacing(true); + buttonLayout.setVisible(false); + + formLayout.addComponents(labelForm, filtering, gridTreeLayout); + formLayout.setSpacing(true); + + popupLayout.addComponents(popupCopy, popupRemove); + popupLayout.addStyleName("margin-top: -10px"); + + content.addComponents(formLayout, buttonLayout, popupLayout); + //content.setComponentAlignment(buttonLayout, Alignment.BOTTOM_LEFT); + content.setMargin(new MarginInfo(false, true)); + content.setSpacing(true); + + gridComponents.addSelectionListener(e ->{ + if(!e.getSelected().isEmpty()){ + componentBeanSelect = (ComponentBean)e.getSelected().iterator().next(); + treeDetailComponent = new Tree(); + fillTreeDetailComponent(componentBeanSelect.getId(), null, myUI.getSession()); + treeDetailComponent.setSelectable(false); + panelGridComponents.setContent(treeDetailComponent); + panelGridComponents.setVisible(true); + buttonLayout.setVisible(true); + } + else{ + treeDetailComponent = new Tree(); + componentBeanSelect = null; + panelGridComponents.setVisible(false); + buttonLayout.setVisible(false); + } + }); + + buttonRemove.addClickListener(e ->{ + popupRemove.setPopupVisible(true); + yesRemoveButton.addClickListener(ev ->{ + boolean result = versioningService.removeCompositeComponent(componentBeanSelect.getId()); + if(result){ + Notification notif = new Notification("Info", "Collection sucess removed.", + Notification.Type.ASSISTIVE_NOTIFICATION); + notif.setPosition(Position.TOP_RIGHT); + notif.show(Page.getCurrent()); + } + else{ + new Notification("Could not remove collection", Notification.Type.WARNING_MESSAGE) + .show(Page.getCurrent()); + } + myUI.setContentBodyVersioning(); + }); + }); + + buttonCopy.addClickListener(e ->{ + popupCopy.setPopupVisible(true); + textVersionSet.setValue(componentBeanSelect.getVersion()); + saveVersionButton.addClickListener(ev ->{ + boolean result = versioningService.setCompositeComponent(componentBeanSelect.getName(), + textVersionSet.getValue(), + versioningService.getCompositeComponentDetail(componentBeanSelect.getId()).getContent()); + if(result){ + Notification notif = new Notification("Info", "Copy collection is success saved.", + Notification.Type.ASSISTIVE_NOTIFICATION); + notif.setPosition(Position.TOP_RIGHT); + notif.show(Page.getCurrent()); + } + else{ + new Notification("Could not save new version of collection", Notification.Type.WARNING_MESSAGE) + .show(Page.getCurrent()); + } + myUI.setContentBodyVersioning(); + }); + }); + + buttonEdit.addClickListener(e -> { + myUI.setContentBodyVersioningEdit(componentBeanSelect); + }); + + addComponent(content); + } + + void fillTreeDetailComponent(String idComponent, String parent, VaadinSession session){ + ComponentDetailBean componentDetailBean = versioningService.getCompositeComponentDetail(idComponent); + + if(componentDetailBean != null) { + String item = componentDetailBean.getName() + "_" + randomStringGenerator.getRandomString(); + treeDetailComponent.addItem(item); + treeDetailComponent.setItemCaption(item, componentDetailBean.getName() + + " (" + componentDetailBean.getVersion() + ")"); + // off the root + if(parent != null){ + treeDetailComponent.setParent(item, parent); + } + for(String s : componentDetailBean.getContent()){ + fillTreeDetailComponent(s, item, session); + } + } + // artefact in store + else{ + for (ResourceBean resourceBean : resourceService.getAllResourceBeanFromStore(session)) { + if (resourceBean.getResource().getId().equals(idComponent)) { + String item = resourceBean.getPresentationName() + "_" + randomStringGenerator.getRandomString(); + treeDetailComponent.addItem(item); + treeDetailComponent.setItemCaption(item, + resourceBean.getPresentationName() + " (" + resourceBean.getVersion() + ")"); + treeDetailComponent.setParent(item, parent); + treeDetailComponent.setChildrenAllowed(item, false); + } + } + } + } +} diff --git a/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/versioning/VersioningNewForm.java b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/versioning/VersioningNewForm.java new file mode 100644 index 00000000..a5101ec8 --- /dev/null +++ b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/versioning/VersioningNewForm.java @@ -0,0 +1,236 @@ +package cz.zcu.kiv.crce.crce_webui_v2.versioning; + +import com.vaadin.data.util.BeanItemContainer; +import com.vaadin.event.ShortcutAction; +import com.vaadin.server.FontAwesome; +import com.vaadin.server.Page; +import com.vaadin.shared.Position; +import com.vaadin.shared.ui.MarginInfo; +import com.vaadin.ui.*; +import com.vaadin.ui.themes.ValoTheme; +import cz.zcu.kiv.crce.crce_component_versioning.api.bean.ComponentBean; +import cz.zcu.kiv.crce.crce_component_versioning.api.impl.VersioningService; +import cz.zcu.kiv.crce.crce_webui_v2.internal.Activator; +import cz.zcu.kiv.crce.crce_webui_v2.repository.classes.ResourceBean; +import cz.zcu.kiv.crce.crce_webui_v2.repository.services.ResourceService; +import cz.zcu.kiv.crce.crce_webui_v2.versioning.services.FindCompositeService; +import cz.zcu.kiv.crce.crce_webui_v2.webui.MyUI; + +import java.util.ArrayList; +import java.util.List; + +public class VersioningNewForm extends FormLayout{ + private static final long serialVersionUID = 3539728975121021002L; + private Label labelDescription = new Label("Add a new collection"); + private TextField name = new TextField("name"); + private TextField version = new TextField("version"); + private Label labelStore = new Label("Artifact in Store"); + private Label labelVersioning = new Label("Composite component"); + private TextField idTextStore = new TextField(); + private TextField idTextVersioning = new TextField(); + private Grid gridStore = new Grid(); + private Grid gridVersioning = new Grid(); + private Grid newCompositeGrid = new Grid(); + private ResourceService resourceService; + private transient VersioningService versioningService; + private transient FindCompositeService findCompositeService; + private transient ResourceBean resourceBeanSelect; + private transient ComponentBean componentBeanSelect; + private transient ComponentBean newComponentBeanSelect; + + public VersioningNewForm(MyUI myUI){ + VerticalLayout content = new VerticalLayout(); + VerticalLayout gridLeftLayout = new VerticalLayout(); + VerticalLayout gridRightLayout = new VerticalLayout(); + HorizontalLayout gridLayout = new HorizontalLayout(); + + resourceService = new ResourceService(Activator.instance().getMetadataService()); + findCompositeService = new FindCompositeService(); + + gridStore.setContainerDataSource(new BeanItemContainer<>(ResourceBean.class, + resourceService.getAllResourceBeanFromStore(myUI.getSession()))); + gridStore.getColumn("resource").setHidden(true); + gridStore.getColumn("size").setHidden(true); + gridStore.getColumn("symbolicName").setHidden(true); + gridStore.getColumn("categories").setHidden(true); + gridStore.setColumnOrder("presentationName", "version"); + gridStore.addStyleName("my-style"); + + idTextStore.setInputPrompt("search by presentation name..."); + idTextStore.setWidth("270px"); + Button findStoreButton = new Button(FontAwesome.CHECK); + findStoreButton.addClickListener(e ->{ + gridStore.setContainerDataSource(new BeanItemContainer<>(ResourceBean.class, + resourceService.getFindResourceBeanFromStore(myUI.getSession(), idTextStore.getValue()))); + }); + Button clearStoreButton = new Button(FontAwesome.TIMES); + clearStoreButton.addClickListener(e -> { + idTextStore.clear(); + gridStore.setContainerDataSource(new BeanItemContainer<>(ResourceBean.class, + resourceService.getAllResourceBeanFromStore(myUI.getSession()))); + }); + + CssLayout filteringStore = new CssLayout(); + filteringStore.setStyleName(ValoTheme.LAYOUT_COMPONENT_GROUP); + filteringStore.addComponents(idTextStore, findStoreButton, clearStoreButton); + + Button addFromStoreButton = new Button("Add artifact"); + addFromStoreButton.setEnabled(false); + gridLeftLayout.addComponents(labelStore, filteringStore, gridStore, addFromStoreButton); + gridLeftLayout.setComponentAlignment(addFromStoreButton, Alignment.BOTTOM_CENTER); + gridLeftLayout.setSpacing(true); + + versioningService = new VersioningService(); + gridVersioning.setContainerDataSource(new BeanItemContainer<>(ComponentBean.class, + versioningService.getCompositeComponentAll())); + gridVersioning.getColumn("id").setHidden(true); + gridVersioning.getColumn("composite").setHidden(true); + gridVersioning.setColumnOrder("name", "version"); + gridVersioning.addStyleName("my-style"); + + idTextVersioning.setInputPrompt("search by name..."); + idTextVersioning.setWidth("270px"); + Button findVersioningButton = new Button(FontAwesome.CHECK); + findVersioningButton.addClickListener(e ->{ + gridVersioning.setContainerDataSource(new BeanItemContainer<>(ComponentBean.class, + findCompositeService.getFindComponentBean(idTextVersioning.getValue()))); + }); + Button clearVersioningButton = new Button(FontAwesome.TIMES); + clearVersioningButton.addClickListener(e -> { + idTextVersioning.clear(); + gridVersioning.setContainerDataSource(new BeanItemContainer<>(ComponentBean.class, + versioningService.getCompositeComponentAll())); + }); + + CssLayout filteringVersioning = new CssLayout(); + filteringVersioning.setStyleName(ValoTheme.LAYOUT_COMPONENT_GROUP); + filteringVersioning.addComponents(idTextVersioning, findVersioningButton, clearVersioningButton); + + Button addFromVersioningButton = new Button("Add composite"); + addFromVersioningButton.setEnabled(false); + gridRightLayout.addComponents(labelVersioning, filteringVersioning, gridVersioning, addFromVersioningButton); + gridRightLayout.setComponentAlignment(addFromVersioningButton, Alignment.BOTTOM_CENTER); + gridRightLayout.setSpacing(true); + + gridLayout.addComponents(gridLeftLayout,gridRightLayout); + gridLayout.setSpacing(true); + gridLayout.setSizeFull(); + gridStore.setSizeFull(); + gridVersioning.setSizeFull(); + gridLayout.setExpandRatio(gridLeftLayout, 1); + gridLayout.setExpandRatio(gridRightLayout, 1); + + content.setMargin(new MarginInfo(false,true)); + content.setSpacing(true); + + List newComponentList = new ArrayList<>(); + newCompositeGrid.setContainerDataSource(new BeanItemContainer<>(ComponentBean.class, newComponentList)); + newCompositeGrid.getColumn("id").setHidden(true); + newCompositeGrid.setColumnOrder("name", "version", "composite"); + newCompositeGrid.addStyleName("my-style"); + newCompositeGrid.setSizeFull(); + + HorizontalLayout buttonLayout = new HorizontalLayout(); + buttonLayout.setSpacing(true); + Button saveButton = new Button("Save"); + saveButton.setStyleName(ValoTheme.BUTTON_PRIMARY); + saveButton.setWidth("100px"); + saveButton.setClickShortcut(ShortcutAction.KeyCode.ENTER); + Button removeButton = new Button("Remove"); + removeButton.setEnabled(false); + buttonLayout.addComponents(saveButton, removeButton); + name.setWidth("270px"); + version.setWidth("270px"); + content.addComponents(labelDescription, name, version, gridLayout, newCompositeGrid, buttonLayout); + content.setComponentAlignment(buttonLayout,Alignment.BOTTOM_CENTER); + + gridStore.addSelectionListener(e ->{ + if(!e.getSelected().isEmpty()){ + resourceBeanSelect = (ResourceBean)e.getSelected().iterator().next(); + addFromStoreButton.setEnabled(true); + } + else{ + resourceBeanSelect = null; + } + }); + + gridVersioning.addSelectionListener(e ->{ + if(!e.getSelected().isEmpty()){ + componentBeanSelect = (ComponentBean)e.getSelected().iterator().next(); + addFromVersioningButton.setEnabled(true); + } + else{ + componentBeanSelect = null; + } + }); + + newCompositeGrid.addSelectionListener(e ->{ + if(!e.getSelected().isEmpty()){ + newComponentBeanSelect = (ComponentBean)e.getSelected().iterator().next(); + removeButton.setEnabled(true); + } + else{ + newComponentBeanSelect = null; + } + }); + + + addFromStoreButton.addClickListener(e ->{ + if(resourceBeanSelect != null){ + boolean contains = false; + for(ComponentBean cb : newComponentList){ + if(resourceBeanSelect.getResource().getId() == cb.getId()){ + contains = true; + } + } + if(!contains){ + newComponentList.add(new ComponentBean(resourceBeanSelect.getResource().getId(), + resourceBeanSelect.getPresentationName(), resourceBeanSelect.getVersion(), false)); + + newCompositeGrid.setContainerDataSource(new BeanItemContainer<>(ComponentBean.class, newComponentList)); + newCompositeGrid.clearSortOrder(); + } + } + }); + + addFromVersioningButton.addClickListener(e ->{ + if(componentBeanSelect != null){ + newComponentList.add(componentBeanSelect); + + newCompositeGrid.setContainerDataSource(new BeanItemContainer<>(ComponentBean.class, newComponentList)); + newCompositeGrid.clearSortOrder(); + } + }); + + removeButton.addClickListener(e ->{ + if(newComponentBeanSelect != null){ + newComponentList.remove(newComponentBeanSelect); + + newCompositeGrid.setContainerDataSource(new BeanItemContainer<>(ComponentBean.class, newComponentList)); + newCompositeGrid.clearSortOrder(); + } + }); + + saveButton.addClickListener(e ->{ + List idList = new ArrayList<>(); + for(ComponentBean cb: newComponentList){ + idList.add(cb.getId()); + } + boolean status = versioningService.setCompositeComponent(name.getValue(), version.getValue(), idList); + if(status){ + Notification notif = new Notification("Info", "The new composite component has been " + + "successfully saved.", Notification.Type.ASSISTIVE_NOTIFICATION); + notif.setPosition(Position.TOP_RIGHT); + notif.show(Page.getCurrent()); + + } + else{ + new Notification("Error saving new composite component.", Notification.Type.WARNING_MESSAGE) + .show(Page.getCurrent()); + } + myUI.setContentBodyVersioningNew(); + }); + + addComponent(content); + } +} diff --git a/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/versioning/classes/RandomStringGenerator.java b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/versioning/classes/RandomStringGenerator.java new file mode 100644 index 00000000..42dd523f --- /dev/null +++ b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/versioning/classes/RandomStringGenerator.java @@ -0,0 +1,21 @@ +package cz.zcu.kiv.crce.crce_webui_v2.versioning.classes; + +import java.nio.charset.Charset; +import java.util.Random; + +public class RandomStringGenerator { + private Random random; + private byte[] array; + + public RandomStringGenerator() { + random = new Random(); + array = new byte[7]; // length is bounded by 7 + } + + public String getRandomString() { + random.nextBytes(array); + String generatedString = new String(array, Charset.forName("UTF-8")); + + return generatedString; + } +} diff --git a/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/versioning/services/FindCompositeService.java b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/versioning/services/FindCompositeService.java new file mode 100644 index 00000000..09f6350a --- /dev/null +++ b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/versioning/services/FindCompositeService.java @@ -0,0 +1,35 @@ +package cz.zcu.kiv.crce.crce_webui_v2.versioning.services; + +import cz.zcu.kiv.crce.crce_component_versioning.api.bean.ComponentBean; +import cz.zcu.kiv.crce.crce_component_versioning.api.impl.VersioningService; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +public class FindCompositeService { + public List getFindComponentBean(String stringFilter){ + boolean passesFilter = false; + VersioningService versioningService = new VersioningService(); + ArrayList arrayList = new ArrayList<>(); + for (ComponentBean componentBean : versioningService.getCompositeComponentAll()){ + if(stringFilter == null || stringFilter.isEmpty()){ + passesFilter = true; + } + else{ + passesFilter = componentBean.toString().toLowerCase().contains(stringFilter.toLowerCase()); + } + if (passesFilter) { + arrayList.add(componentBean); + } + } + Collections.sort(arrayList, new Comparator() { + @Override + public int compare(ComponentBean o1, ComponentBean o2) { + return (int) (o2.hashCode() - o1.hashCode()); + } + }); + return arrayList; + } +} diff --git a/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/webui/AboutForm.java b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/webui/AboutForm.java new file mode 100644 index 00000000..9a140a6b --- /dev/null +++ b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/webui/AboutForm.java @@ -0,0 +1,26 @@ +package cz.zcu.kiv.crce.crce_webui_v2.webui; + +import com.vaadin.shared.ui.label.ContentMode; +import com.vaadin.ui.FormLayout; +import com.vaadin.ui.Label; +import com.vaadin.ui.VerticalLayout; + +import cz.zcu.kiv.crce.crce_webui_v2.other.VersionInfo; + +@SuppressWarnings("serial") +public class AboutForm extends FormLayout{ + public AboutForm(){ + VerticalLayout content = new VerticalLayout(); + VersionInfo versionInfo = VersionInfo.getVersionInfo(); + + Label about = new Label("

University of West Bohemia, " + + "ReliSA research group, Version: " + versionInfo.getProductVersion() + + ", Build revision: " + versionInfo.getBuildRevision() + "

", ContentMode.HTML); + + content.setSpacing(false); + content.setMargin(false); + content.addComponent(about); + addComponent(content); + } +} diff --git a/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/webui/LoginForm.java b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/webui/LoginForm.java new file mode 100644 index 00000000..a7366121 --- /dev/null +++ b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/webui/LoginForm.java @@ -0,0 +1,75 @@ +package cz.zcu.kiv.crce.crce_webui_v2.webui; + +import com.vaadin.event.ShortcutAction.KeyCode; +import com.vaadin.shared.ui.MarginInfo; +import com.vaadin.shared.ui.label.ContentMode; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.FormLayout; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Label; +import com.vaadin.ui.Panel; +import com.vaadin.ui.PasswordField; +import com.vaadin.ui.TextField; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.themes.ValoTheme; + +@SuppressWarnings("serial") +public class LoginForm extends FormLayout{ + private Panel panel = new Panel("CRCE - Signing in"); + private TextField login = new TextField("Name"); + private PasswordField password = new PasswordField("Password"); + private Button loginButton = new Button("Log in"); + private Button guestButton = new Button("Guest"); + private Label error = new Label(); + private HorizontalLayout loginFormLayout = new HorizontalLayout(); + private HorizontalLayout submitErrorLayout = new HorizontalLayout(); + private VerticalLayout panelLayout = new VerticalLayout(); + private VerticalLayout content = new VerticalLayout(); + + public LoginForm(MyUI myUI) { + + loginButton.setStyleName(ValoTheme.BUTTON_PRIMARY); + loginButton.setClickShortcut(KeyCode.ENTER); + + login.setWidth("220px"); + password.setWidth("220px"); + + loginFormLayout.addComponents(login, password); + loginFormLayout.setSpacing(true); + + submitErrorLayout.addComponents(loginButton, guestButton, error); + submitErrorLayout.setSpacing(true); + + panelLayout.addComponents(loginFormLayout, submitErrorLayout); + panelLayout.setMargin(new MarginInfo(true, true)); + panelLayout.setSpacing(true); + panel.setContent(panelLayout); + panel.setWidth("500px"); + panel.setHeight("200px"); + content.setSizeFull(); + content.addComponent(panel); + content.setComponentAlignment(panel, Alignment.MIDDLE_CENTER); + + loginButton.addClickListener(e -> { + + // kontrola vstupu např. volání služby apod. + // v případě neúspěchu doplnění error hlášky např: + submitErrorLayout.removeComponent(error); + error = new Label("

Incorrect login

", + ContentMode.HTML); + submitErrorLayout.addComponent(error); + + // v případě úspěchu: + /*myUI.getSession().setAttribute("singed", login.getValue()); + myUI.loginExistSession();*/ + }); + + guestButton.addClickListener(e -> { + myUI.getSession().setAttribute("singed", "guest"); + myUI.loginExistSession(); + }); + + addComponent(content); + } +} diff --git a/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/webui/LogoBackground.java b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/webui/LogoBackground.java new file mode 100644 index 00000000..25f09ad6 --- /dev/null +++ b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/webui/LogoBackground.java @@ -0,0 +1,14 @@ +package cz.zcu.kiv.crce.crce_webui_v2.webui; + +import com.vaadin.shared.ui.label.ContentMode; +import com.vaadin.ui.FormLayout; +import com.vaadin.ui.Label; + +@SuppressWarnings("serial") +public class LogoBackground extends FormLayout{ + public LogoBackground(){ + Label logoBackground = new Label("

CRCE

",ContentMode.HTML); + addComponent(logoBackground); + } +} diff --git a/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/webui/MenuForm.java b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/webui/MenuForm.java new file mode 100644 index 00000000..e41c58ba --- /dev/null +++ b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/webui/MenuForm.java @@ -0,0 +1,69 @@ +package cz.zcu.kiv.crce.crce_webui_v2.webui; + +import com.vaadin.annotations.StyleSheet; +import com.vaadin.shared.ui.MarginInfo; +import com.vaadin.shared.ui.label.ContentMode; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.FormLayout; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Label; +import com.vaadin.ui.MenuBar; +import com.vaadin.ui.MenuBar.MenuItem; + +@SuppressWarnings("serial") +@StyleSheet("https://fonts.googleapis.com/css?family=Fredoka+One") +public class MenuForm extends FormLayout{ + public MenuForm(MyUI myUI) { + HorizontalLayout headHL = new HorizontalLayout(); + HorizontalLayout menuHL = new HorizontalLayout(); + Label logo = new Label("

CRCE UI

",ContentMode.HTML); + MenuBar menu = new MenuBar(); + MenuItem upload = menu.addItem("Upload", null); + MenuItem repository = menu.addItem("Repository", null); + MenuItem versioning = menu.addItem("Versioning",null); + MenuItem settings = menu.addItem("Settings", null); + + // submenu upload + upload.addItem("Local", e ->{myUI.setContentBodyLocalMaven();}); + upload.addItem("Central", e ->{myUI.setContentBodyCentralMaven();}); + upload.addItem("Defined", e ->{myUI.setContentBodyDefinedMaven();}); + upload.addItem("File/url", e ->{myUI.setContentBodyLoadFile();}); + + // submenu repository + repository.addItem("Buffer", e ->{myUI.setContentBodyBuffer();}); + repository.addItem("Store", e->{myUI.setContentBodyStore();}); + repository.addItem("Plugins", e ->{myUI.setContentBodyPlugins();}); + + // submenu versionng + versioning.addItem("New component", e ->{myUI.setContentBodyVersioningNew();}); + versioning.addItem("List component", e -> {myUI.setContentBodyVersioning();}); + + // submenu settings + settings.addItem("Index", e ->{myUI.setContentBodyCheckMavenIndexForm();}); + settings.addItem("Paths", e ->{myUI.setContentSettings();}); + + // Menu login + MenuBar menuLogin = new MenuBar(); + MenuItem menuItemLogin = menuLogin.addItem(myUI.getSession().getAttribute("singed").toString(), null); + menuItemLogin.addItem("Logout", e ->{ + myUI.getSession().setAttribute("singed", null); + myUI.logout(); + }); + + menuHL.addComponents(logo, menu); + menuHL.setComponentAlignment(menu, Alignment.MIDDLE_LEFT); + menuHL.setSpacing(true); + + headHL.addComponents(menuHL, menuLogin); + //Alignment.BOTTOM_RIGHT + headHL.setComponentAlignment(menuHL,Alignment.MIDDLE_LEFT); + headHL.setComponentAlignment(menuLogin,Alignment.MIDDLE_RIGHT); + headHL.setSizeFull(); + + //headHL.setSpacing(true); + headHL.setMargin(new MarginInfo(false,true,false,false)); + headHL.setSpacing(true); + addComponent(headHL); + } +} diff --git a/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/webui/MyUI.java b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/webui/MyUI.java new file mode 100644 index 00000000..f089dea4 --- /dev/null +++ b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/webui/MyUI.java @@ -0,0 +1,184 @@ +package cz.zcu.kiv.crce.crce_webui_v2.webui; + +import javax.servlet.annotation.WebServlet; + +import com.vaadin.annotations.Push; +import com.vaadin.annotations.Theme; +import com.vaadin.annotations.VaadinServletConfiguration; +import com.vaadin.server.Page; +import com.vaadin.server.VaadinRequest; +import com.vaadin.server.VaadinServlet; +import com.vaadin.ui.Panel; +import com.vaadin.ui.UI; +import com.vaadin.ui.VerticalLayout; + +import cz.zcu.kiv.crce.crce_component_versioning.api.bean.ComponentBean; +import cz.zcu.kiv.crce.crce_webui_v2.internal.Activator; +import cz.zcu.kiv.crce.crce_webui_v2.outer.CentralMavenForm; +import cz.zcu.kiv.crce.crce_webui_v2.outer.CheckMavenIndexForm; +import cz.zcu.kiv.crce.crce_webui_v2.outer.DefinedMavenForm; +import cz.zcu.kiv.crce.crce_webui_v2.outer.LoadFileForm; +import cz.zcu.kiv.crce.crce_webui_v2.outer.LocalMavenForm; +import cz.zcu.kiv.crce.crce_webui_v2.repository.ArtefactDetailForm; +import cz.zcu.kiv.crce.crce_webui_v2.repository.BufferForm; +import cz.zcu.kiv.crce.crce_webui_v2.repository.PluginsForm; +import cz.zcu.kiv.crce.crce_webui_v2.repository.StoreForm; +import cz.zcu.kiv.crce.crce_webui_v2.repository.classes.ResourceBean; +import cz.zcu.kiv.crce.crce_webui_v2.repository.services.ResourceService; +import cz.zcu.kiv.crce.crce_webui_v2.versioning.VersioningEditForm; +import cz.zcu.kiv.crce.crce_webui_v2.versioning.VersioningForm; +import cz.zcu.kiv.crce.crce_webui_v2.versioning.VersioningNewForm; + + +/** + * This UI is the application entry point. A UI may either represent a browser window + * (or tab) or some part of a html page where a Vaadin application is embedded. + *

+ * The UI is initialized using {@link #init(VaadinRequest)}. This method is intended to be + * overridden to add component to the user interface and initialize non-component functionality. + */ +@SuppressWarnings("serial") +@Theme("mytheme") +@Push +public class MyUI extends UI { + private Panel head = new Panel(); + private Panel body = new Panel(); + private Panel footer = new Panel(); + private LocalMavenForm localMavenForm; + private CentralMavenForm centralMavenForm; + private CheckMavenIndexForm checkMavenIndexFrom; + private DefinedMavenForm definedMavenForm; + private LoadFileForm loadFileForm; + private BufferForm bufferForm; + private StoreForm storeForm; + private VersioningForm versioningForm; + private VersioningNewForm versioningNewForm; + private VersioningEditForm versioningEditForm; + private ArtefactDetailForm artefactDetailForm; + private PluginsForm pluginsForm; + private SettingsForm settingsForm; + private VerticalLayout content = new VerticalLayout(); + + @Override + protected void init(VaadinRequest vaadinRequest) { + if (getSession().getAttribute("singed") != null) { + loginExistSession(); + } else { + loginNoSession(); + } + } + + @WebServlet(urlPatterns = "/*", name = "MyUIServlet", asyncSupported = true) + @VaadinServletConfiguration(ui = MyUI.class, productionMode = false) + public static class MyUIServlet extends VaadinServlet { + } + + public void loginExistSession() { + // menu components + MenuForm menu = new MenuForm(this); + menu.setMargin(false); + head.setContent(menu); + + // body components + LogoBackground logoBackgroung = new LogoBackground(); + body.setContent(logoBackgroung); + + // about component + AboutForm about = new AboutForm(); + about.setMargin(false); + footer.setContent(about); + + // content components + content.setMargin(true); + content.setSpacing(true); + content.addComponents(head, body, footer); + setContent(content); + } + + public void loginNoSession(){ + LoginForm loginForm = new LoginForm(this); + setContent(loginForm); + } + + public void logout() { + // clear component + LoginForm loginForm = new LoginForm(this); + cleanupAfterLogout(); + setContent(loginForm); + } + + private void cleanupAfterLogout(){ + ResourceService resourceService = new ResourceService(Activator.instance().getMetadataService()); + resourceService.clearBuffer(getSession().getSession()); + getSession().setAttribute("settingsUrl", null); + getSession().getSession().invalidate(); + Page.getCurrent().setLocation(VaadinServlet.getCurrent().getServletContext().getContextPath()); + content.removeAllComponents(); + } + + public void setContentBodyLocalMaven(){ + localMavenForm = new LocalMavenForm(this); + body.setContent(localMavenForm); + } + + public void setContentBodyCentralMaven(){ + centralMavenForm = new CentralMavenForm(this); + body.setContent(centralMavenForm); + } + + public void setContentBodyCheckMavenIndexForm(){ + checkMavenIndexFrom = new CheckMavenIndexForm(this); + body.setContent(checkMavenIndexFrom); + } + + public void setContentBodyDefinedMaven(){ + definedMavenForm = new DefinedMavenForm(this); + body.setContent(definedMavenForm); + } + + public void setContentBodyLoadFile(){ + loadFileForm = new LoadFileForm(this); + body.setContent(loadFileForm); + } + + public void setContentBodyBuffer(){ + bufferForm = new BufferForm(this); + body.setContent(bufferForm); + } + + public void setContentBodyStore(){ + storeForm = new StoreForm(this); + body.setContent(storeForm); + } + + public void setContentBodyVersioning(){ + versioningForm = new VersioningForm(this); + body.setContent(versioningForm); + } + + public void setContentBodyVersioningNew(){ + versioningNewForm = new VersioningNewForm(this); + body.setContent(versioningNewForm); + } + + public void setContentBodyVersioningEdit(ComponentBean componentBean){ + versioningEditForm = new VersioningEditForm(this, componentBean); + body.setContent(versioningEditForm); + } + + public void setContentArtefactDetailForm(ResourceBean resourceBean, boolean isFromStore){ + artefactDetailForm = new ArtefactDetailForm(this, resourceBean, isFromStore); + body.setContent(artefactDetailForm); + } + + public void setContentBodyPlugins(){ + pluginsForm = new PluginsForm(this); + body.setContent(pluginsForm); + } + + public void setContentSettings(){ + settingsForm = new SettingsForm(this.getSession()); + body.setContent(settingsForm); + } +} + diff --git a/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/webui/SettingsForm.java b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/webui/SettingsForm.java new file mode 100644 index 00000000..f96249f7 --- /dev/null +++ b/modules/crce-webui-v2/src/main/java/cz/zcu/kiv/crce/crce_webui_v2/webui/SettingsForm.java @@ -0,0 +1,100 @@ +package cz.zcu.kiv.crce.crce_webui_v2.webui; + +import com.vaadin.event.ShortcutAction.KeyCode; +import com.vaadin.server.Page; +import com.vaadin.server.VaadinSession; +import com.vaadin.shared.Position; +import com.vaadin.shared.ui.MarginInfo; +import com.vaadin.ui.Button; +import com.vaadin.ui.CheckBox; +import com.vaadin.ui.FormLayout; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Notification; +import com.vaadin.ui.TextField; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.themes.ValoTheme; + +import cz.zcu.kiv.crce.crce_external_repository.api.SettingsUrl; + +//import cz.zcu.kiv.crce.crce_webui_vaadin.outer.classes.SettingsUrl; + +@SuppressWarnings("serial") +public class SettingsForm extends FormLayout { + + public SettingsForm() { + HorizontalLayout content = new HorizontalLayout(); + addComponent(content); + } + + public SettingsForm(VaadinSession session) { + TextField centralMavenUrl = new TextField("Central Maven url"); + TextField localAetherRepo = new TextField("Local Maven repository"); + CheckBox enableDeleteLocalMaven = new CheckBox("Enable delete local Maven repo"); + CheckBox enableGroupSearch = new CheckBox("Enable only group search"); + + centralMavenUrl.setWidth("400px"); + localAetherRepo.setWidth("400px"); + + // default value + + if (session.getAttribute("settingsUrl") == null) { + SettingsUrl settingsUrl = new SettingsUrl(); + centralMavenUrl.setValue(settingsUrl.getCentralMavenUrl()); + localAetherRepo.setValue(settingsUrl.getLocalAetherUrl()); + enableDeleteLocalMaven.setValue(false); + enableGroupSearch.setValue(false); + } else { + centralMavenUrl.setValue(((SettingsUrl) session.getAttribute("settingsUrl")).getCentralMavenUrl()); + localAetherRepo.setValue(((SettingsUrl) session.getAttribute("settingsUrl")).getLocalAetherUrl()); + enableDeleteLocalMaven.setValue(((SettingsUrl) session.getAttribute("settingsUrl")).isEnableDeleteLocalMaven()); + enableGroupSearch.setValue(((SettingsUrl) session.getAttribute("settingsUrl")).isEnableGroupSearch()); + } + + HorizontalLayout buttonsLayout = new HorizontalLayout(); + Button saveButton = new Button("Save"); + Button defaultButton = new Button("Default"); + buttonsLayout.addComponents(saveButton,defaultButton); + buttonsLayout.setSpacing(true); + + saveButton.setStyleName(ValoTheme.BUTTON_PRIMARY); + saveButton.setClickShortcut(KeyCode.ENTER); + + VerticalLayout content = new VerticalLayout(); + content.addComponents(centralMavenUrl, localAetherRepo, enableDeleteLocalMaven, enableGroupSearch, buttonsLayout); + content.setSpacing(true); + + HorizontalLayout formLayout = new HorizontalLayout(); + formLayout.addComponent(content); + formLayout.setMargin(new MarginInfo(false, true)); + + saveButton.addClickListener(e -> { + SettingsUrl settingsUrl; + if(getSession().getAttribute("settingsUrl") == null){ + settingsUrl = new SettingsUrl(); + } + else{ + settingsUrl = (SettingsUrl) getSession().getAttribute("settingsUrl"); + } + settingsUrl.setCentralMavenUrl(centralMavenUrl.getValue()); + settingsUrl.setLocalAetherUrl(localAetherRepo.getValue()); + settingsUrl.setEnableDeleteLocalMaven(enableDeleteLocalMaven.getValue()); + settingsUrl.setEnableGroupSearch(enableGroupSearch.getValue()); + getSession().setAttribute("settingsUrl", settingsUrl); + Notification notif = new Notification("Info", "Settings saved successfully" , + Notification.Type.ASSISTIVE_NOTIFICATION); + notif.setPosition(Position.TOP_RIGHT); + notif.show(Page.getCurrent()); + }); + + defaultButton.addClickListener(e ->{ + SettingsUrl settingsUrl = new SettingsUrl(); + getSession().setAttribute("settingsUrl", settingsUrl); + centralMavenUrl.setValue(settingsUrl.getCentralMavenUrl()); + localAetherRepo.setValue(settingsUrl.getLocalAetherUrl()); + enableDeleteLocalMaven.setValue(settingsUrl.isEnableDeleteLocalMaven()); + enableGroupSearch.setValue(settingsUrl.isEnableGroupSearch()); + }); + + addComponent(formLayout); + } +} diff --git a/modules/crce-webui-v2/src/main/resources/README b/modules/crce-webui-v2/src/main/resources/README new file mode 100644 index 00000000..faabc74a --- /dev/null +++ b/modules/crce-webui-v2/src/main/resources/README @@ -0,0 +1 @@ +Please add your static resources here diff --git a/modules/crce-webui-v2/src/main/webapp/VAADIN/themes/mytheme/addons.scss b/modules/crce-webui-v2/src/main/webapp/VAADIN/themes/mytheme/addons.scss new file mode 100644 index 00000000..a5670b70 --- /dev/null +++ b/modules/crce-webui-v2/src/main/webapp/VAADIN/themes/mytheme/addons.scss @@ -0,0 +1,7 @@ +/* This file is automatically managed and will be overwritten from time to time. */ +/* Do not manually edit this file. */ + +/* Import and include this mixin into your project theme to include the addon themes */ +@mixin addons { +} + diff --git a/modules/crce-webui-v2/src/main/webapp/VAADIN/themes/mytheme/favicon.ico b/modules/crce-webui-v2/src/main/webapp/VAADIN/themes/mytheme/favicon.ico new file mode 100644 index 00000000..ffb34a65 Binary files /dev/null and b/modules/crce-webui-v2/src/main/webapp/VAADIN/themes/mytheme/favicon.ico differ diff --git a/modules/crce-webui-v2/src/main/webapp/VAADIN/themes/mytheme/mytheme.scss b/modules/crce-webui-v2/src/main/webapp/VAADIN/themes/mytheme/mytheme.scss new file mode 100644 index 00000000..d40ce75d --- /dev/null +++ b/modules/crce-webui-v2/src/main/webapp/VAADIN/themes/mytheme/mytheme.scss @@ -0,0 +1,43 @@ +// If you edit this file you need to compile the theme. See README.md for details. + +// Global variable overrides. Must be declared before importing Valo. + +// Defines the plaintext font size, weight and family. Font size affects general component sizing. +//$v-font-size: 16px; +//$v-font-weight: 300; +//$v-font-family: "Open Sans", sans-serif; + +// Defines the border used by all components. +//$v-border: 1px solid (v-shade 0.7); +//$v-border-radius: 4px; + +// Affects the color of some component elements, e.g Button, Panel title, etc +//$v-background-color: hsl(210, 0%, 98%); +// Affects the color of content areas, e.g Panel and Window content, TextField input etc +//$v-app-background-color: $v-background-color; + +// Affects the visual appearance of all components +//$v-gradient: v-linear 8%; +//$v-bevel-depth: 30%; +//$v-shadow-opacity: 5%; + +// Defines colors for indicating status (focus, success, failure) +//$v-focus-color: valo-focus-color(); // Calculates a suitable color automatically +//$v-friendly-color: #2c9720; +//$v-error-indicator-color: #ed473b; + +// For more information, see: https://vaadin.com/book/-/page/themes.valo.html +// Example variants can be copy/pasted from https://vaadin.com/wiki/-/wiki/Main/Valo+Examples + +@import "../valo/valo.scss"; + +@mixin mytheme { + @include valo; + + // Insert your own theme rules here + + .my-style { + font-family: Verdana; + //font-weight: bold; + } +} diff --git a/modules/crce-webui-v2/src/main/webapp/VAADIN/themes/mytheme/styles.scss b/modules/crce-webui-v2/src/main/webapp/VAADIN/themes/mytheme/styles.scss new file mode 100644 index 00000000..29425c50 --- /dev/null +++ b/modules/crce-webui-v2/src/main/webapp/VAADIN/themes/mytheme/styles.scss @@ -0,0 +1,10 @@ +@import "mytheme.scss"; +@import "addons.scss"; + +// This file prefixes all rules with the theme name to avoid causing conflicts with other themes. +// The actual styles should be defined in mytheme.scss + +.mytheme { + @include addons; + @include mytheme; +} diff --git a/modules/crce-webui-v2/src/main/webapp/WEB-INF/web.xml b/modules/crce-webui-v2/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 00000000..a4999902 --- /dev/null +++ b/modules/crce-webui-v2/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,24 @@ + + + crce-webui_2 + + org.atmosphere.cpr.SessionSupport + true + + + productionMode + false + + + MyUIServlet + cz.zcu.kiv.crce.crce_webui_v2.webui.MyUI$MyUIServlet + + + MyUIServlet + /* + + + 30 + + diff --git a/modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/ResourceWrap.java b/modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/ResourceWrap.java deleted file mode 100644 index 36a43157..00000000 --- a/modules/crce-webui/src/main/java/cz/zcu/kiv/crce/webui/internal/custom/ResourceWrap.java +++ /dev/null @@ -1,482 +0,0 @@ -package cz.zcu.kiv.crce.webui.internal.custom; - -import java.net.URI; -import java.net.URL; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Set; - -import javax.annotation.Nonnull; - -import cz.zcu.kiv.crce.metadata.type.Version; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import cz.zcu.kiv.crce.metadata.Attribute; -import cz.zcu.kiv.crce.metadata.Capability; -import cz.zcu.kiv.crce.metadata.Requirement; -import cz.zcu.kiv.crce.metadata.Resource; -import cz.zcu.kiv.crce.metadata.osgi.namespace.NsOsgiBundle; -import cz.zcu.kiv.crce.metadata.service.MetadataService; -import cz.zcu.kiv.crce.webui.internal.legacy.NewProperty; -import cz.zcu.kiv.crce.webui.internal.legacy.Property; -import cz.zcu.kiv.crce.webui.internal.legacy.Type; - -abstract class ResourceWrap extends ResourceAdapter { - - private static final Logger logger = LoggerFactory.getLogger(ResourceWrap.class); - - protected Resource resource; - private final MetadataService metadataService; - - protected ResourceWrap(Resource r, MetadataService metadataService) { - this.resource = r; - this.metadataService = metadataService; - } - - @Override - public Property[] getProperties() { - Property[] properties; - List crceCapabilities = Collections.singletonList(metadataService.getIdentity(resource)); - - int crceSize = crceCapabilities.isEmpty() ? 0 : crceCapabilities.get(0).getAttributes().size(); - - properties = new Property[crceSize]; - int i = 0; - if (crceSize > 0) { - for (Attribute atr : crceCapabilities.get(0).getAttributes()) { - properties[i++] = new PropertyImpl(atr); - } - } - return properties; - } - - @Override - public NewProperty[] getNewProperties() { - List newProperties = resource.getProperties(); - NewProperty[] properties = new NewProperty[newProperties.size()]; - int i = 0; - for (cz.zcu.kiv.crce.metadata.Property newProperty : newProperties) { - properties[i++] = new NewPropertyImpl(newProperty); - } - return properties; - } - - @Override - public cz.zcu.kiv.crce.webui.internal.legacy.Capability[] getCapabilities() { - List capabilities = resource.getCapabilities(); - cz.zcu.kiv.crce.webui.internal.legacy.Capability[] result = new cz.zcu.kiv.crce.webui.internal.legacy.Capability[capabilities.size()]; - int i = 0; - for (Capability capability : capabilities) { - result[i++] = new CapabilityImpl(capability); - } - return result; - } - - @Override - public String[] getCategories() { - return metadataService.getCategories(resource).toArray(new String[0]); - } - - @Override - public cz.zcu.kiv.crce.webui.internal.legacy.Requirement[] getRequirements() { - List requirements = resource.getRequirements(); - cz.zcu.kiv.crce.webui.internal.legacy.Requirement[] result = new cz.zcu.kiv.crce.webui.internal.legacy.Requirement[requirements.size()]; - int i = 0; - for (Requirement requirement : requirements) { - result[i++] = new RequirementImpl(requirement); - } - return result; - } - - @Override - public String getSymbolicName() { - String name = "unknown-symbolic-name"; - List capabilities = resource.getCapabilities(NsOsgiBundle.NAMESPACE__OSGI_BUNDLE); - if (!capabilities.isEmpty()) { - name = capabilities.get(0).getAttributeValue(NsOsgiBundle.ATTRIBUTE__SYMBOLIC_NAME); - } - return name; - } - - @Override - public String getId() { - return resource.getId(); - } - - @Override - public Version getVersion() { - Version version = null; - List capabilities = resource.getCapabilities(NsOsgiBundle.NAMESPACE__OSGI_BUNDLE); - if (!capabilities.isEmpty()) { - version = capabilities.get(0).getAttributeValue(NsOsgiBundle.ATTRIBUTE__VERSION); - } - return version; - } - - @Override - public String getPresentationName() { - return metadataService.getPresentationName(resource); - } - - @Override - public URI getUri() { - return metadataService.getUri(resource); - } - - @Override - public URI getRelativeUri() { - return metadataService.getUri(resource); - } - - @Override - public long getSize() { - return metadataService.getSize(resource); - } - - private static class PropertyImpl implements Property { - - private final Attribute attribute; - - public PropertyImpl(Attribute attribute) { - this.attribute = attribute; - } - - @Override - public String getName() { - return attribute.getAttributeType().getName(); - } - - @Override - public Type getType() { - return Type.getValue(attribute.getAttributeType().getType().getSimpleName()); - } - - @Override - public String getValue() { - - Object value = attribute.getValue(); - if (value instanceof Double) { - return String.format("%.3f", value); - } - - return attribute.getStringValue(); - } - - @Override - public Object getConvertedValue() { - return attribute.getValue(); - } - - @Override - public boolean isWritable() { - return true; - } - } - - private static class NewPropertyImpl implements NewProperty { - - private final cz.zcu.kiv.crce.metadata.Property property; - - public NewPropertyImpl(cz.zcu.kiv.crce.metadata.Property property) { - this.property = property; - } - - @Override - public String getName() { - return property.getNamespace(); - } - - @Override - public Property[] getProperties() { - List> attributes = property.getAttributes(); - Property[] properties = new Property[attributes.size()]; - int i = 0; - for (Attribute attribute : attributes) { - properties[i++] = new PropertyImpl(attribute); - } - return properties; - } - - @Override - public Property getProperty(String name) { - Attribute attribute = property.getAttributesMap().get(name); - if (attribute != null) { - return new PropertyImpl(attribute); - } - return null; - } - - @Override - public String getPropertyString(String name) { - Attribute attribute = property.getAttributesMap().get(name); - if (attribute != null) { - return attribute.getStringValue(); - } - return null; - } - - @SuppressWarnings("unchecked") - @Override - public NewProperty setProperty(Property property) { - this.property.setAttribute(property.getName(), (Class) property.getType().getTypeClass(), property.getConvertedValue()); - return this; - } - - @SuppressWarnings("unchecked") - @Override - public NewProperty setProperty(String name, String value, Type type) { - this.property.setAttribute(name, (Class) type.getTypeClass(), Type.propertyValueFromString(type, value)); - return this; - } - - @Override - public NewProperty setProperty(String name, String string) { - this.property.setAttribute(name, String.class, string); - return this; - } - - @Override - public NewProperty setProperty(String name, Version version) { - this.property.setAttribute(name, Version.class, version); - return this; - } - - @Override - public NewProperty setProperty(String name, URL url) { - this.property.setAttribute(name, String.class, url.toString()); - return this; - } - - @Override - public NewProperty setProperty(String name, URI uri) { - this.property.setAttribute(name, String.class, uri.toString()); - return this; - } - - @Override - public NewProperty setProperty(String name, long llong) { - this.property.setAttribute(name, Long.class, llong); - return this; - } - - @Override - public NewProperty setProperty(String name, double ddouble) { - this.property.setAttribute(name, Double.class, ddouble); - return this; - } - - @SuppressWarnings("unchecked") - @Override - public NewProperty setProperty(String name, Set values) { - this.property.setAttribute(name, List.class, new ArrayList<>(values)); - return this; - } - - @Override - public NewProperty unsetProperty(String name) { - this.property.removeAttribute(name); - return this; - } - - } - - private static class CapabilityImpl implements cz.zcu.kiv.crce.webui.internal.legacy.Capability { - - private final Capability capability; - - public CapabilityImpl(Capability capability) { - this.capability = capability; - } - - @Override - public String getName() { - return capability.getNamespace(); - } - - @Override - public NewProperty[] getNewProperties() { - List newProperties = capability.getProperties(); - NewProperty[] properties = new NewProperty[newProperties.size()]; - int i = 0; - for (cz.zcu.kiv.crce.metadata.Property newProperty : newProperties) { - properties[i++] = new NewPropertyImpl(newProperty); - } - return properties; - } - - @Override - public Property[] getProperties() { - List> attributes = capability.getAttributes(); - Property[] properties = new Property[attributes.size()]; - int i = 0; - for (Attribute attribute : attributes) { - properties[i++] = new PropertyImpl(attribute); - } - return properties; - } - - @Override - public Property getProperty(String name) { - Attribute attribute = capability.getAttributesMap().get(name); - if (attribute != null) { - return new PropertyImpl(attribute); - } - return null; - } - - @Override - public String getPropertyString(String name) { - Attribute attribute = capability.getAttributesMap().get(name); - if (attribute != null) { - return attribute.getStringValue(); - } - return null; - } - - @Override - @SuppressWarnings("unchecked") - public cz.zcu.kiv.crce.webui.internal.legacy.Capability setProperty(Property property) { - capability.setAttribute(property.getName(), (Class) property.getType().getTypeClass(), property.getConvertedValue()); - return this; - } - - @Override - @SuppressWarnings("unchecked") - public cz.zcu.kiv.crce.webui.internal.legacy.Capability setProperty(String name, String value, Type type) { - capability.setAttribute(name, (Class) type.getTypeClass(), Type.propertyValueFromString(type, value)); - return this; - } - - @Override - public cz.zcu.kiv.crce.webui.internal.legacy.Capability setProperty(String name, String value) { - capability.setAttribute(name, String.class, value); - return this; - } - - @Override - public cz.zcu.kiv.crce.webui.internal.legacy.Capability setProperty(String name, Version version) { - capability.setAttribute(name, Version.class, version); - return this; - } - - @Override - public cz.zcu.kiv.crce.webui.internal.legacy.Capability setProperty(String name, URL url) { - capability.setAttribute(name, String.class, url.toString()); - return this; - } - - @Override - public cz.zcu.kiv.crce.webui.internal.legacy.Capability setProperty(String name, URI uri) { - capability.setAttribute(name, String.class, uri.toString()); - return this; - } - - @Override - public cz.zcu.kiv.crce.webui.internal.legacy.Capability setProperty(String name, long llong) { - capability.setAttribute(name, Long.class, llong); - return this; - } - - @Override - public cz.zcu.kiv.crce.webui.internal.legacy.Capability setProperty(String name, double ddouble) { - capability.setAttribute(name, Double.class, ddouble); - return this; - } - - @Override - @SuppressWarnings("unchecked") - public cz.zcu.kiv.crce.webui.internal.legacy.Capability setProperty(String name, Set values) { - capability.setAttribute(name, List.class, new ArrayList<>(values)); - return this; - } - - @Override - public cz.zcu.kiv.crce.webui.internal.legacy.Capability unsetProperty(String name) { - capability.removeAttribute(name); - return this; - } - } - - private static class RequirementImpl implements cz.zcu.kiv.crce.webui.internal.legacy.Requirement { - - private final Requirement requirement; - - public RequirementImpl(@Nonnull Requirement requirement) { - this.requirement = requirement; - } - - @Override - public String getName() { - return requirement.getNamespace(); - } - - @Override - public String getFilter() { - return requirement.getDirective("filter"); - } - - @Override - public boolean isMultiple() { - return Boolean.valueOf(requirement.getDirective("multiple")); - } - - @Override - public boolean isOptional() { - return Boolean.valueOf(requirement.getDirective("optional")); - } - - @Override - public boolean isExtend() { - return Boolean.valueOf(requirement.getDirective("extend")); - } - - @Override - public String getComment() { - return requirement.getDirective("comment"); - } - - @Override - public boolean isWritable() { - return true; - } - - @Override - public boolean isSatisfied(cz.zcu.kiv.crce.webui.internal.legacy.Capability capability) { - logger.warn("Method isSatisfied is not supported by new Metadata API, returning false for Capability: {}, Requirement: {}", capability, requirement); - return false; - } - - @Override - public cz.zcu.kiv.crce.webui.internal.legacy.Requirement setFilter(String filter) { - requirement.setDirective("filter", filter); - return this; - } - - @Override - public cz.zcu.kiv.crce.webui.internal.legacy.Requirement setMultiple(boolean multiple) { - requirement.setDirective("multiple", String.valueOf(multiple)); - return this; - } - - @Override - public cz.zcu.kiv.crce.webui.internal.legacy.Requirement setOptional(boolean optional) { - requirement.setDirective("optional", String.valueOf(optional)); - return this; - } - - @Override - public cz.zcu.kiv.crce.webui.internal.legacy.Requirement setExtend(boolean extend) { - requirement.setDirective("extend", String.valueOf(extend)); - return this; - } - - @Override - public cz.zcu.kiv.crce.webui.internal.legacy.Requirement setComment(String comment) { - requirement.setDirective("comment", String.valueOf(comment)); - return this; - } - } -} diff --git a/modules/pom.xml b/modules/pom.xml index cf477759..014ab0dc 100644 --- a/modules/pom.xml +++ b/modules/pom.xml @@ -33,17 +33,6 @@ 8443 false UTF-8 - false - 2000 - ../conf - .*\\.cfg - ../conf/logback.xml - - javax.inject,javax.jmdns,javax.jms,javax.mail,javax.mail.internet,javax.microedition.io - - - sun.*,com.sun.* - - 1.7.7 + 1.7.26 1.1.2 pom - provision crce-metadata-osgi-bundle + crce-external-repository + crce-component-versioning - crce-handler-metrics - crce-webui + + crce-rest-v2 - crce-optimizer-functions - crce-compatibility-api + crce-compatibility-dao-api crce-compatibility-dao-mongodb - crce-concurrency crce-vo + crce-webui-v2 crce-webservices-indexer + + crce-default-modules @@ -153,6 +144,14 @@ + + org.apache.maven.plugins + maven-compiler-plugin + + 10 + 10 + + diff --git a/modules/pom/pom.xml b/modules/pom/pom.xml index c3f315fd..20353148 100644 --- a/modules/pom/pom.xml +++ b/modules/pom/pom.xml @@ -2,6 +2,18 @@ 4.0.0 + + + + org.apache.maven.plugins + maven-compiler-plugin + + 10 + 10 + + + + cz.zcu.kiv.crce @@ -44,17 +56,22 @@ org.glassfish.jersey.containers jersey-container-servlet-core - 2.9.1 + ${version.glassfish.jersey} org.glassfish.jersey.media jersey-media-multipart - 2.9.1 + ${version.glassfish.jersey} org.glassfish.jersey.media jersey-media-json-jackson - 2.9.1 + ${version.glassfish.jersey} + + + org.glassfish.jersey.inject + jersey-hk2 + ${version.glassfish.jersey} com.fasterxml.jackson.dataformat diff --git a/third-party/httpclient/pom.xml b/third-party/httpclient/pom.xml index eb67b4e7..72f051f0 100644 --- a/third-party/httpclient/pom.xml +++ b/third-party/httpclient/pom.xml @@ -13,7 +13,7 @@ cz.zcu.kiv.crce.wrapper org.apache.httpcomponents.httpclient - 4.2.6 + 4.3.5 bundle ${bundle.symbolicName} ${wrapped.version} [osgi] @@ -22,7 +22,7 @@ org.apache.httpcomponents.httpclient org.apache.httpcomponents httpclient - 4.2.6 + 4.3.5 diff --git a/third-party/httpcore/pom.xml b/third-party/httpcore/pom.xml index 6e87a875..6896ac2c 100644 --- a/third-party/httpcore/pom.xml +++ b/third-party/httpcore/pom.xml @@ -13,7 +13,7 @@ cz.zcu.kiv.crce.wrapper org.apache.httpcomponents.httpcore - 4.2.5 + 4.3.2 bundle ${bundle.symbolicName} ${wrapped.version} [osgi] @@ -22,7 +22,7 @@ org.apache.httpcomponents.httpcore org.apache.httpcomponents httpcore - 4.2.5 + 4.3.2 diff --git a/third-party/plexus-component-annotations/pom.xml b/third-party/plexus-component-annotations/pom.xml index db6d105d..f66839b6 100644 --- a/third-party/plexus-component-annotations/pom.xml +++ b/third-party/plexus-component-annotations/pom.xml @@ -13,7 +13,7 @@ cz.zcu.kiv.crce.wrapper org.codehaus.plexus.plexus-component-annotations - 1.5.5 + 1.6 bundle ${bundle.symbolicName} ${wrapped.version} [osgi] @@ -22,7 +22,7 @@ org.codehaus.plexus.plexus-component-annotations org.codehaus.plexus plexus-component-annotations - 1.5.5 + 1.6 diff --git a/third-party/plexus-interpolation/pom.xml b/third-party/plexus-interpolation/pom.xml index 0af5351a..b5324826 100644 --- a/third-party/plexus-interpolation/pom.xml +++ b/third-party/plexus-interpolation/pom.xml @@ -13,7 +13,7 @@ cz.zcu.kiv.crce.wrapper org.codehaus.plexus.plexus-interpolation - 1.19 + 1.21 bundle ${bundle.symbolicName} ${wrapped.version} [osgi] @@ -22,7 +22,7 @@ org.codehaus.plexus.plexus-interpolation org.codehaus.plexus plexus-interpolation - 1.19 + 1.21 diff --git a/third-party/plexus-utils/pom.xml b/third-party/plexus-utils/pom.xml index 5d768752..4c0848a5 100644 --- a/third-party/plexus-utils/pom.xml +++ b/third-party/plexus-utils/pom.xml @@ -13,7 +13,7 @@ cz.zcu.kiv.crce.wrapper org.codehaus.plexus.plexus-utils - 3.0.17 + 3.0.22 bundle ${bundle.symbolicName} ${wrapped.version} [osgi] @@ -22,7 +22,7 @@ org.codehaus.plexus.plexus-utils org.codehaus.plexus plexus-utils - 3.0.17 + 3.0.22