diff --git a/.circleci/config.yml b/.circleci/config.yml index 8e95dd2d..5a4657c5 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -15,36 +15,26 @@ jobs: - run: name: Run Maven Build - command: cd mms-ent && sh mvnw install -Pbuild + command: cd mms-ent && sh mvnw install -Pbuild && sh mvnw install -f repo-amp/target/generated-sources/swagger/java/pom.xml - save_cache: paths: - ~/.m2 key: mms-{{ checksum "mms-ent/pom.xml" }} + - run: + name: Clean target directory + command: mkdir -p mms-ent/repo-amp/target/mms-java-client && mv mms-ent/repo-amp/target/generated-sources/swagger/java/target/*.jar mms-ent/repo-amp/target/generated-sources/swagger/java/pom.xml mms-ent/repo-amp/target/mms-java-client && rm -rf mms-ent/repo-amp/target/{amp,archive-tmp,classes,generated-sources,generated-test-sources,maven-archiver,maven-status,surefire-reports,test-classes} && rm -rf mms-ent/share-amp/target/{amp,archive-tmp,classes,generated-sources,generated-test-sources,maven-archiver,maven-status,surefire-reports,test-classes} + - run: name: Prepare Store Artifacts command: mkdir -p tmp/artifacts - store_artifacts: - path: mms-ent/repo-amp/target/mms-amp-3.3.0-SNAPSHOT.amp - destination: tmp/artifacts/mms-amp-3.3.0-SNAPSHOT.amp - - - store_artifacts: - path: mms-ent/share-amp/target/mms-share-amp-3.3.0-SNAPSHOT.amp - destination: tmp/artifacts/mms-share-amp-3.3.0-SNAPSHOT.amp - - - store_artifacts: - path: mms-ent/repo-amp/target/mms-java-client-3.3.0-SNAPSHOT.zip - destination: tmp/artifacts/mms-java-client-3.3.0-SNAPSHOT.zip - - - store_artifacts: - path: mms-ent/repo-amp/target/mms-python-client-3.3.0-SNAPSHOT.zip - destination: tmp/artifacts/mms-python-client-3.3.0-SNAPSHOT.zip + path: mms-ent/repo-amp/target - store_artifacts: - path: mms-ent/repo-amp/target/mms-mathematica-client-3.3.0-SNAPSHOT.zip - destination: tmp/artifacts/mms-mathematica-client-3.3.0-SNAPSHOT.zip + path: mms-ent/share-amp/target - persist_to_workspace: root: mms-ent @@ -52,7 +42,7 @@ jobs: - repo-amp/target - share-amp/target - deploy_snapshot: + deploy_artifacts: <<: *defaults steps: - attach_workspace: @@ -68,55 +58,31 @@ jobs: command: ./jfrog rt config --url $ARTIFACTORY_URL --user $ARTIFACTORY_USER --apikey $ARTIFACTORY_APIKEY --interactive false - run: name: Send mms-amp - command: ./jfrog rt u 'mms-ent/repo-amp/target/*.amp' libs-snapshot-local/gov/nasa/jpl/mms/mms-amp/3.3.0-SNAPSHOT/ --build-name=mms-circleci --build-number=$CIRCLE_BUILD_NUM --flat=true + command: ./jfrog rt u 'mms-ent/repo-amp/target/*.amp' libs-release-local/gov/nasa/jpl/mms/mms-amp/3.4.0/ --build-name=mms-circleci --build-number=$CIRCLE_BUILD_NUM --flat=true - run: name: Send mms-share-amp - command: ./jfrog rt u 'mms-ent/share-amp/target/*.amp' libs-snapshot-local/gov/nasa/jpl/mms/mms-share-amp/3.3.0-SNAPSHOT/ --build-name=mms-circleci --build-number=$CIRCLE_BUILD_NUM --flat=true + command: ./jfrog rt u 'mms-ent/share-amp/target/*.amp' libs-release-local/gov/nasa/jpl/mms/mms-share-amp/3.4.0/ --build-name=mms-circleci --build-number=$CIRCLE_BUILD_NUM --flat=true - run: name: Send mms java client - command: ./jfrog rt u 'mms-ent/repo-amp/target/mms-java-*.zip' libs-snapshot-local/gov/nasa/jpl/mms/mms-java-client/3.3.0-SNAPSHOT/ --build-name=mms-circleci --build-number=$CIRCLE_BUILD_NUM --flat=true - - run: - name: Send mms python client - command: ./jfrog rt u 'mms-ent/repo-amp/target/mms-python-*.zip' libs-snapshot-local/gov/nasa/jpl/mms/mms-python-client/3.3.0-SNAPSHOT/ --build-name=mms-circleci --build-number=$CIRCLE_BUILD_NUM --flat=true - - run: - name: Send mms mathematica client - command: ./jfrog rt u 'mms-ent/repo-amp/target/mms-mathematica-*.zip' libs-snapshot-local/gov/nasa/jpl/mms/mms-mathematica-client/3.3.0-SNAPSHOT/ --build-name=mms-circleci --build-number=$CIRCLE_BUILD_NUM --flat=true - - deploy_release: - <<: *defaults - steps: - - attach_workspace: - at: mms-ent - - run: - name: Get jfrog - command: curl -fL https://getcli.jfrog.io | sh - - run: - name: Set Permissions - command: sudo chmod +x jfrog - - run: - name: Configure jfrog - command: ./jfrog rt config --url $ARTIFACTORY_URL --user $ARTIFACTORY_USER --apikey $ARTIFACTORY_APIKEY --interactive false - - run: - name: Send mms-amp - command: ./jfrog rt u 'mms-ent/repo-amp/target/*.amp' libs-release-local/gov/nasa/jpl/mms/mms-amp/3.3.0-SNAPSHOT/ --build-name=mms-circleci --build-number=$CIRCLE_BUILD_NUM --flat=true - - run: - name: Send mms-share-amp - command: ./jfrog rt u 'mms-ent/share-amp/target/*.amp' libs-release-local/gov/nasa/jpl/mms/mms-share-amp/3.3.0-SNAPSHOT/ --build-name=mms-circleci --build-number=$CIRCLE_BUILD_NUM --flat=true + command: ./jfrog rt u 'mms-ent/repo-amp/target/mms-java-client/mms-java-*.jar' libs-release-local/gov/nasa/jpl/mms/mms-java-client/3.4.0/ --build-name=mms-circleci --build-number=$CIRCLE_BUILD_NUM --flat=true - run: name: Send mms java client - command: ./jfrog rt u 'mms-ent/repo-amp/target/mms-java-*.zip' libs-release-local/gov/nasa/jpl/mms/mms-java-client/3.3.0-SNAPSHOT/ --build-name=mms-circleci --build-number=$CIRCLE_BUILD_NUM --flat=true + command: ./jfrog rt u 'mms-ent/repo-amp/target/mms-java-client/pom.xml' libs-release-local/gov/nasa/jpl/mms/mms-java-client/3.4.0/ --build-name=mms-circleci --build-number=$CIRCLE_BUILD_NUM --flat=true - run: name: Send mms python client - command: ./jfrog rt u 'mms-ent/repo-amp/target/mms-python-*.zip' libs-release-local/gov/nasa/jpl/mms/mms-python-client/3.3.0-SNAPSHOT/ --build-name=mms-circleci --build-number=$CIRCLE_BUILD_NUM --flat=true + command: ./jfrog rt u 'mms-ent/repo-amp/target/mms_python_*.zip' libs-release-local/gov/nasa/jpl/mms/mms-python-client/3.4.0/ --build-name=mms-circleci --build-number=$CIRCLE_BUILD_NUM --flat=true - run: name: Send mms mathematica client - command: ./jfrog rt u 'mms-ent/repo-amp/target/mms-mathematica-*.zip' libs-release-local/gov/nasa/jpl/mms/mms-mathematica-client/3.3.0-SNAPSHOT/ --build-name=mms-circleci --build-number=$CIRCLE_BUILD_NUM --flat=true + command: ./jfrog rt u 'mms-ent/repo-amp/target/mms-mathematica-*.zip' libs-release-local/gov/nasa/jpl/mms/mms-mathematica-client/3.4.0/ --build-name=mms-circleci --build-number=$CIRCLE_BUILD_NUM --flat=true + - run: + name: Send mms matlab client + command: ./jfrog rt u 'mms-ent/repo-amp/target/mms-matlab-*.zip' libs-release-local/gov/nasa/jpl/mms/mms-matlab-client/3.4.0/ --build-name=mms-circleci --build-number=$CIRCLE_BUILD_NUM --flat=true workflows: version: 2 - build-deploy-snapshot: + build-deploy-artifacts: jobs: - build_amps - - deploy_snapshot: + - deploy_artifacts: requires: - build_amps diff --git a/.circleci/config.yml.template b/.circleci/config.yml.template new file mode 100644 index 00000000..3a8f1b55 --- /dev/null +++ b/.circleci/config.yml.template @@ -0,0 +1,88 @@ +defaults: &defaults + working_directory: ~/projects + docker: + - image: circleci/openjdk:8 + +version: 2 +jobs: + build_amps: + <<: *defaults + steps: + - checkout + + - restore_cache: + key: mms-{{ checksum "mms-ent/pom.xml" }} + + - run: + name: Run Maven Build + command: cd mms-ent && sh mvnw install -Pbuild && sh mvnw install -f repo-amp/target/generated-sources/swagger/java/pom.xml + + - save_cache: + paths: + - ~/.m2 + key: mms-{{ checksum "mms-ent/pom.xml" }} + + - run: + name: Clean target directory + command: mkdir -p mms-ent/repo-amp/target/mms-java-client && mv mms-ent/repo-amp/target/generated-sources/swagger/java/target/*.jar mms-ent/repo-amp/target/generated-sources/swagger/java/pom.xml mms-ent/repo-amp/target/mms-java-client && rm -rf mms-ent/repo-amp/target/{amp,archive-tmp,classes,generated-sources,generated-test-sources,maven-archiver,maven-status,surefire-reports,test-classes} && rm -rf mms-ent/share-amp/target/{amp,archive-tmp,classes,generated-sources,generated-test-sources,maven-archiver,maven-status,surefire-reports,test-classes} + + - run: + name: Prepare Store Artifacts + command: mkdir -p tmp/artifacts + + - store_artifacts: + path: mms-ent/repo-amp/target + + - store_artifacts: + path: mms-ent/share-amp/target + + - persist_to_workspace: + root: mms-ent + paths: + - repo-amp/target + - share-amp/target + + deploy_artifacts: + <<: *defaults + steps: + - attach_workspace: + at: mms-ent + - run: + name: Get jfrog + command: curl -fL https://getcli.jfrog.io | sh + - run: + name: Set Permissions + command: sudo chmod +x jfrog + - run: + name: Configure jfrog + command: ./jfrog rt config --url $ARTIFACTORY_URL --user $ARTIFACTORY_USER --apikey $ARTIFACTORY_APIKEY --interactive false + - run: + name: Send mms-amp + command: ./jfrog rt u 'mms-ent/repo-amp/target/*.amp' libs-snapshot-local/gov/nasa/jpl/mms/mms-amp/${version}/ --build-name=mms-circleci --build-number=$CIRCLE_BUILD_NUM --flat=true + - run: + name: Send mms-share-amp + command: ./jfrog rt u 'mms-ent/share-amp/target/*.amp' libs-snapshot-local/gov/nasa/jpl/mms/mms-share-amp/${version}/ --build-name=mms-circleci --build-number=$CIRCLE_BUILD_NUM --flat=true + - run: + name: Send mms java client + command: ./jfrog rt u 'mms-ent/repo-amp/target/mms-java-client/mms-java-*.jar' libs-snapshot-local/gov/nasa/jpl/mms/mms-java-client/${version}/ --build-name=mms-circleci --build-number=$CIRCLE_BUILD_NUM --flat=true + - run: + name: Send mms java client + command: ./jfrog rt u 'mms-ent/repo-amp/target/mms-java-client/pom.xml' libs-snapshot-local/gov/nasa/jpl/mms/mms-java-client/${version}/ --build-name=mms-circleci --build-number=$CIRCLE_BUILD_NUM --flat=true + - run: + name: Send mms python client + command: ./jfrog rt u 'mms-ent/repo-amp/target/mms_python_*.zip' libs-snapshot-local/gov/nasa/jpl/mms/mms-python-client/${version}/ --build-name=mms-circleci --build-number=$CIRCLE_BUILD_NUM --flat=true + - run: + name: Send mms mathematica client + command: ./jfrog rt u 'mms-ent/repo-amp/target/mms-mathematica-*.zip' libs-snapshot-local/gov/nasa/jpl/mms/mms-mathematica-client/${version}/ --build-name=mms-circleci --build-number=$CIRCLE_BUILD_NUM --flat=true + - run: + name: Send mms matlab client + command: ./jfrog rt u 'mms-ent/repo-amp/target/mms-matlab-*.zip' libs-snapshot-local/gov/nasa/jpl/mms/mms-matlab-client/${version}/ --build-name=mms-circleci --build-number=$CIRCLE_BUILD_NUM --flat=true + +workflows: + version: 2 + build-deploy-artifacts: + jobs: + - build_amps + - deploy_artifacts: + requires: + - build_amps diff --git a/mms-ent/build.sh b/mms-ent/build.sh index 5d9416ac..95ca9ad2 100755 --- a/mms-ent/build.sh +++ b/mms-ent/build.sh @@ -7,5 +7,9 @@ if [ "$1" == "" ]; then MAVEN_OPTS="-Xms256m -Xmx8G -Xdebug" ./mvnw clean package -f pom.xml -P build -Ddependency.surf.version=6.3 -Dmaven.test.skip=true -U -Dmaven.repo.local=$HOME/.m2/repository; else ./mvnw versions:set -DnewVersion=$1 -DgenerateBackupPoms=false -Ddependency.surf.version=6.3 + rm -f ../.circleci/config.yml + sed "s/\${version}/$1/" ../.circleci/config.yml.template > ../.circleci/config.yml + if [[ $1 != *"SNAPSHOT"* ]];then + sed -i "s/libs-snapshot-local/libs-release-local/" ../.circleci/config.yml + fi fi - diff --git a/mms-ent/clean.sh b/mms-ent/clean.sh index 719b3634..04232059 100755 --- a/mms-ent/clean.sh +++ b/mms-ent/clean.sh @@ -65,6 +65,7 @@ if [[ "$OSTYPE" == "darwin" ]]; then dropdb -U $dbuser _MountCommit dropdb -U $dbuser _CollaboratorProject dropdb -U $dbuser _CompleteModelGet + dropdb -U $dbuser _MoveModel dropdb -U $dbuser $usedb createdb -U $dbuser $usedb psql -U $dbuser -f ./repo-amp/src/main/resources/mms.sql $usedb @@ -127,7 +128,13 @@ expect "*Password*" send "$password\r" expect eof EOD - + $EXPECT < src/include/pg_config_manual.h.new \ + && grep '/var/run/postgresql' src/include/pg_config_manual.h.new \ + && mv src/include/pg_config_manual.h.new src/include/pg_config_manual.h \ + && gnuArch="$(dpkg-architecture --query DEB_BUILD_GNU_TYPE)" \ + && wget -O config/config.guess 'https://git.savannah.gnu.org/cgit/config.git/plain/config.guess?id=7d3d27baf8107b630586c962c057e22149653deb' \ + && wget -O config/config.sub 'https://git.savannah.gnu.org/cgit/config.git/plain/config.sub?id=7d3d27baf8107b630586c962c057e22149653deb' \ + && ./configure \ + --build="$gnuArch" \ + --enable-integer-datetimes \ + --enable-thread-safety \ + --enable-tap-tests \ + --disable-rpath \ + --with-uuid=e2fs \ + --with-gnu-ld \ + --with-pgport=5432 \ + --with-system-tzdata=/usr/share/zoneinfo \ + --prefix=/usr/local \ + --with-includes=/usr/local/include \ + --with-libraries=/usr/local/lib \ + \ + --with-openssl \ + --with-libxml \ + --with-libxslt \ + && make -j "$(nproc)" world \ + && make install-world \ + && make -C contrib install \ + \ + && runDeps="$( \ + scanelf --needed --nobanner --format '%n#p' --recursive /usr/local/share/postgresql \ + | tr ',' '\n' \ + | sort -u \ + | awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' \ + )" \ + && apk add --no-cache --virtual .persistent-deps \ + $runDeps \ + && cd / \ + && rm -rf \ + /usr/src/postgresql \ + /usr/local/share/doc \ + /usr/local/share/man \ + && find /usr/local -name '*.a' -delete + +RUN sed -ri "s!^#?(listen_addresses)\s*=\s*\S+.*!\1 = '*'!" /usr/local/share/postgresql/postgresql.conf.sample +RUN mkdir -p /var/run/postgresql && chown -R postgres:postgres /var/run/postgresql && chmod 2777 /var/run/postgresql +RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 777 "$PGDATA" + + +# ---- Elasticsearch ---- + +RUN addgroup -S elasticsearch && adduser -S -G elasticsearch elasticsearch +WORKDIR /usr/share/elasticsearch + +RUN set -ex; \ + wget -O elasticsearch.tar.gz "$ELASTICSEARCH_TARBALL" \ + && echo "$ELASTICSEARCH_TARBALL_SHA1 *elasticsearch.tar.gz" | sha1sum -c - \ + && wget -O elasticsearch.tar.gz.asc "$ELASTICSEARCH_TARBALL_ASC" \ + && export GNUPGHOME="$(mktemp -d)" \ + && gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$GPG_KEY" \ + && gpg --batch --verify elasticsearch.tar.gz.asc elasticsearch.tar.gz \ + && rm -rf "$GNUPGHOME" elasticsearch.tar.gz.asc \ + && tar -xf elasticsearch.tar.gz --strip-components=1 \ + && rm elasticsearch.tar.gz \ + && mkdir -p ./plugins; \ + for path in \ + ./data \ + ./logs \ + ./config \ + ./config/scripts \ + ; do \ + mkdir -p "$path"; \ + chown -R elasticsearch:elasticsearch "$path"; \ + done; \ + export ES_JAVA_OPTS='-Xms32m -Xmx32m'; + +COPY config ./config + +# ---- Tomcat ---- +RUN curl -fSL "$TOMCAT_TGZ_URL" -o tomcat.tar.gz \ + && ls -la \ + && echo "tar -xzf tomcat.tar.gz" \ + && tar -xzf tomcat.tar.gz \ + && rm tomcat.tar.gz* \ + && echo "mv apache-tomcat-${TOMCAT_VERSION} tomcat" \ + && mv apache-tomcat-${TOMCAT_VERSION} ${TOMCAT_HOME} + + +# ---- Alfresco ---- +WORKDIR /usr/local +COPY config ${CONFIG_DIR} +COPY config/config_alfresco.sh . +COPY config/run.sh ${TOMCAT_HOME}/bin/run.sh +COPY config/set_properties.sh ${TOMCAT_HOME}/bin/set_properties.sh +COPY all-in-one/docker-entrypoint.sh /usr/local/bin/ + + +# Download the community zip files +RUN wget --no-check-certificate -S "https://download.alfresco.com/release/community/201605-build-00010/alfresco-community-distribution-201605.zip" \ + && chmod +x ${USR_LOCAL}/bin/docker-entrypoint.sh \ + && chmod +x config_alfresco.sh \ + && chmod +x ${TOMCAT_HOME}/bin/run.sh \ + && chmod +x ${TOMCAT_HOME}/bin/set_properties.sh \ + && ./config_alfresco.sh + +RUN cp ${CONFIG_DIR}/alfresco-global.properties ${TOMCAT_HOME}/shared/classes/alfresco-global.properties \ + && cp ${CONFIG_DIR}/catalina.properties ${TOMCAT_HOME}/conf/catalina.properties \ + && cp ${CONFIG_DIR}/solr4-context.xml ${TOMCAT_HOME}/conf/Catalina/localhost/solr4.xml \ + && cp ${CONFIG_DIR}/tomcat-server.xml ${TOMCAT_HOME}/conf/server.xml \ + && cp ${CONFIG_DIR}/tomcat-users.xml ${TOMCAT_HOME}/conf/tomcat-users.xml \ + && cp ${CONFIG_DIR}/archive-solrcore.properties ${TOMCAT_HOME}/solr4/archive-SpacesStore/conf/solrcore.properties \ + && cp ${CONFIG_DIR}/workspace-solrcore.properties ${TOMCAT_HOME}/solr4/workspace-SpacesStore/conf/solrcore.properties + + +# ---- MMS ----- +COPY files ${FILES_DIR} +RUN java -jar ${TOMCAT_HOME}/bin/alfresco-mmt.jar install ${FILES_DIR}/mms-amp*.amp ${TOMCAT_HOME}/webapps/alfresco.war -force \ + && java -jar ${TOMCAT_HOME}/bin/alfresco-mmt.jar install ${FILES_DIR}/mms-share-amp*.amp ${TOMCAT_HOME}/webapps/share.war -force \ + && cd ${TOMCAT_HOME}/webapps \ + && rm -rf alfresco share \ + && mkdir alfresco share \ + && cd alfresco \ + && jar xf ../alfresco.war \ + && cd ../share \ + && jar xf ../share.war \ + && mv ${FILES_DIR}/mms.properties.example ${TOMCAT_HOME}/shared/classes/mms.properties \ + && cp ${FILES_DIR}/web.xml ${TOMCAT_HOME}/webapps/alfresco/WEB-INF/web.xml \ + && rm -rf ${FILES_DIR} \ + && cd ${TOMCAT_HOME}/webapps \ + && rm *.bak + + +# Add tomcat user and config +RUN addgroup -S tomcat \ + && adduser -G tomcat -g "Tomcat User" -s /bin/ash -D tomcat \ + && mkdir -p ${ALF_DATA_DIR}/solr4 \ + && chown -R tomcat:tomcat ${TOMCAT_HOME} \ + && chown -R tomcat:tomcat ${ALF_DATA_DIR} + +RUN apk del .build-deps + +# Alfresco +EXPOSE 8080:8080 +# Postgres +EXPOSE 5432:5432 +# ElasticSearch +EXPOSE 9200:9200 + +ENTRYPOINT ["/usr/local/tomcat/bin/run.sh"] diff --git a/mms-ent/docker/all-in-one/docker-entrypoint.sh b/mms-ent/docker/all-in-one/docker-entrypoint.sh new file mode 100644 index 00000000..b5b911e8 --- /dev/null +++ b/mms-ent/docker/all-in-one/docker-entrypoint.sh @@ -0,0 +1,186 @@ +#!/bin/bash +set -Eeo pipefail +# TODO swap to -Eeuo pipefail above (after handling all potentially-unset variables) + +# usage: file_env VAR [DEFAULT] +# ie: file_env 'XYZ_DB_PASSWORD' 'example' +# (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of +# "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature) +file_env() { + local var="$1" + local fileVar="${var}_FILE" + local def="${2:-}" + if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then + echo >&2 "error: both $var and $fileVar are set (but are exclusive)" + exit 1 + fi + local val="$def" + if [ "${!var:-}" ]; then + val="${!var}" + elif [ "${!fileVar:-}" ]; then + val="$(< "${!fileVar}")" + fi + export "$var"="$val" + unset "$fileVar" +} + +if [ "${1:0:1}" = '-' ]; then + set PATH="/usr/local/bin:/usr/local/tomcat/bin:/usr/local/elasticsearch/bin:/usr/local/pandoc/bin:$PATH" + set -- postgres "$@" + set -- elasticsearch "$@" +fi + +# allow the container to be started with `--user` +if [ "$1" = 'postgres' ] && [ "$(id -u)" = '0' ]; then + mkdir -p "$PGDATA" + chown -R postgres "$PGDATA" + chmod 700 "$PGDATA" + + mkdir -p /var/run/postgresql + chown -R postgres /var/run/postgresql + chmod 775 /var/run/postgresql + + # Create the transaction log directory before initdb is run (below) so the directory is owned by the correct user + if [ "$POSTGRES_INITDB_XLOGDIR" ]; then + mkdir -p "$POSTGRES_INITDB_XLOGDIR" + chown -R postgres "$POSTGRES_INITDB_XLOGDIR" + chmod 700 "$POSTGRES_INITDB_XLOGDIR" + fi + + exec su-exec postgres "$BASH_SOURCE" "$@" +fi + +if [[ "$1" = *'elasticsearch'* -a "$(id -u)" = '0' ]]; then + # Change the ownership of user-mutable directories to elasticsearch + for path in \ + /usr/share/elasticsearch/data \ + /usr/share/elasticsearch/logs \ + ; do + chown -R elasticsearch:elasticsearch "$path" + done + + exec su-exec elasticsearch "$BASH_SOURCE" "$@" +fi + +if [ "$1" = 'postgres' ]; then + mkdir -p "$PGDATA" + chown -R "$(id -u)" "$PGDATA" 2>/dev/null || : + chmod 700 "$PGDATA" 2>/dev/null || : + + # look specifically for PG_VERSION, as it is expected in the DB dir + if [ ! -s "$PGDATA/PG_VERSION" ]; then + # "initdb" is particular about the current user existing in "/etc/passwd", so we use "nss_wrapper" to fake that if necessary + # see https://github.com/docker-library/postgres/pull/253, https://github.com/docker-library/postgres/issues/359, https://cwrap.org/nss_wrapper.html + if ! getent passwd "$(id -u)" &> /dev/null && [ -e /usr/lib/libnss_wrapper.so ]; then + export LD_PRELOAD='/usr/lib/libnss_wrapper.so' + export NSS_WRAPPER_PASSWD="$(mktemp)" + export NSS_WRAPPER_GROUP="$(mktemp)" + echo "postgres:x:$(id -u):$(id -g):PostgreSQL:$PGDATA:/bin/false" > "$NSS_WRAPPER_PASSWD" + echo "postgres:x:$(id -g):" > "$NSS_WRAPPER_GROUP" + fi + + file_env 'POSTGRES_INITDB_ARGS' + if [ "$POSTGRES_INITDB_XLOGDIR" ]; then + export POSTGRES_INITDB_ARGS="$POSTGRES_INITDB_ARGS --xlogdir $POSTGRES_INITDB_XLOGDIR" + fi + eval "initdb --username=postgres $POSTGRES_INITDB_ARGS" + + # unset/cleanup "nss_wrapper" bits + if [ "${LD_PRELOAD:-}" = '/usr/lib/libnss_wrapper.so' ]; then + rm -f "$NSS_WRAPPER_PASSWD" "$NSS_WRAPPER_GROUP" + unset LD_PRELOAD NSS_WRAPPER_PASSWD NSS_WRAPPER_GROUP + fi + + # check password first so we can output the warning before postgres + # messes it up + file_env 'POSTGRES_PASSWORD' + if [ "$POSTGRES_PASSWORD" ]; then + pass="PASSWORD '$POSTGRES_PASSWORD'" + authMethod=md5 + else + # The - option suppresses leading tabs but *not* spaces. :) + cat >&2 <<-'EOWARN' + **************************************************** + WARNING: No password has been set for the database. + This will allow anyone with access to the + Postgres port to access your database. In + Docker's default configuration, this is + effectively any other container on the same + system. + + Use "-e POSTGRES_PASSWORD=password" to set + it in "docker run". + **************************************************** + EOWARN + + pass= + authMethod=trust + fi + + { + echo + echo "host all all all $authMethod" + } >> "$PGDATA/pg_hba.conf" + + # internal start of server in order to allow set-up using psql-client + # does not listen on external TCP/IP and waits until start finishes + PGUSER="${PGUSER:-postgres}" \ + pg_ctl -D "$PGDATA" \ + -o "-c listen_addresses=''" \ + -w start + + file_env 'POSTGRES_USER' 'postgres' + file_env 'POSTGRES_DB' "$POSTGRES_USER" + + psql=( psql -v ON_ERROR_STOP=1 ) + + if [ "$POSTGRES_DB" != 'postgres' ]; then + "${psql[@]}" --username postgres <<-EOSQL + CREATE DATABASE "$POSTGRES_DB" ; + EOSQL + echo + fi + + if [ "$POSTGRES_USER" = 'postgres' ]; then + op='ALTER' + else + op='CREATE' + fi + "${psql[@]}" --username postgres <<-EOSQL + $op USER "$POSTGRES_USER" WITH SUPERUSER $pass ; + EOSQL + echo + + psql+=( --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" ) + + echo + for f in /docker-entrypoint-initdb.d/*; do + case "$f" in + *.sh) + # https://github.com/docker-library/postgres/issues/450#issuecomment-393167936 + # https://github.com/docker-library/postgres/pull/452 + if [ -x "$f" ]; then + echo "$0: running $f" + "$f" + else + echo "$0: sourcing $f" + . "$f" + fi + ;; + *.sql) echo "$0: running $f"; "${psql[@]}" -f "$f"; echo ;; + *.sql.gz) echo "$0: running $f"; gunzip -c "$f" | "${psql[@]}"; echo ;; + *) echo "$0: ignoring $f" ;; + esac + echo + done + + PGUSER="${PGUSER:-postgres}" \ + pg_ctl -D "$PGDATA" -m fast -w stop + + echo + echo 'PostgreSQL init process complete; ready for start up.' + echo + fi +fi + +exec "$@" diff --git a/mms-ent/docker/config/run.sh b/mms-ent/docker/config/run.sh index f700b9d4..15722aa3 100644 --- a/mms-ent/docker/config/run.sh +++ b/mms-ent/docker/config/run.sh @@ -2,5 +2,12 @@ ${TOMCAT_HOME}/bin/set_properties.sh -# Start Alfresco -su - tomcat -c "${TOMCAT_HOME}/bin/catalina.sh run" +# Check if this is an all-in-one image +if [ -f "/usr/local/bin/docker-entrypoint.sh" ];then + /usr/local/bin/docker-entrypoint.sh elasticsearch && + POSTGRES_USER=$PG_DB_USER POSTGRES_PASSWORD=$PG_DB_PASS /usr/local/bin/docker-entrypoint.sh postgres && + su - tomcat -c "${TOMCAT_HOME}/bin/catalina.sh run"; +else + #Just start tomcat + su - tomcat -c "${TOMCAT_HOME}/bin/catalina.sh run"; +fi diff --git a/mms-ent/docker/config/set_properties.sh b/mms-ent/docker/config/set_properties.sh index 4d1c1539..2cf59094 100644 --- a/mms-ent/docker/config/set_properties.sh +++ b/mms-ent/docker/config/set_properties.sh @@ -52,5 +52,5 @@ else fi # Run these unconditionally -sed -i'' -e "s/pandoc.exec=\/usr\/local\/bin\/pandoc/pandoc.exec=\/usr\/local\/pandoc\/bin\/pandoc" /usr/local/tomcat/shared/classes/mms.properties +sed -i'' -e "s/pandoc.exec=\/usr\/local\/bin\/pandoc/pandoc.exec=\/usr\/local\/pandoc\/bin\/pandoc/" /usr/local/tomcat/shared/classes/mms.properties export CATALINA_TMPDIR=/mnt/alf_data/temp diff --git a/mms-ent/mms.properties.example b/mms-ent/mms.properties.example index c74c3b30..2935ccda 100644 --- a/mms-ent/mms.properties.example +++ b/mms-ent/mms.properties.example @@ -27,6 +27,7 @@ pg.pass=POSTGRESPASSWORD pg.conn.max=96 pg.limit.insert=5000 pg.limit.select=1000 +pg.secured=false #Elasticsearch Settings elastic.host=http://localhost:9200 diff --git a/mms-ent/pom.xml b/mms-ent/pom.xml index df63e245..8fab76ce 100755 --- a/mms-ent/pom.xml +++ b/mms-ent/pom.xml @@ -4,7 +4,7 @@ 4.0.0 gov.nasa.jpl.mbee mms-ent - 3.3.0 + 3.4.0 Alfresco Repository and Share Quickstart with database and an embedded Tomcat runner. This All-in-One project allows to manage all the components involved in Alfresco development (Repo, Share, Solr4, AMPs) in one project diff --git a/mms-ent/repo-amp/assembly/mms-java-client.xml b/mms-ent/repo-amp/assembly/mms-java-client.xml index 9271d703..f7e16d60 100644 --- a/mms-ent/repo-amp/assembly/mms-java-client.xml +++ b/mms-ent/repo-amp/assembly/mms-java-client.xml @@ -12,4 +12,10 @@ ./ + + + ${project.basedir}/../../LICENSE + ./ + + diff --git a/mms-ent/repo-amp/assembly/mms-mathematica-client.xml b/mms-ent/repo-amp/assembly/mms-mathematica-client.xml index 85130c43..9074916f 100644 --- a/mms-ent/repo-amp/assembly/mms-mathematica-client.xml +++ b/mms-ent/repo-amp/assembly/mms-mathematica-client.xml @@ -13,4 +13,10 @@ ./ + + + ${project.basedir}/../../LICENSE + ./ + + diff --git a/mms-ent/repo-amp/assembly/mms-matlab-client.xml b/mms-ent/repo-amp/assembly/mms-matlab-client.xml new file mode 100644 index 00000000..c163e833 --- /dev/null +++ b/mms-ent/repo-amp/assembly/mms-matlab-client.xml @@ -0,0 +1,22 @@ + + + matlab-client-${parent.version} + + zip + + false + + + ${swagger.codegen.target}/matlab + ./ + + + + + ${project.basedir}/../../LICENSE + ./ + + + diff --git a/mms-ent/repo-amp/assembly/mms-python-client.xml b/mms-ent/repo-amp/assembly/mms-python-client.xml index 6b07556a..b009a8d0 100644 --- a/mms-ent/repo-amp/assembly/mms-python-client.xml +++ b/mms-ent/repo-amp/assembly/mms-python-client.xml @@ -12,4 +12,10 @@ ./ + + + ${project.basedir}/../../LICENSE + ./ + + diff --git a/mms-ent/repo-amp/pom.xml b/mms-ent/repo-amp/pom.xml index b48af0ff..4fcb8335 100755 --- a/mms-ent/repo-amp/pom.xml +++ b/mms-ent/repo-amp/pom.xml @@ -10,7 +10,7 @@ gov.nasa.jpl.mbee mms-ent - 3.3.0 + 3.4.0 @@ -18,6 +18,17 @@ ${basedir}/src/main/amp/web/mms/mms.swagger.yaml + + + sonatype + Sonatype Groups + https://oss.sonatype.org/content/groups/public/ + + + spring + Spring Maven Repository + http://repo.spring.io/plugins-release/ + alfresco-public https://artifacts.alfresco.com/nexus/content/groups/public @@ -29,17 +40,6 @@ true - - - activiti-private-repository - https://artifacts.alfresco.com/nexus/content/repositories/activiti-enterprise-releases - - - - sonatype - Sonatype Groups - https://oss.sonatype.org/content/groups/public/ - @@ -47,6 +47,14 @@ jcenter https://jcenter.bintray.com/ + + bintray-openmbee-maven + bintray-plugins + https://dl.bintray.com/openmbee/maven + + false + + + + org.apache.tika + tika-core + 1.18 + org.apache.chemistry.opencmis @@ -224,6 +238,13 @@ provided + + + + activiti-private-repository + https://artifacts.alfresco.com/nexus/content/repositories/activiti-enterprise-releases + + @@ -275,6 +296,13 @@ true java8-localdatetime + org.openmbee.mms + mms-java-client + ${parent.version} + org.openmbee.mms.client + org.openmbee.mms.client.model + org.openmbee.mms.client.api + true ${swagger.codegen.target}/java @@ -287,6 +315,11 @@ ${swagger.codegen.yaml} python + + mms_python_client + mms_python_client + ${parent.version} + ${swagger.codegen.target}/python @@ -302,6 +335,18 @@ ${swagger.codegen.target}/mathematica + + matlab-codegen + + generate + + + ${swagger.codegen.yaml} + matlab-client + MMS + ${swagger.codegen.target}/matlab + + @@ -309,6 +354,11 @@ swagger-codegen-mathematica-client 1.0.1 + + org.openmbee.swagger + swagger-codegen-matlab-client + 1.0.1 + @@ -334,21 +384,62 @@ maven-assembly-plugin - - mms - - assembly/mms-java-client.xml - assembly/mms-python-client.xml - assembly/mms-mathematica-client.xml - - - make-assembly + make-assembly-java-client package single + + + assembly/mms-java-client.xml + + mms-java-client-${parent.version} + false + + + + make-assembly-python-client + package + + single + + + + assembly/mms-python-client.xml + + mms_python_client-${parent.version} + false + + + + make-assembly-mathematica-client + package + + single + + + + assembly/mms-mathematica-client.xml + + mms-mathematica-client-${parent.version} + false + + + + make-assembly-matlab-client + package + + single + + + + assembly/mms-matlab-client.xml + + mms-matlab-client-${parent.version} + false + diff --git a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/javawebscripts/hostname.get.json.ftl b/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/javawebscripts/hostname.get.json.ftl deleted file mode 100644 index 1897f75d..00000000 --- a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/javawebscripts/hostname.get.json.ftl +++ /dev/null @@ -1 +0,0 @@ -${res} \ No newline at end of file diff --git a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/diff.get.desc.xml b/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/diff.get.desc.xml deleted file mode 100644 index 18b2dc80..00000000 --- a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/diff.get.desc.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - get diffs - - get diffs - - /projects/{projectId}/diff/{workspace1}/{workspace2}/{timestamp1}/{timestamp2} - argument - user - required - MMS REST API - diff --git a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/diff.get.json.ftl b/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/diff.get.json.ftl deleted file mode 100644 index 1897f75d..00000000 --- a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/diff.get.json.ftl +++ /dev/null @@ -1 +0,0 @@ -${res} \ No newline at end of file diff --git a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/diff.post.desc.xml b/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/diff.post.desc.xml deleted file mode 100644 index 902427c6..00000000 --- a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/diff.post.desc.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - post diffs - - Post the passed diff json changes to the target workspace. In the json file, assumes the target workspace is workspace1, and the source workspace is workspace2. - - /projects/{projectId}/diff?timestamp1={timestamp1}&timestamp2={timestamp2} - argument - user - required - MMS REST API - diff --git a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/diff.post.json.ftl b/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/diff.post.json.ftl deleted file mode 100644 index 1897f75d..00000000 --- a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/diff.post.json.ftl +++ /dev/null @@ -1 +0,0 @@ -${res} \ No newline at end of file diff --git a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/mmsversion.get.json.ftl b/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/mmsversion.get.json.ftl deleted file mode 100644 index 1897f75d..00000000 --- a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/mmsversion.get.json.ftl +++ /dev/null @@ -1 +0,0 @@ -${res} \ No newline at end of file diff --git a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/orgs/orgs.delete.json.ftl b/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/orgs/orgs.delete.json.ftl deleted file mode 100644 index 1897f75d..00000000 --- a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/orgs/orgs.delete.json.ftl +++ /dev/null @@ -1 +0,0 @@ -${res} \ No newline at end of file diff --git a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/orgs/orgs.get.json.ftl b/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/orgs/orgs.get.json.ftl deleted file mode 100644 index 1897f75d..00000000 --- a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/orgs/orgs.get.json.ftl +++ /dev/null @@ -1 +0,0 @@ -${res} \ No newline at end of file diff --git a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/orgs/orgs.post.json.ftl b/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/orgs/orgs.post.json.ftl deleted file mode 100644 index 1897f75d..00000000 --- a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/orgs/orgs.post.json.ftl +++ /dev/null @@ -1 +0,0 @@ -${res} \ No newline at end of file diff --git a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/orgs/projects.post.json.ftl b/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/orgs/projects.post.json.ftl deleted file mode 100644 index 1897f75d..00000000 --- a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/orgs/projects.post.json.ftl +++ /dev/null @@ -1 +0,0 @@ -${res} \ No newline at end of file diff --git a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/ref.get.json.ftl b/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/ref.get.json.ftl deleted file mode 100644 index 1897f75d..00000000 --- a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/ref.get.json.ftl +++ /dev/null @@ -1 +0,0 @@ -${res} \ No newline at end of file diff --git a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs.delete.json.ftl b/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs.delete.json.ftl deleted file mode 100644 index 1897f75d..00000000 --- a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs.delete.json.ftl +++ /dev/null @@ -1 +0,0 @@ -${res} \ No newline at end of file diff --git a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs.get.json.ftl b/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs.get.json.ftl deleted file mode 100644 index 1897f75d..00000000 --- a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs.get.json.ftl +++ /dev/null @@ -1 +0,0 @@ -${res} \ No newline at end of file diff --git a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs.post.json.ftl b/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs.post.json.ftl deleted file mode 100644 index 1897f75d..00000000 --- a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs.post.json.ftl +++ /dev/null @@ -1 +0,0 @@ -${res} \ No newline at end of file diff --git a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/artifacts/artifact.get.json.ftl b/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/artifacts/artifact.get.json.ftl deleted file mode 100644 index 1897f75d..00000000 --- a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/artifacts/artifact.get.json.ftl +++ /dev/null @@ -1 +0,0 @@ -${res} \ No newline at end of file diff --git a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/artifacts/artifact.post.json.ftl b/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/artifacts/artifact.post.json.ftl deleted file mode 100644 index 1897f75d..00000000 --- a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/artifacts/artifact.post.json.ftl +++ /dev/null @@ -1 +0,0 @@ -${res} \ No newline at end of file diff --git a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/artifacts/artifacts.delete.json.ftl b/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/artifacts/artifacts.delete.json.ftl deleted file mode 100644 index 1897f75d..00000000 --- a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/artifacts/artifacts.delete.json.ftl +++ /dev/null @@ -1 +0,0 @@ -${res} \ No newline at end of file diff --git a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/artifacts/artifacts.get.json.ftl b/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/artifacts/artifacts.get.json.ftl deleted file mode 100644 index 1897f75d..00000000 --- a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/artifacts/artifacts.get.json.ftl +++ /dev/null @@ -1 +0,0 @@ -${res} \ No newline at end of file diff --git a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/artifacts/artifacts.put.json.ftl b/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/artifacts/artifacts.put.json.ftl deleted file mode 100644 index 1897f75d..00000000 --- a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/artifacts/artifacts.put.json.ftl +++ /dev/null @@ -1 +0,0 @@ -${res} \ No newline at end of file diff --git a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/convert.post.json.ftl b/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/convert.post.json.ftl deleted file mode 100644 index b384c63c..00000000 --- a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/convert.post.json.ftl +++ /dev/null @@ -1 +0,0 @@ -${res} diff --git a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/documents.get.json.ftl b/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/documents.get.json.ftl deleted file mode 100644 index 1897f75d..00000000 --- a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/documents.get.json.ftl +++ /dev/null @@ -1 +0,0 @@ -${res} \ No newline at end of file diff --git a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/elements/cfids.get.json.ftl b/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/elements/cfids.get.json.ftl deleted file mode 100644 index 1897f75d..00000000 --- a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/elements/cfids.get.json.ftl +++ /dev/null @@ -1 +0,0 @@ -${res} \ No newline at end of file diff --git a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/elements/element.get.json.ftl b/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/elements/element.get.json.ftl deleted file mode 100644 index 1897f75d..00000000 --- a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/elements/element.get.json.ftl +++ /dev/null @@ -1 +0,0 @@ -${res} \ No newline at end of file diff --git a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/elements/elements.delete.json.ftl b/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/elements/elements.delete.json.ftl deleted file mode 100644 index 1897f75d..00000000 --- a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/elements/elements.delete.json.ftl +++ /dev/null @@ -1 +0,0 @@ -${res} \ No newline at end of file diff --git a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/elements/elements.get.json.ftl b/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/elements/elements.get.json.ftl deleted file mode 100644 index 1897f75d..00000000 --- a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/elements/elements.get.json.ftl +++ /dev/null @@ -1 +0,0 @@ -${res} \ No newline at end of file diff --git a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/elements/elements.post.json.ftl b/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/elements/elements.post.json.ftl deleted file mode 100644 index 1897f75d..00000000 --- a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/elements/elements.post.json.ftl +++ /dev/null @@ -1 +0,0 @@ -${res} \ No newline at end of file diff --git a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/elements/elements.put.json.ftl b/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/elements/elements.put.json.ftl deleted file mode 100644 index 1897f75d..00000000 --- a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/elements/elements.put.json.ftl +++ /dev/null @@ -1 +0,0 @@ -${res} \ No newline at end of file diff --git a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/elements/moves.post.desc.xml b/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/elements/moves.post.desc.xml new file mode 100644 index 00000000..82801274 --- /dev/null +++ b/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/elements/moves.post.desc.xml @@ -0,0 +1,13 @@ + + + + post elements + + post elements + + /projects/{projectId}/refs/{refId}/propertyMove + argument + user + required + MMS REST API + diff --git a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/history/element.get.json.ftl b/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/history/element.get.json.ftl deleted file mode 100644 index 1897f75d..00000000 --- a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/history/element.get.json.ftl +++ /dev/null @@ -1 +0,0 @@ -${res} \ No newline at end of file diff --git a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/history/ref.get.json.ftl b/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/history/ref.get.json.ftl deleted file mode 100644 index b384c63c..00000000 --- a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/history/ref.get.json.ftl +++ /dev/null @@ -1 +0,0 @@ -${res} diff --git a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/mounts.get.json.ftl b/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/mounts.get.json.ftl deleted file mode 100644 index 1897f75d..00000000 --- a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/mounts.get.json.ftl +++ /dev/null @@ -1 +0,0 @@ -${res} \ No newline at end of file diff --git a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/search.post.json.ftl b/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/search.post.json.ftl deleted file mode 100644 index 1897f75d..00000000 --- a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/search.post.json.ftl +++ /dev/null @@ -1 +0,0 @@ -${res} \ No newline at end of file diff --git a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/search.put.json.ftl b/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/search.put.json.ftl deleted file mode 100644 index 1897f75d..00000000 --- a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/search.put.json.ftl +++ /dev/null @@ -1 +0,0 @@ -${res} \ No newline at end of file diff --git a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/sites.get.json.ftl b/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/sites.get.json.ftl deleted file mode 100644 index 1897f75d..00000000 --- a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/refs/sites.get.json.ftl +++ /dev/null @@ -1 +0,0 @@ -${res} \ No newline at end of file diff --git a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/users/preferences.get.json.ftl b/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/users/preferences.get.json.ftl deleted file mode 100644 index 1897f75d..00000000 --- a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/users/preferences.get.json.ftl +++ /dev/null @@ -1 +0,0 @@ -${res} \ No newline at end of file diff --git a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/users/preferences.post.json.ftl b/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/users/preferences.post.json.ftl deleted file mode 100644 index 1897f75d..00000000 --- a/mms-ent/repo-amp/src/main/amp/config/alfresco/extension/templates/webscripts/gov/nasa/jpl/mms/users/preferences.post.json.ftl +++ /dev/null @@ -1 +0,0 @@ -${res} \ No newline at end of file diff --git a/mms-ent/repo-amp/src/main/amp/config/alfresco/module/mms-amp/context/mms-init-service-context.xml b/mms-ent/repo-amp/src/main/amp/config/alfresco/module/mms-amp/context/mms-init-service-context.xml index cd3a45ec..66690729 100755 --- a/mms-ent/repo-amp/src/main/amp/config/alfresco/module/mms-amp/context/mms-init-service-context.xml +++ b/mms-ent/repo-amp/src/main/amp/config/alfresco/module/mms-amp/context/mms-init-service-context.xml @@ -43,7 +43,7 @@ - + diff --git a/mms-ent/repo-amp/src/main/amp/config/alfresco/module/mms-amp/context/mms-service-context.xml b/mms-ent/repo-amp/src/main/amp/config/alfresco/module/mms-amp/context/mms-service-context.xml index 5c03a0bb..3a677d78 100755 --- a/mms-ent/repo-amp/src/main/amp/config/alfresco/module/mms-amp/context/mms-service-context.xml +++ b/mms-ent/repo-amp/src/main/amp/config/alfresco/module/mms-amp/context/mms-service-context.xml @@ -192,14 +192,14 @@ - + - + - + @@ -262,8 +262,14 @@ + + + + - + 0 diff --git a/mms-ent/repo-amp/src/main/amp/web/mms/mms.swagger.yaml b/mms-ent/repo-amp/src/main/amp/web/mms/mms.swagger.yaml index c5435bd3..7f8c27a4 100644 --- a/mms-ent/repo-amp/src/main/amp/web/mms/mms.swagger.yaml +++ b/mms-ent/repo-amp/src/main/amp/web/mms/mms.swagger.yaml @@ -414,6 +414,8 @@ paths: $ref: "#/responses/NotFound" 500: $ref: "#/responses/InternalServerError" + 503: + $ref: "#/responses/ServiceUnavailable" default: $ref: "#/responses/Default" /projects/{project_id}/refs/{ref_id}: @@ -482,6 +484,50 @@ paths: required: true description: "ref identifier" type: "string" + - name: "maxTimestamp" + in: "query" + required: false + description: "max timestamp" + allowReserved: true + type: "string" + get: + tags: + - "ref" + summary: "Get ref history" + description: "" + operationId: "getRefHistory" + responses: + 200: + description: "OK" + schema: + $ref: "#/definitions/Commits" + 401: + $ref: "#/responses/Unauthorized" + 403: + $ref: "#/responses/Forbidden" + 404: + $ref: "#/responses/NotFound" + 500: + $ref: "#/responses/InternalServerError" + default: + $ref: "#/responses/Default" + /projects/{project_id}/refs/{ref_id}/documents: + parameters: + - name: "project_id" + in: "path" + required: true + description: "project identifier" + type: "string" + - name: "ref_id" + in: "path" + required: true + description: "ref identifier" + type: "string" + - name: "groupId" + in: "query" + required: false + description: "group identifier" + type: "string" get: tags: - "ref" @@ -515,6 +561,11 @@ paths: required: true description: "ref identifier" type: "string" + - name: "commitId" + in: "query" + required: false + description: "commit identifier" + type: "string" get: tags: - "element" @@ -769,6 +820,11 @@ paths: summary: "Get artifacts" description: "" operationId: "getArtifacts" + produces: + - image/png + - image/svg+xml + - application/pdf + - application/vnd.openxmlformats-officedocument.wordprocessingml.document parameters: - in: "query" name: "commitId" @@ -795,6 +851,11 @@ paths: summary: "Get artifact(s) in batch" description: "" operationId: "getArtifactsInBatch" + produces: + - image/png + - image/svg+xml + - application/pdf + - application/vnd.openxmlformats-officedocument.wordprocessingml.document parameters: - in: "body" name: "body" @@ -1004,6 +1065,46 @@ paths: $ref: "#/responses/InternalServerError" default: $ref: "#/responses/Default" + /projects/{project_id}/refs/{ref_id}/convert: + parameters: + - name: "project_id" + in: "path" + required: true + description: "project identifier" + type: "string" + - name: "ref_id" + in: "path" + required: true + description: "ref identifier" + type: "string" + post: + tags: + - "other" + summary: "Converts HTML to requested format" + description: "" + operationId: "htmlConverter" + parameters: + - name: "body" + in: "body" + description: "" + schema: + $ref: "#/definitions/ConvertRequest" + required: true + responses: + 200: + description: "OK" + schema: + $ref: "#/definitions/ConvertResponse" + 401: + $ref: "#/responses/Unauthorized" + 403: + $ref: "#/responses/Forbidden" + 404: + $ref: "#/responses/NotFound" + 500: + $ref: "#/responses/InternalServerError" + default: + $ref: "#/responses/Default" /projects/{project_id}/refs/{ref_id}/groups: parameters: - name: "project_id" @@ -1070,7 +1171,7 @@ paths: $ref: "#/responses/InternalServerError" default: $ref: "#/responses/Default" - /projects/{project_id}/refs/{ref_id}/documents: + /projects/{project_id}/refs/{ref_id}/search: parameters: - name: "project_id" in: "path" @@ -1082,17 +1183,24 @@ paths: required: true description: "ref identifier" type: "string" - get: + post: tags: - "other" - summary: "Get documents" + summary: "Search for elements" description: "" - operationId: "getDocuments" + operationId: "searchElements" + parameters: + - name: "body" + in: "body" + description: "" + schema: + $ref: "#/definitions/SearchRequest" + required: true responses: 200: description: "OK" schema: - $ref: "#/definitions/Documents" + $ref: "#/definitions/Elements" 401: $ref: "#/responses/Unauthorized" 403: @@ -1114,6 +1222,8 @@ responses: description: "Forbidden" InternalServerError: description: "Internal server error" + ServiceUnavailable: + description: "Service Unavailable" Default: description: "Unknown" definitions: @@ -1325,6 +1435,45 @@ definitions: type: "array" items: $ref: "#/definitions/Element" + ConvertRequest: + type: "object" + required: + - "name" + - "body" + - "Accepts" + properties: + name: + type: "string" + body: + type: "string" + Accepts: + type: "string" + css: + type: "string" + ConvertResponse: + type: "object" + required: + - "name" + - "filename" + - "status" + properties: + name: + type: "string" + filename: + type: "string" + status: + type: "string" + SearchRequest: + type: "object" + required: + - "query" + properties: + query: + type: "object" + size: + type: "number" + sort: + type: "object" LoginRequest: type: "object" required: diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/actions/ActionUtil.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/actions/ActionUtil.java index b8c3cfc4..e9234f5d 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/actions/ActionUtil.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/actions/ActionUtil.java @@ -29,27 +29,12 @@ package gov.nasa.jpl.view_repo.actions; -import gov.nasa.jpl.mbee.util.Utils; -import gov.nasa.jpl.view_repo.util.Acm; +import gov.nasa.jpl.view_repo.util.EmsConfig; import gov.nasa.jpl.view_repo.util.EmsScriptNode; -import gov.nasa.jpl.view_repo.util.NodeUtil; -import gov.nasa.jpl.view_repo.util.EmsScriptNode; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.Date; - -import javax.servlet.http.HttpServletResponse; -import org.alfresco.model.ContentModel; import org.alfresco.repo.action.executer.MailActionExecuter; -import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.service.ServiceRegistry; import org.alfresco.service.cmr.action.Action; -import org.alfresco.service.cmr.repository.ContentData; -import org.alfresco.service.cmr.repository.ContentWriter; -import org.springframework.extensions.webscripts.Status; /** * Static class of Action utilities for saving log, sending email, etc. @@ -71,11 +56,11 @@ private ActionUtil() { * @param services */ public static void sendEmailToModifier(EmsScriptNode node, String msg, String subject, ServiceRegistry services) { - String username = (String)node.getProperty("cm:modifier", false); - EmsScriptNode user = new EmsScriptNode(services.getPersonService().getPerson(username), services, new StringBuffer()); + String username = (String)node.getProperty("cm:modifier"); + EmsScriptNode user = new EmsScriptNode(services.getPersonService().getPerson(username), services); String recipient = (String) user.getProperty("cm:email"); - String sender = NodeUtil.getHostname() + "@jpl.nasa.gov"; + String sender = EmsConfig.get("app.email.from"); sendEmailTo(sender, recipient, msg, subject, services); } diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/actions/MigrationRunner.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/actions/MigrationRunner.java index a2ed6d87..44ac27c8 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/actions/MigrationRunner.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/actions/MigrationRunner.java @@ -44,6 +44,7 @@ public class MigrationRunner extends AbstractPatch { migrationList.add(new ModuleVersionNumber("3.1.0")); migrationList.add(new ModuleVersionNumber("3.2.0")); migrationList.add(new ModuleVersionNumber("3.3.0")); + migrationList.add(new ModuleVersionNumber("3.4.0")); } public void setServices(ServiceRegistry services) { diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/actions/migrations/Migrate_3_3_0.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/actions/migrations/Migrate_3_3_0.java index 2d7991d2..b0b4cadc 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/actions/migrations/Migrate_3_3_0.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/actions/migrations/Migrate_3_3_0.java @@ -278,8 +278,11 @@ public static boolean apply(ServiceRegistry services) throws Exception { List files = fileFolderService.list(refNode.getNodeRef()); for (FileInfo file : files) { - if (!file.isFolder()) { + if (file != null && !file.isFolder()) { VersionHistory versionHistory = versionService.getVersionHistory(file.getNodeRef()); + if (versionHistory == null) { + continue; + } List versions = new ArrayList<>(versionHistory.getAllVersions()); ListIterator it = versions.listIterator(versions.size()); diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/actions/migrations/Migrate_3_4_0.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/actions/migrations/Migrate_3_4_0.java new file mode 100644 index 00000000..0e633049 --- /dev/null +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/actions/migrations/Migrate_3_4_0.java @@ -0,0 +1,146 @@ +package gov.nasa.jpl.view_repo.actions.migrations; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import gov.nasa.jpl.mbee.util.Pair; +import gov.nasa.jpl.view_repo.db.ElasticHelper; +import gov.nasa.jpl.view_repo.db.PostgresHelper; +import gov.nasa.jpl.view_repo.util.EmsConfig; +import gov.nasa.jpl.view_repo.util.JsonUtil; +import gov.nasa.jpl.view_repo.util.Sjm; +import java.io.InputStream; +import java.sql.PreparedStatement; +import java.sql.Timestamp; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Scanner; +import java.util.Set; +import org.alfresco.service.ServiceRegistry; +import org.apache.log4j.Logger; + +public class Migrate_3_4_0 { + + static Logger logger = Logger.getLogger(Migrate_3_4_0.class); + private static final SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + private static JsonParser parser = new JsonParser(); + + private static final String transientSettings = "{\"transient\": {\"script.max_compilations_per_minute\":120}}"; + + private static final String updateMasterRef = + "{\"query\": {\"terms\": {\"id\":[\"master\"]}}, \"script\": {\"inline\": \"ctx._source.type = \\\"Branch\\\"\"}}"; + + private static final String deleteQuery = + "{\"query\": {\"constant_score\": {\"filter\": {\"terms\": {}}}}}"; + + private static final String updateQuery = "UPDATE \"commits\" SET timestamp = ? WHERE elasticid = ?"; + + public static boolean apply(ServiceRegistry services) throws Exception { + logger.info("Running Migrate_3_4_0"); + PostgresHelper pgh = new PostgresHelper(); + ElasticHelper eh = new ElasticHelper(); + + JsonObject mappingTemplate = new JsonObject(); + + // Temporarily increase max_compilations_per_minute + eh.updateClusterSettings(transientSettings); + + boolean noErrors = true; + + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + InputStream resourceAsStream = classLoader.getResourceAsStream("mapping_template.json"); + Scanner s = new Scanner(resourceAsStream).useDelimiter("\\A"); + if (s.hasNext()) { + mappingTemplate = JsonUtil.buildFromString(s.next()); + eh.applyTemplate(mappingTemplate.toString()); + } + eh.updateMapping(EmsConfig.get("elastic.index.element"), ElasticHelper.PROFILE, + mappingTemplate.get("mappings").getAsJsonObject().get(ElasticHelper.PROFILE).getAsJsonObject().toString()); + List> orgs = pgh.getOrganizations(null); + + for (Map org : orgs) { + String orgId = org.get("orgId"); + List> projects = pgh.getProjects(orgId); + for (Map project : projects) { + String projectId = project.get(Sjm.SYSMLID).toString(); + pgh.setProject(projectId); + + if (mappingTemplate.isJsonObject()) { + eh.updateMapping(projectId, ElasticHelper.REF, + mappingTemplate.get("mappings").getAsJsonObject().get(ElasticHelper.REF).getAsJsonObject().toString()); + } + + List> allRefs = pgh.getRefsElastic(true); + + if (!allRefs.isEmpty()) { + Set refsToMove = new HashSet<>(); + JsonArray insertPayload = new JsonArray(); + JsonArray deleteSet = new JsonArray(); + + for (Pair singleRef : allRefs) { + refsToMove.add(singleRef.second); + } + + List refIds = new ArrayList<>(); + refIds.addAll(refsToMove); + + JsonArray refs = eh.getElementsFromElasticIds(refIds, projectId); + + if (refs.size() > 0) { + for (int i = 0; i < refs.size(); i++) { + JsonObject ref = refs.get(i).getAsJsonObject(); + if (ref.get(Sjm.ELASTICID) != null) { + insertPayload.add(ref); + } + if (ref.get(Sjm.SYSMLID) != null) { + deleteSet.add(ref.get(Sjm.SYSMLID).getAsString()); + } + } + + if (deleteSet.size() > 0) { + JsonObject delQuery = parser.parse(deleteQuery).getAsJsonObject(); + delQuery.get("query").getAsJsonObject().get("constant_score").getAsJsonObject() + .get("filter").getAsJsonObject().get("terms").getAsJsonObject() + .add(Sjm.SYSMLID, deleteSet); + eh.deleteByQuery(projectId, delQuery.toString(), ElasticHelper.ELEMENT); + } + + if (!refsToMove.isEmpty()) { + eh.bulkIndexElements(insertPayload, "added", true, projectId, ElasticHelper.REF); + eh.updateByQuery(projectId, updateMasterRef, ElasticHelper.REF); + } + } + } + + List> commits = pgh.getAllCommits(); + for (Map commit : commits) { + String commitId = commit.get("commitId"); + if (!commitId.isEmpty()) { + JsonObject commitObject = eh.getByElasticId(commitId, projectId, ElasticHelper.COMMIT); + if (commitObject != null && commitObject.has(Sjm.CREATED)) { + try (PreparedStatement statement = pgh.prepareStatement(updateQuery)) { + Date created = df.parse(commitObject.get(Sjm.CREATED).getAsString()); + Timestamp ts = new Timestamp(created.getTime()); + statement.setTimestamp(1, ts); + statement.setString(2, commitId); + statement.execute(); + } catch (ParseException pe) { + logger.info("Unable to parse date: ", pe); + } + } else { + logger.error("Commit object has no created date."); + noErrors = false; + } + } + } + } + } + + return noErrors; + } +} diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/connections/JmsConnection.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/connections/JmsConnection.java index 9244f70d..6133f301 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/connections/JmsConnection.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/connections/JmsConnection.java @@ -1,5 +1,6 @@ package gov.nasa.jpl.view_repo.connections; +import gov.nasa.jpl.view_repo.util.EmsNodeUtil; import java.util.HashMap; import java.util.Hashtable; import java.util.Map; @@ -8,6 +9,7 @@ import javax.jms.ConnectionFactory; import javax.jms.DeliveryMode; import javax.jms.Destination; +import javax.jms.JMSException; import javax.jms.MessageProducer; import javax.jms.Session; import javax.jms.TextMessage; @@ -18,10 +20,8 @@ import org.apache.log4j.Logger; -import gov.nasa.jpl.mbee.util.Utils; import gov.nasa.jpl.view_repo.util.CommitUtil; import gov.nasa.jpl.view_repo.util.EmsConfig; -import gov.nasa.jpl.view_repo.util.NodeUtil; import com.google.gson.JsonObject; import com.google.gson.JsonArray; @@ -150,21 +150,21 @@ protected static ConnectionInfo initConnectionInfo(String eventType) { public boolean publishMessage(String msg, String eventType) { ConnectionInfo ci = getConnectionMap().get(eventType); - if (ci.uri == null) + if (ci.uri == null) { return false; + } - if (init(eventType) == false) + if (!init(eventType)) { return false; + } boolean status = true; - try { - // Create a Connection - Connection connection = ci.connectionFactory.createConnection(); - connection.start(); - // Create a Session - Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); + MessageProducer producer = null; + try (Connection connection = ci.connectionFactory.createConnection(); + Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);) { + connection.start(); // lookup the destination Destination destination; try { @@ -181,7 +181,7 @@ public boolean publishMessage(String msg, String eventType) { } // Create a MessageProducer from the Session to the Topic or Queue - MessageProducer producer = session.createProducer(destination); + producer = session.createProducer(destination); producer.setDeliveryMode(DeliveryMode.PERSISTENT); // Create a message @@ -195,19 +195,23 @@ public boolean publishMessage(String msg, String eventType) { message.setStringProperty("projectId", projectId); } message.setLongProperty("MessageID", sequenceId++); - message.setStringProperty("MessageSource", NodeUtil.getHostname()); + message.setStringProperty("MessageSource", EmsNodeUtil.getHostname()); message.setStringProperty("MessageRecipient", "TMS"); message.setStringProperty("MessageType", eventType.toUpperCase()); // Tell the producer to send the message producer.send(message); - - // Clean up - session.close(); - connection.close(); } catch (Exception e) { logger.error("JMS exception caught, probably means JMS broker not up"); status = false; + } finally { + if (producer != null) { + try { + producer.close(); + } catch (JMSException e) { + logger.error(e); + } + } } return status; @@ -227,7 +231,7 @@ public boolean publishMessage(String msg, String eventType) { for (String eventType : getConnectionMap().keySet()) { ConnectionInfo ci = getConnectionMap().get(eventType); if (ci.uri.contains("localhost")) { - ci.uri = ci.uri.replace("localhost", NodeUtil.getHostname()); + ci.uri = ci.uri.replace("localhost", EmsNodeUtil.getHostname()); getConnectionMap().put(eventType, ci); } diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/db/ElasticHelper.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/db/ElasticHelper.java index c0059232..3effb7d0 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/db/ElasticHelper.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/db/ElasticHelper.java @@ -7,6 +7,7 @@ import java.util.Map; import java.util.Set; +import com.google.gson.JsonElement; import io.searchbox.cluster.UpdateSettings; import io.searchbox.core.*; import io.searchbox.indices.DeleteIndex; @@ -49,8 +50,9 @@ public class ElasticHelper implements ElasticsearchInterface { public static final String ELEMENT = "element"; public static final String COMMIT = "commit"; - private static final String PROFILE = "profile"; - private static final String ARTIFACT = "artifact"; + public static final String PROFILE = "profile"; + public static final String ARTIFACT = "artifact"; + public static final String REF = "ref"; private static final String COMMIT_QUERY = "{\"query\":{\"bool\":{\"filter\":[{\"term\":{\"%1$s\":\"%2$s\"}},{\"term\":{\"%3$s\":\"%4$s\"}}]}}}"; @@ -128,43 +130,30 @@ public void updateByQuery(String index, String payload, String type) throws IOEx client.execute(updateByQuery); } + public void deleteByQuery(String index, String payload, String type) throws IOException { + DeleteByQuery deleteByQuery = + new DeleteByQuery.Builder(payload).addIndex(index.toLowerCase().replaceAll("\\s+", "")).addType(type) + .build(); + client.execute(deleteByQuery); + } + public void updateClusterSettings(String payload) throws IOException { UpdateSettings updateSettings = new UpdateSettings.Builder(payload).build(); client.execute(updateSettings); } - /** - * Gets the JSON document of element type using a elastic _id (1) - * - * @param id _id elasticsearch property (2) - * @return JSONObject o or null - */ - public JsonObject getElementByElasticId(String id, String index) throws IOException { - // Cannot use method for commit type - return getByElasticId(id, index, ELEMENT); - } - - public JsonObject getProfileByElasticId(String id, String index) throws IOException { - // Cannot use method for commit type - return getByElasticId(id, index, PROFILE); - } - - public JsonObject getElementByElasticIdArtifact(String id, String index) throws IOException { - // Cannot use method for commit type - return getByElasticId(id, index, ARTIFACT); - } - public JsonObject getByElasticId(String id, String index, String type) throws IOException { Get get = new Get.Builder(index.toLowerCase().replaceAll("\\s+", ""), id).type(type).build(); JestResult result = client.execute(get); - if (result.isSucceeded()) { JsonObject o = result.getJsonObject().get("_source").getAsJsonObject(); o.add(Sjm.ELASTICID, result.getJsonObject().get("_id")); + if (type.equals(COMMIT)) { + o.add(Sjm.SYSMLID, result.getJsonObject().get("_id")); + } return o; } - return null; } @@ -258,42 +247,7 @@ public JsonArray getCommitHistory(String sysmlid, String index) throws IOExcepti return array; } - /** - * Gets the JSON document of commit type using a elastic _id (1) - * - * @param id _id elasticsearch property (2) - * @return JSONObject o or null - */ - public JsonObject getCommitByElasticId(String id, String index) throws IOException { - if (id == null) { - return null; - } - Get get = new Get.Builder(index.toLowerCase().replaceAll("\\s+", ""), id).type(COMMIT).build(); - - JestResult result = client.execute(get); - - if (!result.isSucceeded() && result.getResponseCode() != 404) { - throw new IOException( - String.format("Elasticsearch error[%1$s]:%2$s", - result.getResponseCode(), result.getErrorMessage())); - } else if (result.isSucceeded()) { - JsonObject o = result.getJsonObject().getAsJsonObject("_source"); - o.add(Sjm.SYSMLID, result.getJsonObject().get("_id")); - return o; - } - - return null; - } - - public JsonObject getElementByCommitId(String elasticId, String sysmlid, String index) throws IOException { - return getByCommitId(elasticId, sysmlid, index, ELEMENT); - } - - public JsonObject getArtifactByCommitId(String elasticId, String sysmlid, String index) throws IOException { - return getByCommitId(elasticId, sysmlid, index, ARTIFACT); - } - - private JsonObject getByCommitId(String elasticId, String sysmlid, String index, String type) throws IOException { + public JsonObject getByCommitId(String elasticId, String sysmlid, String index, String type) throws IOException { String query = String.format(COMMIT_QUERY, Sjm.COMMITID, elasticId, Sjm.SYSMLID, sysmlid); if (logger.isDebugEnabled()) { @@ -424,26 +378,17 @@ public boolean refreshIndex() throws IOException { return result.isSucceeded(); } - public boolean updateElement(String id, JsonObject payload, String index) throws IOException { - JsonObject update = new JsonObject(); - update.add("doc", payload); - update.addProperty("_source", true); - JestResult updated = client.execute( - new Update.Builder(update.toString()).id(id).index(index.toLowerCase().replaceAll("\\s+", "")).type(ELEMENT) - .build()); - return updated.isSucceeded(); - } - - public JsonObject updateProfile(String id, JsonObject payload, String index) throws IOException { + public JsonObject updateById(String id, JsonObject payload, String index, String type) throws IOException { JsonObject upsert = new JsonObject(); upsert.add("doc", payload); upsert.addProperty("doc_as_upsert", true); upsert.addProperty("_source", true); JestResult res = client.execute( - new Update.Builder(upsert.toString()).id(id).index(index.toLowerCase().replaceAll("\\s+", "")).type(PROFILE) + new Update.Builder(upsert.toString()).id(id).index(index.toLowerCase().replaceAll("\\s+", "")).type(type) .build()); - if (res.isSucceeded()) + if (res.isSucceeded()) { return res.getJsonObject().get("get").getAsJsonObject().get("_source").getAsJsonObject(); + } return new JsonObject(); } @@ -542,7 +487,9 @@ public JsonObject search(JsonObject queryJson) throws IOException { return top; } + if (result.getTotal() > 0) { + top.addProperty("total", result.getJsonObject().getAsJsonObject("hits").get("total").getAsInt()); JsonArray hits = result.getJsonObject().getAsJsonObject("hits").getAsJsonArray("hits"); for (int i = 0; i < hits.size(); i++) { @@ -573,7 +520,7 @@ public JsonObject searchLiteral(JsonObject queryJson) throws IOException { * @param ids * @return JSONObject Result */ - public JsonObject bulkDeleteByType(String type, ArrayList ids, String index) { + public JsonObject bulkDeleteByType(Set ids, String index, String type) { if (ids.isEmpty()) { return new JsonObject(); } @@ -582,9 +529,9 @@ public JsonObject bulkDeleteByType(String type, ArrayList ids, String in try { ArrayList deleteList = new ArrayList<>(); - for (String commitId : ids) { + for (String elasticId : ids) { deleteList.add( - new Delete.Builder(commitId).type(type).index(index.toLowerCase().replaceAll("\\s+", "")).build()); + new Delete.Builder(elasticId).type(type).index(index.toLowerCase().replaceAll("\\s+", "")).build()); } Bulk bulk = new Bulk.Builder().defaultIndex(index.toLowerCase().replaceAll("\\s+", "")).defaultIndex(type) .addAction(deleteList).build(); @@ -675,7 +622,7 @@ public JsonObject getElementsLessThanOrEqualTimestamp(String sysmlId, String tim } count += termLimit; } - return new JsonObject(); + return null; } public Map getDeletedElementsFromCommits(List commitIds, String index) { @@ -735,4 +682,9 @@ public Map getDeletedElementsFromCommits(List commitIds, } return deletedElements; } + + public static boolean containsScript(JsonObject json) { + String jsonString = json.toString(); + return jsonString.contains("\"script\""); + } } diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/db/ElasticsearchInterface.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/db/ElasticsearchInterface.java index de27c9e2..2352db9e 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/db/ElasticsearchInterface.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/db/ElasticsearchInterface.java @@ -18,29 +18,21 @@ public interface ElasticsearchInterface { void deleteIndex(String index) throws IOException; - JsonObject getElementByElasticId(String id, String index) throws IOException; - JsonArray getCommitHistory(String sysmlid, String index) throws IOException; - JsonObject getCommitByElasticId(String id, String index) throws IOException; - - JsonObject getElementByCommitId(String elasticId, String sysmlid, String index) throws IOException; - JsonArray getElementsFromElasticIds(List ids, String index) throws IOException; ElasticResult indexElement(JsonObject j, String index, String eType) throws IOException; boolean refreshIndex() throws IOException; - boolean updateElement(String id, JsonObject payload, String index) throws IOException; - boolean bulkIndexElements(JsonArray bulkElements, String operation, boolean refresh, String index, String type) throws IOException; boolean bulkUpdateElements(Set elements, String payload, String index, String type) throws IOException; JsonObject search(JsonObject queryJson) throws IOException; - JsonObject bulkDeleteByType(String type, ArrayList ids, String index); + JsonObject bulkDeleteByType(Set ids, String index, String type); JsonObject getElementsLessThanOrEqualTimestamp(String sysmlId, String timestamp, List refsCommitIds, String index); diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/db/PostgresHelper.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/db/PostgresHelper.java index 78ce189a..ad539364 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/db/PostgresHelper.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/db/PostgresHelper.java @@ -97,19 +97,19 @@ public Connection getConn(String type) { } public void close() { - try { - if (this.connMap.containsKey(project)) { - this.connMap.get(project).close(); - } - } catch (SQLException e) { - logger.error(String.format("%s", LogUtil.getStackTrace(e))); - } + closeConnection(project); } public void closeConfig() { + closeConnection("config"); + } + + private void closeConnection(String key) + { try { - if (this.connMap.containsKey("config")) { - this.connMap.get("config").close(); + Connection connection = this.connMap.remove(key); + if (connection != null) { + connection.close(); } } catch (SQLException e) { logger.error(String.format("%s", LogUtil.getStackTrace(e))); @@ -900,7 +900,6 @@ public String insertCommit(String elasticId, DbCommitTypes type, String creator, Map map = new HashMap<>(); // we can hard code the commit type here....but we should still store the integer value // from the DB in memory - int parentId = getHeadCommit(); map.put("elasticId", elasticId); map.put("commitType", type.getValue()); map.put("refId", workspaceId); @@ -1107,10 +1106,10 @@ public int getCommitId(String commitId) { } try (PreparedStatement statement = prepareStatement("SELECT id FROM commits WHERE elasticid = ?")) { statement.setString(1, commitId); - ResultSet rs = statement.executeQuery(); - - if (rs.next()) { - return rs.getInt(1); + try (ResultSet rs = statement.executeQuery()) { + if (rs.next()) { + return rs.getInt(1); + } } } catch (Exception e) { logger.warn(String.format("%s", LogUtil.getStackTrace(e))); @@ -1359,13 +1358,13 @@ public String getGroup(String sysmlId) { statement.setInt(1, n.getId()); statement.setInt(2, DbEdgeTypes.CONTAINMENT.getValue()); statement.setString(3, workspaceId); - ResultSet rs = statement.executeQuery(); - - while (rs.next()) { - if (rs.getInt(3) == DbNodeTypes.SITEANDPACKAGE.getValue()) { - return rs.getString(1); - } else if (rs.getInt(3) == DbNodeTypes.SITE.getValue()) { - return null; + try (ResultSet rs = statement.executeQuery()) { + while (rs.next()) { + if (rs.getInt(3) == DbNodeTypes.SITEANDPACKAGE.getValue()) { + return rs.getString(1); + } else if (rs.getInt(3) == DbNodeTypes.SITE.getValue()) { + return null; + } } } } @@ -1925,9 +1924,10 @@ public boolean isTag(String refId) { "SELECT tag FROM refs WHERE (refId = ? OR refName = ?) AND deleted = false")) { statement.setString(1, sanitizeRefId(refId)); statement.setString(2, sanitizeRefId(refId)); - ResultSet rs = statement.executeQuery(); - if (rs.next()) { - return rs.getBoolean(1); + try (ResultSet rs = statement.executeQuery()) { + if (rs.next()) { + return rs.getBoolean(1); + } } } catch (Exception e) { logger.warn(String.format("%s", LogUtil.getStackTrace(e))); @@ -1998,13 +1998,12 @@ public Pair getParentRef(String refId) { try (PreparedStatement statement = prepareStatement( "SELECT parent, timestamp FROM refs WHERE deleted = false AND refId = ?")) { statement.setString(1, sanitizeRefId(refId)); - ResultSet rs = statement.executeQuery(); - if (rs.next()) { - String checkForMaster = - (rs.getString(1).equals("") && !refId.equals("master")) ? "master" : rs.getString(1); - return new Pair<>(checkForMaster, rs.getTimestamp(2).getTime()); + try (ResultSet rs = statement.executeQuery()) { + if (rs.next()) { + String checkForMaster = (rs.getString(1).equals("") && !refId.equals("master")) ? "master" : rs.getString(1); + return new Pair<>(checkForMaster, rs.getTimestamp(2).getTime()); + } } - } catch (Exception e) { logger.warn(String.format("%s", LogUtil.getStackTrace(e))); } finally { @@ -2144,9 +2143,10 @@ public List> getRefsCommits(String refId, int commitId, Time public String getProjectInitialCommit() { try (PreparedStatement statement = prepareStatement( "SELECT elasticid FROM commits WHERE id = (SELECT min(id) FROM commits)")) { - ResultSet rs = statement.executeQuery(); - if (rs.next()) { - return rs.getString(1); + try (ResultSet rs = statement.executeQuery()) { + if (rs.next()) { + return rs.getString(1); + } } } catch (Exception e) { logger.warn(String.format("%s", LogUtil.getStackTrace(e))); @@ -2210,10 +2210,11 @@ public boolean orgExists(String orgId) { try (PreparedStatement query = getConn("config") .prepareStatement("SELECT count(id) FROM organizations WHERE orgId = ?")) { query.setString(1, orgId); - ResultSet rs = query.executeQuery(); - if (rs.next()) { - if (rs.getInt(1) > 0) { - return true; + try (ResultSet rs = query.executeQuery()) { + if (rs.next()) { + if (rs.getInt(1) > 0) { + return true; + } } } } catch (SQLException e) { diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/db/PostgresPool.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/db/PostgresPool.java index 3cbfd252..4aad6d58 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/db/PostgresPool.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/db/PostgresPool.java @@ -4,64 +4,125 @@ import java.sql.SQLException; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.TimeUnit; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.RemovalCause; +import com.google.common.cache.RemovalNotification; import org.apache.commons.dbcp.BasicDataSource; import gov.nasa.jpl.view_repo.util.EmsConfig; +import org.apache.log4j.Logger; public class PostgresPool { + static Logger logger = Logger.getLogger(PostgresPool.class); - private static final int MAX_IDLE_CONN = 2; - private static final int MAX_ACTIVE_CONN = 96; + static final int MAX_IDLE_CONN = 2; + static final int MIN_IDLE_CONN = 0; + static final int MAX_ACTIVE_CONN = 96; + static final int MAX_CONN_LIMIT = 192; - private static final String PG_CONN_MAX = "pg.conn.max"; - private static final String PG_USER = "pg.user"; - private static final String PG_PASS = "pg.pass"; + static final String PG_CONN_MAX = "pg.conn.max"; + static final String PG_USER = "pg.user"; + static final String PG_PASS = "pg.pass"; + static final String PG_SEC = "pg.secured"; + private String host; + private String name; private String connectString; - private static Map dataSource = new HashMap<>(); - private Map bds = new HashMap<>(); - - private PostgresPool(String connectString) { - this.connectString = connectString; - if (!bds.containsKey(connectString)) { - bds.put(connectString, new BasicDataSource()); - bds.get(connectString).setDriverClassName("org.postgresql.Driver"); - bds.get(connectString).setUrl(connectString); - bds.get(connectString).setUsername(EmsConfig.get(PG_USER)); - bds.get(connectString).setPassword(EmsConfig.get(PG_PASS)); - bds.get(connectString).setInitialSize(10); - bds.get(connectString).setMaxIdle(MAX_IDLE_CONN); - bds.get(connectString).setMaxActive((!EmsConfig.get(PG_CONN_MAX).equals("")) ? Integer.parseInt(EmsConfig.get( - PG_CONN_MAX)) : MAX_ACTIVE_CONN); - bds.get(connectString).setMaxWait(10000); - bds.get(connectString).setDefaultAutoCommit(true); - bds.get(connectString).setRemoveAbandonedTimeout(1); - bds.get(connectString).setLogAbandoned(true); - bds.get(connectString).setRemoveAbandoned(true); - bds.get(connectString).setTimeBetweenEvictionRunsMillis(1000 * 60); - bds.get(connectString).setMinEvictableIdleTimeMillis(1000 * 60 * 60); + private BasicDataSource bds = null; + + private static Map dataSources = new HashMap<>(); + private static Map> activeDataSources = new HashMap<>(); + + + interface IBasicDataSourceFactory { + BasicDataSource getNewBasicDataSource(); + } + + + private static IBasicDataSourceFactory basicDataSourceFactory = null; + + private PostgresPool(String host, String name) { + this.host = host; + this.name = name; + this.connectString = getConnectString(host, name); + + this.bds = getBasicDataSourceFactory().getNewBasicDataSource(); + this.bds.setDriverClassName("org.postgresql.Driver"); + this.bds.setUrl(this.connectString); + this.bds.setUsername(EmsConfig.get(PG_USER)); + this.bds.setPassword(EmsConfig.get(PG_PASS)); + this.bds.setInitialSize(10); + this.bds.setMaxIdle(MAX_IDLE_CONN); + this.bds.setMinIdle(MIN_IDLE_CONN); + this.bds.setMaxActive( + (!EmsConfig.get(PG_CONN_MAX).equals("")) ? Integer.parseInt(EmsConfig.get(PG_CONN_MAX)) : MAX_ACTIVE_CONN); + this.bds.setMaxWait(10000); + this.bds.setDefaultAutoCommit(true); + this.bds.setRemoveAbandonedTimeout(1); + this.bds.setLogAbandoned(true); + this.bds.setRemoveAbandoned(true); + this.bds.setTimeBetweenEvictionRunsMillis(1000 * 60); + this.bds.setMinEvictableIdleTimeMillis(1000 * 60 * 5); + + if (EmsConfig.get(PG_SEC) != null && EmsConfig.get(PG_SEC).equalsIgnoreCase("true")) { + this.bds.setConnectionProperties("ssl=true"); } } - public static PostgresPool getInstance(String host, String name) { - String connectString = host + name; - if (!dataSource.containsKey(connectString)) { - dataSource.put(connectString, newInstance(host, name)); + private static String getConnectString(String host, String name) { + return host + name; + } + + public static synchronized PostgresPool getInstance(String host, String name) { + String connectString = getConnectString(host, name); + Cache cache = getActiveDatasetCache(host); + PostgresPool pool = cache.getIfPresent(connectString); + if (pool == null) { + pool = dataSources.get(connectString); + if (pool == null) { + pool = newInstance(host, name); + dataSources.put(connectString, pool); + } } - return dataSource.get(connectString); + return pool; } private static PostgresPool newInstance(String host, String name) { - return new PostgresPool(host + name); + return new PostgresPool(host, name); } public Connection getConnection() throws SQLException { - return this.bds.get(connectString).getConnection(); + goActive(); + Connection connection = this.bds.getConnection(); + updatePool(); + return connection; + } + + private void updatePool() { + getActiveDatasetCache(host).put(this.connectString, this); + } + + private int getWeight() { + return this.bds.getNumActive() + this.bds.getNumIdle(); + } + + private void goActive() { + this.bds.setMaxIdle(MAX_IDLE_CONN); + } + + private void goIdle() { + this.bds.setMaxIdle(MIN_IDLE_CONN); + if (this.bds.getNumActive() > 0) { + logger.warn("Database connection pool (" + getConnectString(host, name) + + ") with active connections was instructed to go idle. Database may be overloaded"); + } } public static Connection getStandaloneConnection(String host, String name) throws SQLException { - BasicDataSource bds = new BasicDataSource(); + BasicDataSource bds = getBasicDataSourceFactory().getNewBasicDataSource(); bds.setDriverClassName("org.postgresql.Driver"); bds.setUrl(host + name); bds.setUsername(EmsConfig.get(PG_USER)); @@ -80,18 +141,59 @@ public static Connection getStandaloneConnection(String host, String name) throw /** * Given a host and name this will remove the connection source from the PostgresPool + * * @param host * @param name */ static void removeConnection(String host, String name) { String connectString; + //TODO: Why is this different here?? if (!name.startsWith("_")) { connectString = host + "_" + name; } else { connectString = host + name; } - if (dataSource.containsKey(connectString)) { - dataSource.remove(connectString); + dataSources.remove(connectString); + getActiveDatasetCache(host).invalidate(connectString); + } + + private static Cache getActiveDatasetCache(String host) { + Cache cache = activeDataSources.get((host)); + + if (cache == null) { + cache = CacheBuilder.newBuilder().maximumWeight(MAX_CONN_LIMIT) + .weigher((String key, PostgresPool pool) -> pool.getWeight()).expireAfterAccess(5, TimeUnit.MINUTES) + .removalListener((RemovalNotification v) -> { + if (v.getCause() != RemovalCause.REPLACED) { + v.getValue().goIdle(); + } + }).build(); + activeDataSources.put(host, cache); + } + return cache; + } + + + public static IBasicDataSourceFactory getBasicDataSourceFactory() { + if (basicDataSourceFactory == null) { + basicDataSourceFactory = () -> new BasicDataSource(); + } + return basicDataSourceFactory; + } + + public static void setBasicDataSourceFactory(IBasicDataSourceFactory basicDataSourceFactory) { + PostgresPool.basicDataSourceFactory = basicDataSourceFactory; + } + + static void purgeDatabasePools() { + activeDataSources.clear(); + dataSources.clear(); + } + + static void idleDatabasePools() { + for (Cache cache : activeDataSources.values()) { + cache.invalidateAll(); } } + } diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/util/CommitUtil.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/util/CommitUtil.java index b6a61386..a1fb3ffa 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/util/CommitUtil.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/util/CommitUtil.java @@ -1,8 +1,11 @@ package gov.nasa.jpl.view_repo.util; +import gov.nasa.jpl.view_repo.db.Node; import java.io.IOException; import java.sql.SQLException; import java.sql.Savepoint; +import java.sql.Timestamp; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; @@ -11,8 +14,6 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.BlockingQueue; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -56,7 +57,6 @@ public class CommitUtil { static Logger logger = Logger.getLogger(CommitUtil.class); public static final String TYPE_BRANCH = "BRANCH"; - public static final String TYPE_COMMIT = "COMMIT"; public static final String TYPE_DELTA = "DELTA"; public static final String TYPE_MERGE = "MERGE"; @@ -70,7 +70,6 @@ public class CommitUtil { private static final String INITIALCOMMIT = "initialcommit"; private static final String LASTCOMMIT = "lastcommit"; private static final String ARTIFACTS = "artifacts"; - private static final String CONTENTTYPE = "contentType"; private static final String HOLDING_BIN_PREFIX = "holding_bin_"; @@ -79,6 +78,8 @@ public class CommitUtil { private static String user = null; + private static SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + private static HazelcastInstance hzInstance = null; public static void setJmsConnection(JmsConnection jmsConnection) { @@ -166,10 +167,6 @@ public static boolean isGroup(JsonObject element) { return element.has(Sjm.ISGROUP) && element.get(Sjm.ISGROUP).getAsBoolean(); } - public static JsonObject indexProfile(String id, JsonObject elements, String index) throws IOException { - return eh.updateProfile(id, elements, index); - } - private static boolean bulkElasticEntry(JsonArray elements, String operation, boolean refresh, String index, String type) { if (elements.size() > 0) { @@ -218,6 +215,7 @@ private static boolean processArtifactDeltasForDb(JsonObject delta, String proje JsonArray deleted = JsonUtil.getOptArray(delta, "deletedElements"); String creator = delta.get("commit").getAsJsonObject().get(Sjm.CREATOR).getAsString(); + String created = delta.get("commit").getAsJsonObject().get(Sjm.CREATED).getAsString(); String commitElasticId = delta.get("commit").getAsJsonObject().get(Sjm.ELASTICID).getAsString(); JsonObject jmsWorkspace = new JsonObject(); @@ -275,7 +273,7 @@ private static boolean processArtifactDeltasForDb(JsonObject delta, String proje pgh.runBatchQueries(artifactUpdates, "artifactUpdates"); pgh.updateLastCommitsArtifacts(commitElasticId, deletedSysmlIds); pgh.commitTransaction(); - pgh.insertCommit(commitElasticId, DbCommitTypes.COMMIT, creator); + pgh.insertCommit(commitElasticId, DbCommitTypes.COMMIT, creator, new Timestamp(df.parse(created).getTime())); } catch (Exception e) { try { pgh.rollBackToSavepoint(sp); @@ -330,6 +328,7 @@ private static boolean processDeltasForDb(JsonObject delta, String projectId, St JsonArray deleted = JsonUtil.getOptArray(delta, "deletedElements"); String creator = delta.get("commit").getAsJsonObject().get(Sjm.CREATOR).getAsString(); + String created = delta.get("commit").getAsJsonObject().get(Sjm.CREATED).getAsString(); String commitElasticId = delta.get("commit").getAsJsonObject().get(Sjm.ELASTICID).getAsString(); JsonObject jmsWorkspace = new JsonObject(); @@ -524,7 +523,7 @@ private static boolean processDeltasForDb(JsonObject delta, String projectId, St //pgh.updateBySysmlIds(NODES, LASTCOMMIT, commitElasticId, deletedSysmlIds); pgh.updateLastCommitsNodes(commitElasticId, deletedSysmlIds); pgh.commitTransaction(); - pgh.insertCommit(commitElasticId, DbCommitTypes.COMMIT, creator); + pgh.insertCommit(commitElasticId, DbCommitTypes.COMMIT, creator, new Timestamp(df.parse(created).getTime())); sp = pgh.startTransaction(); pgh.runBatchQueries(edgeInserts, EDGES); pgh.commitTransaction(); @@ -657,7 +656,6 @@ public static JsonObject sendOrganizationDelta(String orgId, String orgName, Jso PostgresHelper pgh = new PostgresHelper(); String defaultIndex = EmsConfig.get("elastic.index.element"); - ElasticResult result = null; try { ElasticHelper eh = new ElasticHelper(); @@ -666,15 +664,13 @@ public static JsonObject sendOrganizationDelta(String orgId, String orgName, Jso pgh.createOrganization(orgId, orgName); eh.createIndex(defaultIndex); orgJson.addProperty(Sjm.ELASTICID, orgId); - result = eh.indexElement(orgJson, defaultIndex, ElasticHelper.ELEMENT); + ElasticResult result = eh.indexElement(orgJson, defaultIndex, ElasticHelper.ELEMENT); return result.current; } else { pgh.updateOrganization(orgId, orgName); orgJson.addProperty(Sjm.ELASTICID, orgId); - if (eh.updateElement(orgId, orgJson, defaultIndex)) { - if (eh.refreshIndex()) { - return eh.getElementByElasticId(orgId, defaultIndex); - } + if (eh.updateById(orgId, orgJson, defaultIndex, ElasticHelper.ELEMENT).size() > 0 && eh.refreshIndex()) { + return eh.getByElasticId(orgId, defaultIndex, ElasticHelper.ELEMENT); } } @@ -760,12 +756,14 @@ public static void sendProjectDelta(JsonObject o, String orgId, String user) { try { ElasticHelper eh = new ElasticHelper(); - eh.createIndex(projectSysmlid); - eProject = eh.indexElement(project, projectSysmlid, ElasticHelper.ELEMENT); - eh.refreshIndex(); + Node projectNode = pgh.getNodeFromSysmlId(projectSysmlid); // only insert if the project does not exist already - if (pgh.getNodeFromSysmlId(projectSysmlid) == null) { + if (projectNode == null) { + eh.createIndex(projectSysmlid); + eProject = eh.indexElement(project, projectSysmlid, ElasticHelper.ELEMENT); + eh.refreshIndex(); + eProjectHoldingBin = eh.indexElement(projectHoldingBin, projectSysmlid, ElasticHelper.ELEMENT); eViewInstanceBin = eh.indexElement(viewInstanceBin, projectSysmlid, ElasticHelper.ELEMENT); eh.refreshIndex(); @@ -788,7 +786,10 @@ public static void sendProjectDelta(JsonObject o, String orgId, String user) { jmsMsg.addProperty("source", "mms"); sendJmsMsg(jmsMsg, TYPE_DELTA, null, projectSysmlid); } else { - pgh.updateElasticId(projectSysmlid, eProject.elasticId); + project.remove(Sjm.CREATED); + project.remove(Sjm.CREATOR); + eh.updateById(projectNode.getElasticId(), project, projectSysmlid, ElasticHelper.ELEMENT); + eh.refreshIndex(); } } catch (Exception e) { if (logger.isDebugEnabled()) { @@ -820,23 +821,24 @@ public static synchronized JsonObject sendBranch(String projectId, JsonObject sr user = services.getNodeService().getProperty(person, ContentModel.PROP_EMAIL).toString(); } - if (hasCommit) { - ExecutorService executor = Executors.newSingleThreadExecutor(); - executor - .submit(new BranchTask(projectId, srcId, created.toString(), elasticId, isTag, source, commitId, user)); - executor.shutdown(); - } else { - initHazelcastQueue(String.format("%s-%s", projectId, createdId)); - BlockingQueue queue = hzInstance.getQueue(String.format("%s-%s", projectId, createdId)); - BranchTask task = - new BranchTask(projectId, srcId, created.toString(), elasticId, isTag, source, commitId, user); + BranchTask task = + new BranchTask(projectId, srcId, created.toString(), elasticId, isTag, source, commitId, user); - try { - queue.put(task); - } catch (InterruptedException ie) { + created.addProperty("status", "creating"); + + String queueId = hasCommit ? "branch_from_the_past" : String.format("%s-%s", projectId, createdId); + + initHazelcastQueue(queueId); + BlockingQueue queue = hzInstance.getQueue(queueId); + + try { + queue.put(task); + } catch (InterruptedException ie) { + if (logger.isDebugEnabled()) { logger.debug(String.format("Interrupted: %s", LogUtil.getStackTrace(ie))); - Thread.currentThread().interrupt(); } + created.addProperty("status", "rejected"); + Thread.currentThread().interrupt(); } return branchJson; @@ -895,20 +897,20 @@ public static boolean createOrUpdateSiteChar(JsonObject siteChar, String project EmsScriptNode documentLibrary = site.childByNamePath("documentLibrary"); if (documentLibrary == null) { - documentLibrary = site.createFolder("documentLibrary", null, null); - documentLibrary.createOrUpdateProperty(Acm.CM_TITLE, "Document Library"); + documentLibrary = site.createFolder("documentLibrary", null); + documentLibrary.setProperty(Acm.CM_TITLE, "Document Library"); } EmsScriptNode projectDocumentLibrary = documentLibrary.childByNamePath(projectId); if (projectDocumentLibrary == null) { - projectDocumentLibrary = documentLibrary.createFolder(projectId, null, null); + projectDocumentLibrary = documentLibrary.createFolder(projectId, null); } EmsScriptNode siteCharFolder = projectDocumentLibrary.childByNamePath(folderId); if (siteCharFolder == null) { - siteCharFolder = projectDocumentLibrary.createFolder(folderId, null, null); - siteCharFolder.createOrUpdateProperty(Acm.CM_TITLE, folderName); + siteCharFolder = projectDocumentLibrary.createFolder(folderId, null); + siteCharFolder.setProperty(Acm.CM_TITLE, folderName); return true; } else { - siteCharFolder.createOrUpdateProperty(Acm.CM_TITLE, folderName); + siteCharFolder.setProperty(Acm.CM_TITLE, folderName); return true; } } diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/util/EmsConfig.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/util/EmsConfig.java index 71be5654..4bca5d7f 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/util/EmsConfig.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/util/EmsConfig.java @@ -18,7 +18,7 @@ public static void setProperties(String propertiesFile) throws Exception { } } - public static void setAlfrescoProperties(Properties alfrescoProperties) throws Exception { + public static void setAlfrescoProperties(Properties alfrescoProperties) { EmsConfig.properties.putAll(alfrescoProperties); } diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/util/EmsNodeUtil.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/util/EmsNodeUtil.java index d389d821..e9812dd0 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/util/EmsNodeUtil.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/util/EmsNodeUtil.java @@ -10,35 +10,27 @@ import java.sql.Timestamp; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; -import java.util.Calendar; -import java.util.TimeZone; +import java.util.*; +import com.google.gson.*; +import com.google.gson.reflect.TypeToken; import gov.nasa.jpl.view_repo.db.*; +import org.alfresco.repo.service.ServiceDescriptorRegistry; +import org.alfresco.service.ServiceRegistry; +import org.alfresco.service.cmr.module.ModuleDependency; +import org.alfresco.service.cmr.module.ModuleDetails; +import org.alfresco.service.cmr.module.ModuleService; +import org.alfresco.service.namespace.NamespaceService; +import org.alfresco.service.namespace.QName; import org.alfresco.util.TempFileProvider; import org.apache.commons.codec.digest.DigestUtils; import org.apache.log4j.Logger; -import com.google.gson.JsonObject; -import com.google.gson.JsonPrimitive; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonNull; import gov.nasa.jpl.mbee.util.Pair; import gov.nasa.jpl.mbee.util.TimeUtils; import gov.nasa.jpl.view_repo.db.GraphInterface.DbEdgeTypes; import gov.nasa.jpl.view_repo.db.GraphInterface.DbNodeTypes; -import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class EmsNodeUtil { @@ -52,7 +44,7 @@ public class EmsNodeUtil { private static final String ORG_ID = "orgId"; private static final String ORG_NAME = "orgName"; - private SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + public static SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); public EmsNodeUtil() { try { @@ -97,7 +89,7 @@ public JsonArray getOrganization(String orgId) { List> organizations = pgh.getOrganizations(orgId); for (Map n : organizations) { try { - JsonObject current = eh.getElementByElasticId(n.get(ORG_ID), EmsConfig.get("elastic.index.element")); + JsonObject current = eh.getByElasticId(n.get(ORG_ID), EmsConfig.get("elastic.index.element"), ElasticHelper.ELEMENT); if (current != null) { orgs.add(current); } else { @@ -205,18 +197,9 @@ public JsonArray getFullMounts(List found) { return mounts; } - public JsonObject getElementByElementAndCommitId(String commitId, String sysmlid) { + public JsonObject getByCommitId(String sysmlid, String commitId, String type) { try { - return eh.getElementByCommitId(commitId, sysmlid, projectId); - } catch (IOException e) { - logger.error(String.format("%s", LogUtil.getStackTrace(e))); - } - return new JsonObject(); - } - - public JsonObject getArtifactByArtifactAndCommitId(String commitId, String sysmlid) { - try { - return eh.getArtifactByCommitId(commitId, sysmlid, projectId); + return eh.getByCommitId(commitId, sysmlid, projectId, type.contains("element") ? ElasticHelper.ELEMENT : ElasticHelper.ARTIFACT); } catch (IOException e) { logger.error(String.format("%s", LogUtil.getStackTrace(e))); } @@ -247,7 +230,7 @@ private JsonObject getNodeBySysmlid(String sysmlid, String workspaceName, boolea String elasticId = pgh.getElasticIdFromSysmlId(sysmlid); if (elasticId != null) { try { - JsonObject result = eh.getElementByElasticId(elasticId, projectId); + JsonObject result = eh.getByElasticId(elasticId, projectId, ElasticHelper.ELEMENT); if (result != null) { result.addProperty(Sjm.PROJECTID, this.projectId); result.addProperty(Sjm.REFID, this.workspaceName); @@ -269,9 +252,9 @@ public JsonArray getNodesBySysmlids(Set sysmlids, boolean withChildViews return getJsonByElasticIds(elasticids, withChildViews); } - public JsonArray getArtifactsBySysmlids(Set sysmlids, boolean withChildViews, boolean withDeleted) { + public JsonArray getArtifactsBySysmlids(Set sysmlids, boolean withDeleted) { List elasticIds = pgh.getElasticIdsFromSysmlIdsArtifacts(new ArrayList<>(sysmlids), withDeleted); - return getJsonByElasticIds(elasticIds, withChildViews); + return getJsonByElasticIds(elasticIds, false); } public JsonArray getJsonByElasticIds(List elasticIds, boolean withChildViews) { @@ -310,7 +293,7 @@ public JsonArray getRefHistory(String refId, String commitId, int limit) { JsonArray result = new JsonArray(); int cId = pgh.getCommitId(commitId); List> refCommits = pgh.getRefsCommits(refId, cId, limit); - if (refCommits.size() > 0) { + if (!refCommits.isEmpty()) { result = processCommits(refCommits); } @@ -319,13 +302,13 @@ public JsonArray getRefHistory(String refId, String commitId, int limit) { private JsonArray filterCommitsByRefs(JsonArray commits) { JsonArray filtered = new JsonArray(); - JsonArray refHistory = getRefHistory(this.workspaceName); - List commitList = new ArrayList<>(); - for (int i = 0; i < refHistory.size(); i++) { - commitList.add(refHistory.get(i).getAsJsonObject().get(Sjm.SYSMLID).getAsString()); + List> refCommits = pgh.getRefsCommits(this.workspaceName, 0, 0); + Set commitSet = new HashSet<>(); + for (Map commit : refCommits) { + commitSet.add((String) commit.get(Sjm.SYSMLID)); } for (int i = 0; i < commits.size(); i++) { - if (commitList.contains(commits.get(i).getAsJsonObject().get(Sjm.SYSMLID).getAsString())) { + if (commitSet.contains(commits.get(i).getAsJsonObject().get(Sjm.SYSMLID).getAsString())) { filtered.add(commits.get(i).getAsJsonObject()); } } @@ -346,7 +329,7 @@ public JsonObject getRefJson(String refId) { Map refInfo = pgh.getRefElastic(refId); if (refInfo != null) { try { - jObj = eh.getElementByElasticId(refInfo.get("elasticId"), projectId); + jObj = eh.getByElasticId(refInfo.get("elasticId"), projectId, ElasticHelper.REF); jObj.addProperty("parentRefId", (refInfo.get("parent").equals("")) ? "noParent" : refInfo.get("parent")); jObj.addProperty("type", (refInfo.get("isTag").equals("true")) ? "tag" : "branch"); @@ -394,19 +377,6 @@ public JsonArray getChildrenIds(String sysmlid, DbEdgeTypes dbEdge, final Long m return children; } - public JsonObject getArtifactById(String sysmlid, boolean withDeleted) { - String artifact = pgh.getElasticIdFromSysmlIdArtifact(sysmlid, withDeleted); - if (artifact != null) { - try { - return eh.getElementByElasticIdArtifact(artifact, projectId); - } catch (IOException e) { - e.printStackTrace(); - } - } - return new JsonObject(); - } - - public JsonArray getChildren(String sysmlid, DbEdgeTypes dbEdge, final Long maxDepth) { Set children = new HashSet<>(); @@ -586,7 +556,7 @@ public JsonObject processPostJson(JsonArray elements, String user, Set o Map existingMap = (!type.equals("Artifact")) ? convertToMap(getNodesBySysmlids(sysmlids, false, true)) : - convertToMap(getArtifactsBySysmlids(sysmlids, false, true)); + convertToMap(getArtifactsBySysmlids(sysmlids, true)); for (int i = 0; i < elements.size(); i++) { JsonObject o = elements.get(i).getAsJsonObject(); @@ -835,7 +805,7 @@ private void reorderChildViews(JsonObject element, JsonArray newElements, JsonAr getProjectWithFullMounts(JsonUtil.getOptString(ownedAttribute, Sjm.PROJECTID), JsonUtil.getOptString(ownedAttribute, Sjm.REFID), null); } - handleMountSearch(mountJson, false, false, 0L, childViewsSet, childViews); + handleMountSearch(mountJson, false, false, 0L, childViewsSet, childViews, null, Sjm.ELEMENTS); } catch (Exception e) { logger.warn(String.format("%s", LogUtil.getStackTrace(e))); } @@ -1254,8 +1224,111 @@ private Map getQualifiedInformationForElement(JsonObject element return result; } - public boolean isDeleted(String sysmlid) { - return pgh.isDeleted(sysmlid); + public JsonObject processMove(JsonArray moveData) { + Map elements = new HashMap<>(); + Set keys = new HashSet<>(); + Map> toRemove = new HashMap<>(); + Map updateOwner = new HashMap<>(); + Map> toAdd = new HashMap<>(); + HashSet dbnt = new HashSet<>(); + JsonObject wrapper = new JsonObject(); + dbnt.add(DbNodeTypes.PACKAGE); + for (int i = 0; i < moveData.size(); i++) { + String srcId = JsonUtil.getOptString(moveData.get(i).getAsJsonObject(), "from"); + String destId = JsonUtil.getOptString(moveData.get(i).getAsJsonObject(), "to"); + String id = JsonUtil.getOptString(moveData.get(i).getAsJsonObject(), Sjm.SYSMLID); + if (toAdd.containsKey(destId)) { + toAdd.get(destId) + .put(Integer.parseInt(JsonUtil.getOptString(moveData.get(i).getAsJsonObject(), "index")), id); + } else { + Map indexed = new TreeMap<>(); + indexed.put(Integer.parseInt(JsonUtil.getOptString(moveData.get(i).getAsJsonObject(), "index")), id); + toAdd.put(destId, indexed); + } + if (toRemove.containsKey(srcId)) { + toRemove.get(srcId).add(id); + } else { + List indexed = new ArrayList<>(); + indexed.add(id); + toRemove.put(srcId, indexed); + } + if (!srcId.equals(destId)) { + keys.add(id); + updateOwner.put(id, destId); + } + keys.add(srcId); + keys.add(destId); + } + JsonArray modified = getNodesBySysmlids(keys, false, false); + for (int i = 0; i < modified.size(); i++) { + String sysmlid = JsonUtil.getOptString(modified.get(i).getAsJsonObject(), Sjm.SYSMLID); + elements.put(sysmlid, modified.get(i).getAsJsonObject()); + } + for (Map.Entry entry : updateOwner.entrySet()) { + String value = entry.getValue(); + String key = entry.getKey(); + if (elements.containsKey(key) && elements.get(key).has(Sjm.ASSOCIATIONID)) { + String associationId = elements.get(key).get(Sjm.ASSOCIATIONID).getAsString(); + String ownerParentPackage = pgh.getImmediateParentOfType(value, DbEdgeTypes.CONTAINMENT, dbnt); + JsonObject associationObj = getNodeBySysmlid(associationId); + associationObj.addProperty(Sjm.OWNERID, ownerParentPackage); + elements.put(associationObj.get(Sjm.SYSMLID).getAsString(), associationObj); + //referenced element's typeId to be b2 + if (associationObj.has(Sjm.OWNEDENDIDS) + && associationObj.get(Sjm.OWNEDENDIDS).getAsJsonArray().size() > 0) { + JsonArray ownedEndIds = associationObj.get(Sjm.OWNEDENDIDS).getAsJsonArray(); + for (int i = 0; i < ownedEndIds.size(); i++) { + if (ownedEndIds.get(i).getAsString().equals(key)) { + continue; + } + JsonObject prop = getNodeBySysmlid(ownedEndIds.get(i).getAsString()); + prop.addProperty(Sjm.TYPEID, value); + elements.put(prop.get(Sjm.SYSMLID).getAsString(), prop); + } + } + } + elements.get(key).getAsJsonObject().addProperty(Sjm.OWNERID, value); + } + for (Map.Entry> entry : toRemove.entrySet()) { + List value = entry.getValue(); + String key = entry.getKey(); + JsonArray ownedAttributeIdsToRemove = JsonUtil.getOptArray(elements.get(key), Sjm.OWNEDATTRIBUTEIDS); + JsonArray removed = new JsonArray(); + + for (int i = 0; i < ownedAttributeIdsToRemove.size(); i++) { + if (!value.contains(ownedAttributeIdsToRemove.get(i).getAsString())) { + removed.add(ownedAttributeIdsToRemove.get(i)); + } + } + elements.get(key).add(Sjm.OWNEDATTRIBUTEIDS, removed); + } + for (Map.Entry> entry : toAdd.entrySet()) { + Map value = entry.getValue(); + String key = entry.getKey(); + List ownedAttributeIdsToAdd = new Gson() + .fromJson(JsonUtil.getOptArray(elements.get(key), Sjm.OWNEDATTRIBUTEIDS), + new TypeToken>() { + }.getType()); + + for (Map.Entry add : value.entrySet()) { + Integer index = add.getKey(); + String id = add.getValue(); + // Set requires a jsonObject... + if (index >= ownedAttributeIdsToAdd.size()) { + ownedAttributeIdsToAdd.add(id); + } else { + ownedAttributeIdsToAdd.add(index, id); + } + } + elements.get(key).add(Sjm.OWNEDATTRIBUTEIDS, new Gson().toJsonTree(ownedAttributeIdsToAdd)); + } + JsonArray toProcess = new JsonArray(); + for (Map.Entry entry : elements.entrySet()) { + toProcess.add(entry.getValue()); + + } + wrapper.add(Sjm.ELEMENTS, toProcess); + return wrapper; } public boolean orgExists(String orgName) { @@ -1365,13 +1438,7 @@ private JsonObject addExtendedInformationForElement(JsonObject element, } public static void handleMountSearch(JsonObject mountsJson, boolean extended, boolean extraDocs, - final Long maxDepth, Set elementsToFind, JsonArray result) throws IOException { - - handleMountSearch(mountsJson, extended, extraDocs, maxDepth, elementsToFind, result, null, null); - } - - public static void handleMountSearch(JsonObject mountsJson, boolean extended, boolean extraDocs, - final Long maxDepth, Set elementsToFind, JsonArray result, String timestamp, String type) + Long maxDepth, Set elementsToFind, JsonArray result, String timestamp, String type) throws IOException { if (elementsToFind.isEmpty() || mountsJson == null) { return; @@ -1386,8 +1453,8 @@ public static void handleMountSearch(JsonObject mountsJson, boolean extended, bo extended = false; extraDocs = false; - if (type != null && type.contains("artifacts")) { - nodeList = emsNodeUtil.getArtifactsBySysmlids(elementsToFind, false, true); + if (type != null && type.equals(Sjm.ARTIFACTS)) { + nodeList = emsNodeUtil.getArtifactsBySysmlids(elementsToFind, true); } else { nodeList = emsNodeUtil.getNodesBySysmlids(elementsToFind, false, true); } @@ -1407,8 +1474,10 @@ public static void handleMountSearch(JsonObject mountsJson, boolean extended, bo } } } else { - if (type != null && type.contains("artifacts")) { - nodeList = emsNodeUtil.getArtifactsBySysmlids(elementsToFind, false, false); + if (type != null && type.equals(Sjm.ARTIFACTS)) { + extended = false; + maxDepth = 0L; + nodeList = emsNodeUtil.getArtifactsBySysmlids(elementsToFind, false); } else { nodeList = emsNodeUtil.getNodesBySysmlids(elementsToFind, true, false); } @@ -1458,7 +1527,7 @@ public List getSites(boolean sites, boolean sitepackages) { public JsonObject getCommitObject(String commitId) { try { - return eh.getCommitByElasticId(commitId, projectId); + return eh.getByElasticId(commitId, projectId, ElasticHelper.COMMIT); } catch (IOException e) { logger.debug(String.format("%s", LogUtil.getStackTrace(e))); } @@ -1482,9 +1551,9 @@ public void insertProjectIndex(String projectId) { } } - public String insertSingleElastic(JsonObject o) { + public String insertSingleElastic(JsonObject o, String type) { try { - ElasticResult r = eh.indexElement(o, projectId, ElasticHelper.ELEMENT); + ElasticResult r = eh.indexElement(o, projectId, type); return r.elasticId; } catch (IOException e) { logger.debug(String.format("%s", LogUtil.getStackTrace(e))); @@ -1492,6 +1561,18 @@ public String insertSingleElastic(JsonObject o) { return null; } + public String updateSingleElastic(JsonObject o, String type) { + try { + if (o.has(Sjm.ELASTICID)) { + JsonObject r = eh.updateById(o.get(Sjm.ELASTICID).getAsString(), o, projectId, type); + return r.has(Sjm.ELASTICID) ? r.get(Sjm.ELASTICID).getAsString() : null; + } + } catch (IOException e) { + logger.debug(String.format("%s", LogUtil.getStackTrace(e))); + } + return null; + } + private static Map getSysmlMap(JsonArray elements) { Map sysmlid2elements = new HashMap<>(); for (int i = 0; i < elements.size(); i++) { @@ -1763,16 +1844,16 @@ public JsonObject getElementAtCommit(String sysmlId, String commitId) { pastElement = getElementAtCommit(sysmlId, commitId, refsCommitsIds); - if (pastElement != null && pastElement.has(Sjm.SYSMLID) && deletedElementIds + if (pastElement != null && pastElement.has(Sjm.ELASTICID) && deletedElementIds .containsKey(pastElement.get(Sjm.ELASTICID).getAsString())) { - pastElement = new JsonObject(); + pastElement = null; } } - return pastElement == null ? new JsonObject() : pastElement; + return pastElement; } public JsonObject getElementAtCommit(String sysmlId, String commitId, List refIds) { - JsonObject result = new JsonObject(); + JsonObject result = null; try { // Get commit object and retrieve the refs commits @@ -1797,6 +1878,7 @@ public JsonArray getNearestCommitFromTimestamp(String refId, String timestamp, i Date requestedTime; List> commits; JsonArray response = new JsonArray(); + try { requestedTime = df.parse(timestamp); Timestamp time = new Timestamp(requestedTime.getTime()); @@ -1861,10 +1943,6 @@ public static String md5Hash(String str) { return DigestUtils.md5Hex(str); } - public JsonObject getProfile(String id) throws IOException { - return eh.getProfileByElasticId(id, "mms"); - } - public static String md5Hash(File file) { String digest = null; try (FileInputStream fin = new FileInputStream(file)) { @@ -1899,4 +1977,111 @@ public static Path saveToFilesystem(String filename, InputStream content) throws throw new Throwable("Failed to save file to filesystem. " + ex.getMessage()); } } + + public static String getHostname() { + ServiceDescriptorRegistry sdr = new ServiceDescriptorRegistry(); + String hostname = "localhost"; + try { + hostname = sdr.getSysAdminParams().getAlfrescoHost(); + } catch (Exception e) { + if (logger.isDebugEnabled()) { + logger.debug(e.getLocalizedMessage()); + } + } + return hostname; + } + + /** + * getModuleService Retrieves the ModuleService of the ServiceRegistry passed in + * + * @param services ServiceRegistry object that contains the desired ModuleService + * @return ModuleService + */ + public static ModuleService getModuleService(ServiceRegistry services) { + if (services == null) { + return null; + } + // Takes the ServiceRegistry and calls the ModuleService super method + // getService(Creates an Alfresco QName using the namespace + // service and passes in the default URI + return (ModuleService) services.getService(QName.createQName(NamespaceService.ALFRESCO_URI, "ModuleService")); + } + + /** + * getServiceModules + * + * Returns a JSONArray of Module Details from the Service Modules + * + * @param service the service containing modules to be returned + * @return JSONArray of ModuleDetails within the ModuleService object + */ + public static JsonArray getServiceModulesJson(ModuleService service) { + + JsonArray jsonArray = new JsonArray(); + List modules = service.getAllModules(); + for (ModuleDetails detail : modules) { + JsonObject jsonModule = moduleDetailsToJson(detail); + jsonArray.add(jsonModule); + } + return jsonArray; + } + + /** + * moduleDetailsToJson + * + * Takes a module of type ModuleDetails and retrieves all off the module's members and puts them + * into a newly instantiated JSONObject. + * + * JSONObject will have the details : title, version, aliases, class, dependencies, editions id + * and properties + * + * @param module A single module of type ModuleDetails + * @return JSONObject which contains all the details of that module + */ + public static JsonObject moduleDetailsToJson(ModuleDetails module) { + JsonObject jsonModule = new JsonObject(); + jsonModule.addProperty("mmsTitle", module.getTitle()); + jsonModule.addProperty("mmsVersion", module.getModuleVersionNumber().toString()); + JsonUtil.addStringList(jsonModule, "mmsAliases", module.getAliases()); + jsonModule.addProperty("mmsClass", module.getClass().toString()); + JsonArray depArray = new JsonArray(); + for (ModuleDependency depend : module.getDependencies()) + depArray.add(depend.toString()); + jsonModule.add("mmsDependencies", depArray); + JsonUtil.addStringList(jsonModule, "mmsEditions", module.getEditions()); + jsonModule.addProperty("mmsId", module.getId()); + JsonObject propObj = new JsonObject(); + Enumeration enumerator = module.getProperties().propertyNames(); + while (enumerator.hasMoreElements()) { + String key = (String) enumerator.nextElement(); + propObj.addProperty(key, module.getProperties().getProperty(key)); + } + jsonModule.add("mmsProperties", propObj); + return jsonModule; + } + + /** + * getMMSversion + * + * Gets the version number of a module, returns a JSONObject which calls on getString with + * 'version' as an argument. This will return a String representing the version of the + * mms. + * + * @return Version number of the MMS as type String + */ + public static String getMMSversion(ServiceRegistry services) { + ModuleService service = getModuleService(services); + JsonArray moduleDetails = getServiceModulesJson(service); + String mmsVersion = "NA"; + for (int i = 0; i < moduleDetails.size(); i++) { + JsonObject o = moduleDetails.get(i).getAsJsonObject(); + if (o.get("mmsId").getAsString().equalsIgnoreCase("mms-amp")) { + mmsVersion = o.get("mmsVersion").getAsString(); + } + } + + // Remove appended tags from version + int endIndex = mmsVersion.indexOf('-'); + return endIndex > -1 ? mmsVersion.substring(0, endIndex) : mmsVersion; + } } diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/util/EmsScriptNode.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/util/EmsScriptNode.java index 608a2288..5a41ddaa 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/util/EmsScriptNode.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/util/EmsScriptNode.java @@ -26,20 +26,31 @@ package gov.nasa.jpl.view_repo.util; +import java.io.File; import java.io.Serializable; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; import java.util.Date; import java.util.HashMap; +import java.util.List; import java.util.Map; +import java.util.Set; import javax.servlet.http.HttpServletResponse; import org.alfresco.model.ContentModel; import org.alfresco.repo.jscript.ScriptNode; import org.alfresco.repo.jscript.ScriptVersion; +import org.alfresco.repo.model.Repository; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.service.ServiceRegistry; import org.alfresco.service.cmr.repository.ChildAssociationRef; +import org.alfresco.service.cmr.repository.ContentData; +import org.alfresco.service.cmr.repository.ContentWriter; import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.security.AuthorityService; +import org.alfresco.service.cmr.security.AuthorityType; import org.alfresco.service.cmr.security.PermissionService; import org.alfresco.service.cmr.site.SiteInfo; import org.alfresco.service.cmr.version.Version; @@ -48,6 +59,7 @@ import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; import org.apache.log4j.Logger; +import org.apache.tika.Tika; import org.springframework.extensions.webscripts.Status; import gov.nasa.jpl.view_repo.webscripts.AbstractJavaWebScript; @@ -64,67 +76,23 @@ public class EmsScriptNode extends ScriptNode { static Logger logger = Logger.getLogger(ScriptNode.class); - public boolean renamed = false; + public static Repository repository = null; + public static ServiceRegistry services = null; - // provide logging capability of what is done - private StringBuffer response = null; - - // provide status as necessary - private Status status = null; - - /** - * whether to use the foundational Alfresco Java API or ScriptNode class that uses the - * JavaScript API - */ - public boolean useFoundationalApi = true; // TODO this will be removed - - protected EmsScriptNode workspace = null; - - /** - * Replicates the behavior of ScriptNode versions, which is private. - */ - protected Object[] myVersions = null; - - public AbstractJavaWebScript webscript = null; - - // TODO add nodeService and other member variables when no longer - // subclassing ScriptNode - // extend Serializable after removing ScriptNode extension - - public EmsScriptNode(NodeRef nodeRef, ServiceRegistry services, StringBuffer response, Status status) { - this(nodeRef, services); - setStatus(status); + public EmsScriptNode(NodeRef nodeRef, ServiceRegistry services) { + super(nodeRef, services); } - public EmsScriptNode(NodeRef nodeRef, ServiceRegistry services, StringBuffer response) { - this(nodeRef, services); - setResponse(response); + public static Repository getRepository() { + return repository; } - /** - * Create a version of this document. Note: this will add the cm:versionable aspect. - * - * @param history Version history note - * @param majorVersion True to save as a major version increment, false for minor version. - * @return ScriptVersion object representing the newly added version node - */ - @Override public ScriptVersion createVersion(String history, boolean majorVersion) { - this.myVersions = null; - return super.createVersion(history, majorVersion); + public static void setRepository(Repository repositoryHelper) { + EmsScriptNode.repository = repositoryHelper; } - /** - * Check-in a working copy document. The current state of the working copy is copied to the - * original node, this will include any content updated in the working node. Note that this - * method can only be called on a working copy Node. - * - * @param history Version history note - * @param majorVersion True to save as a major version increment, false for minor version. - * @return the original Node that was checked out. - */ - @Override public ScriptNode checkin(String history, boolean majorVersion) { - this.myVersions = null; - return super.checkin(history, majorVersion); + public static void setServices(ServiceRegistry services) { + EmsScriptNode.services = services; } /** @@ -146,68 +114,21 @@ public EmsScriptNode(NodeRef nodeRef, ServiceRegistry services, StringBuffer res if (child == null || !child.exists()) { return null; } - EmsScriptNode childNode = new EmsScriptNode(child.getNodeRef(), services, response); + EmsScriptNode childNode = new EmsScriptNode(child.getNodeRef(), services); return childNode; } @Override public EmsScriptNode createFile(String name) { - EmsScriptNode fileNode = new EmsScriptNode(super.createFile(name).getNodeRef(), services, response, status); + EmsScriptNode fileNode = new EmsScriptNode(super.createFile(name).getNodeRef(), services); return fileNode; } - public EmsScriptNode createFolder(String name, String type, NodeRef sourceFolder) { - if (logger.isInfoEnabled()) { - logger.info("creating " + name + " in " + sourceFolder); - } - + public EmsScriptNode createFolder(String name, String type) { NodeRef folderRef = super.createFolder(name, type).getNodeRef(); - EmsScriptNode folder = new EmsScriptNode(folderRef, services, response, status); - + EmsScriptNode folder = new EmsScriptNode(folderRef, services); return folder; } - /** - * Check whether or not a node has a property, update or create as necessary - * - * NOTE: this only works for non-collection properties - for collections handwrite (or see how - * it's done in ModelPost.java) - * - * @param acmType Short name for the Alfresco Content Model type - * @param value Value to set property to - * @return true if property updated, false otherwise (e.g., value did not change) - */ - public boolean createOrUpdateProperty(String acmType, T value) { - - T oldValue = (T) getNodeRefProperty(acmType); - if (oldValue != null && value != null) { - if (!value.equals(oldValue)) { - setProperty(acmType, value); - log(getName() + ": " + acmType + " property updated to value = " + value); - return true; - } - } - // Note: Per CMED-461, we are allowing properties to be set to null - else { - log(getName() + ": " + acmType + " property created with value = " + value); - boolean changed = setProperty(acmType, value); - // If setting the property to null, the modified time is not changed - // by alfresco if - // it was previously null, which is the initial state of the - // property, but we want - // the modification time to be altered in this case too: - if (oldValue == null && value == null) { - setProperty("cm:modified", new Date(), false, 0); - } - if (!changed) { - logger.warn( - "Failed to set property for new value in createOrUpdateProperty(" + acmType + ", " + value + ")"); - } - return changed; - } - - return false; - } - /** * Override createNode to return an EmsScriptNode * @@ -216,62 +137,33 @@ public boolean createOrUpdateProperty(String acmType, T * @return created child EmsScriptNode */ @Override public EmsScriptNode createNode(String name, String type) { - - EmsScriptNode result = null; - if (!useFoundationalApi) { - ScriptNode scriptNode = super.createNode(name, type); - result = new EmsScriptNode(scriptNode.getNodeRef(), services, response); - } else { - Map props = new HashMap<>(1, 1.0f); - props.put(ContentModel.PROP_NAME, name); - - QName typeQName = createQName(type); - if (typeQName != null) { - try { - ChildAssociationRef assoc = services.getNodeService() - .createNode(nodeRef, ContentModel.ASSOC_CONTAINS, - QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, QName.createValidLocalName(name)), - createQName(type), props); - result = new EmsScriptNode(assoc.getChildRef(), services, response); - } catch (Exception e) { - logger.error( - "Got exception in " + "createNode(name=" + name + ", type=" + type + ") for EmsScriptNode(" - + this + ") calling createNode(nodeRef=" + nodeRef + ", . . .)"); - e.printStackTrace(); - } + Map props = new HashMap<>(1, 1.0f); + props.put(ContentModel.PROP_NAME, name); - } else { - log("Could not find type " + type); + QName typeQName = createQName(type); + if (typeQName != null) { + try { + ChildAssociationRef assoc = services.getNodeService().createNode(nodeRef, ContentModel.ASSOC_CONTAINS, + QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, QName.createValidLocalName(name)), + createQName(type), props); + result = new EmsScriptNode(assoc.getChildRef(), services); + } catch (Exception e) { + logger.error( + "Got exception in " + "createNode(name=" + name + ", type=" + type + ") for EmsScriptNode(" + this + + ") calling createNode(nodeRef=" + nodeRef + ", . . .)"); + e.printStackTrace(); } } - return result; } - @Override public String getName() { - super.getName(); - return (String) getProperty(Acm.CM_NAME); - } - @Override public EmsScriptNode getParent() { ScriptNode myParent = super.getParent(); if (myParent == null) return null; - return new EmsScriptNode(myParent.getNodeRef(), services, response); - } - - /** - * Getting a noderef property needs to be contextualized by the workspace and time This works - * for any property type noderef or otherwise, so use this if you want to be safe. - * - * @param acmType - * @return - */ - public Object getNodeRefProperty(String acmType) { - Object result = getPropertyImpl(acmType, true); - return result; + return new EmsScriptNode(myParent.getNodeRef(), services); } /** @@ -282,59 +174,35 @@ public Object getNodeRefProperty(String acmType) { * @return */ public Object getProperty(String acmType) { - return getProperty(acmType, true); - } + NodeRef nodeRef = this.getNodeRef(); + if (nodeRef == null || acmType == null) { + return null; + } - /** - * Get the property of the specified type for non-noderef properties. Throws unsupported - * operation exception otherwise (go and fix the code if that happens). - * - * @param acmType Short name of property to get - * @param cacheOkay - * @return - */ - public Object getProperty(String acmType, boolean cacheOkay) { - Object result = getPropertyImpl(acmType, cacheOkay); + if (acmType.isEmpty()) { + return null; + } + QName qName = createQName(acmType, services); + Object result; + if (services == null) { + services = getServices(); + } + result = services.getNodeService().getProperty(nodeRef, qName); return result; } - private Object getPropertyImpl(String acmType, boolean cacheOkay) { - return NodeUtil.getNodeProperty(this, acmType, getServices(), useFoundationalApi, cacheOkay); - } - /** * Get the properties of this node * * @return */ @Override public Map getProperties() { - - if (useFoundationalApi) { - Map result = new HashMap<>(); - Map map = services.getNodeService().getProperties(nodeRef); - for (Map.Entry entry: map.entrySet()) { - result.put(entry.getKey().toString(), entry.getValue()); - } - return result; - } else { - return super.getProperties(); + Map result = new HashMap<>(); + Map map = services.getNodeService().getProperties(nodeRef); + for (Map.Entry entry : map.entrySet()) { + result.put(entry.getKey().toString(), entry.getValue()); } - } - - public StringBuffer getResponse() { - return response; - } - - public Status getStatus() { - return status; - } - - /** - * Append onto the response for logging purposes - * - * @param msg Message to be appened to response TODO: fix logger for EmsScriptNode - */ - public void log(String msg) { + return result; } /** @@ -344,38 +212,18 @@ public void log(String msg) { * @param value Value to set property to */ public boolean setProperty(String acmType, T value) { - return setProperty(acmType, value, true, 0); - } - - public boolean setProperty(String acmType, T value, boolean cacheOkay, - // count prevents inf - // loop - int count) { if (logger.isDebugEnabled()) logger.debug("setProperty(acmType=" + acmType + ", value=" + value + ")"); boolean success = true; - if (useFoundationalApi) { - try { - services.getNodeService().setProperty(nodeRef, createQName(acmType), value); - } catch (Exception e) { - // This should never happen! - success = false; - } - } else { - getProperties().put(acmType, value); - save(); + try { + services.getNodeService().setProperty(nodeRef, createQName(acmType), value); + } catch (Exception e) { + // This should never happen! + success = false; } return success; } - public void setResponse(StringBuffer response) { - this.response = response; - } - - public void setStatus(Status status) { - this.status = status; - } - /** * Checks whether user has permissions to the node and logs results and status as appropriate * @@ -452,95 +300,11 @@ public boolean checkPermissions(String permissions, StringBuffer response, Statu } return b; } - - /** - * Override equals for EmsScriptNodes - * - * @see java.lang.Object#equals(java.lang.Object) - */ - @Override public boolean equals(Object obj) { - return equals(obj, true); - } - - @Override public int hashCode() { - return parent.hashCode(); - } - - /** - * @return the head or current version of the node ref if it exists; otherwise return the - * existing node ref - */ - public NodeRef normalizedNodeRef() { - VersionService vs = getServices().getVersionService(); - Version thisHeadVersion = this.getHeadVersion(); - NodeRef thisCurrent = thisHeadVersion == null ? null : thisHeadVersion.getVersionedNodeRef(); - if (thisCurrent == null) { - Version thisCurrentVersion = vs.getCurrentVersion(this.nodeRef); - thisCurrent = thisCurrentVersion == null ? null : thisCurrentVersion.getVersionedNodeRef(); - } - if (thisCurrent == null) - return nodeRef; - return thisCurrent; - } - - /** - * Check to see if the nodes are the same or (if tryCurrentVersions is true) if their - * currentVersions are the same. - * - * @param obj - * @param tryCurrentVersions - * @return true iff equal - */ - public boolean equals(Object obj, boolean tryCurrentVersions) { - - if (!(obj instanceof EmsScriptNode)) - return false; - EmsScriptNode that = (EmsScriptNode) obj; - boolean same = this.nodeRef.equals(that.nodeRef); - if (same || !tryCurrentVersions) - return same; - - // See if they are different versions of the same node. - VersionService vs = getServices().getVersionService(); - boolean isThisV = vs.isAVersion(this.nodeRef); - boolean isThatV = vs.isAVersion(that.nodeRef); - if (!isThisV && !isThatV) - return same; - NodeRef thisCurrent = this.normalizedNodeRef(); - NodeRef thatCurrent = that.normalizedNodeRef(); - if (thisCurrent == thatCurrent) - return true; - if (thisCurrent == null || thatCurrent == null) - return false; - return thisCurrent.equals(thatCurrent); - } - - /** - * Override exists for EmsScriptNodes - * - * @see org.alfresco.repo.jscript.ScriptNode#exists() - */ - @Override public boolean exists() { - return exists(false); - } - - public boolean exists(boolean includeDeleted) { - if (!scriptNodeExists()) - return false; - return !(!includeDeleted && hasAspect("ems:Deleted")); - } - - public boolean scriptNodeExists() { - return super.exists(); - } - - public ServiceRegistry getServices() { + + public static ServiceRegistry getServices() { return services; } - public EmsScriptNode(NodeRef nodeRef, ServiceRegistry services) { - super(nodeRef, services); - } /************************** * Miscellaneous functions @@ -557,13 +321,6 @@ public Version getHeadVersion() { return headVersion; } - @Override public boolean removeAspect(String type) { - if (hasAspect(type)) { - return super.removeAspect(type); - } - return true; - } - public static EmsScriptNode getSiteNode(String sysmlid) { if (sysmlid == null) { return null; @@ -573,10 +330,9 @@ public static EmsScriptNode getSiteNode(String sysmlid) { if (changeUser) { AuthenticationUtil.setRunAsUser(ADMIN_USER_NAME); } - ServiceRegistry services = NodeUtil.getServiceRegistry(); SiteInfo si = services.getSiteService().getSite(sysmlid); if (si != null) { - EmsScriptNode site = new EmsScriptNode(si.getNodeRef(), services, null); + EmsScriptNode site = new EmsScriptNode(si.getNodeRef(), services); if (changeUser) { AuthenticationUtil.setRunAsUser(runAsUser); } @@ -588,11 +344,128 @@ public static EmsScriptNode getSiteNode(String sysmlid) { return null; } - public void delete() { - if (!checkPermissions(PermissionService.WRITE, getResponse(), getStatus())) { - log("no write permissions to delete workpsace " + getName()); - return; + /** + * Returns a list of all the groups the passed user belongs to. Note, there is no java interface + * for this, so this code is based on what the javascript interface does. + * + * See: https://svn.alfresco.com/repos/alfresco-open-mirror/alfresco/HEAD/root + * /projects/repository/source/java/org/alfresco/repo/jscript/People.java + * + * @param user + * @return + */ + public static List getUserGroups(String user) { + + List authorityNames = new ArrayList<>(); + + AuthorityService aService = getServices().getAuthorityService(); + Set authorities = aService.getContainingAuthoritiesInZone(AuthorityType.GROUP, user, null, null, 1000); + for (String authority : authorities) { + NodeRef group = aService.getAuthorityNodeRef(authority); + if (group != null) { + authorityNames.add(authority); + } + } + + return authorityNames; + } + + /** + * Helper to create a QName from either a fully qualified or short-name QName string + *

+ * + * @param s Fully qualified or short-name QName string + * @param services ServiceRegistry for getting the service to resolve the name space + * @return QName + */ + public static QName createQName(String s, ServiceRegistry services) { + if (s == null) + return null; + QName qname; + if (s.contains("{")) { + qname = QName.createQName(s); + } else { + qname = QName.createQName(s, services.getNamespaceService()); + } + return qname; + } + + public static EmsScriptNode updateOrCreateArtifact(String artifactId, Path filePath, String fileType, String orgId, String projectId, String refId) { + + EmsScriptNode artifactNode; + String finalType = null; + Tika tika = new Tika(); + File content = filePath.toFile(); + + try { + finalType = tika.detect(content); + } catch (Exception e) { + if (logger.isDebugEnabled()) { + logger.debug("updateOrCreateArtifact: ", e); + } + } + + if (finalType == null) { + // Fallback if getting content type fails + if (fileType != null) { + finalType = fileType; + } else { + logger.error("Could not determine type of artifact: " + filePath.getFileName().toString()); + return null; + } + } + + EmsScriptNode targetSiteNode = EmsScriptNode.getSiteNode(orgId); + + // find site; it must exist! + if (targetSiteNode == null || !targetSiteNode.exists()) { + logger.error("Can't find node for site: " + orgId + "!"); + return null; + } + + // find or create subfolder + EmsScriptNode subfolder = targetSiteNode.childByNamePath("/" + projectId + "/refs/" + refId); + if (subfolder == null || !subfolder.exists()) { + return null; + } + + // find or create node: + artifactNode = subfolder.childByNamePath("/" + artifactId); + // Node wasnt found, so create one: + if (artifactNode == null) { + artifactNode = subfolder.createNode(artifactId, "cm:content"); + } + + if (artifactNode == null || !artifactNode.exists()) { + logger.error("Failed to create new PNG artifact " + artifactId + "!"); + return null; + } + + if (!artifactNode.hasAspect("cm:versionable")) { + artifactNode.addAspect("cm:versionable"); + } + if (!artifactNode.hasAspect("cm:indexControl")) { + artifactNode.addAspect("cm:indexControl"); } + + artifactNode.setProperty(Acm.CM_TITLE, artifactId); + artifactNode.setProperty("cm:isIndexed", true); + artifactNode.setProperty("cm:isContentIndexed", false); + + if (logger.isDebugEnabled()) { + logger.debug("Creating artifact with indexing: " + artifactNode.getProperty("cm:isIndexed")); + } + + ContentWriter writer = + services.getContentService().getWriter(artifactNode.getNodeRef(), ContentModel.PROP_CONTENT, true); + writer.putContent(content); + + ContentData contentData = writer.getContentData(); + contentData = ContentData.setMimetype(contentData, finalType); + contentData = ContentData.setEncoding(contentData, "UTF-8"); + services.getNodeService().setProperty(artifactNode.getNodeRef(), ContentModel.PROP_CONTENT, contentData); + + return artifactNode; } } diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/util/JsonUtil.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/util/JsonUtil.java index 6fbbf7c1..42b52cea 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/util/JsonUtil.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/util/JsonUtil.java @@ -27,16 +27,17 @@ */ public class JsonUtil { + private static JsonParser parser = new JsonParser(); + public static JsonObject buildFromString(String str) { if (str == null || str.isEmpty()) { return new JsonObject(); } - JsonParser parser = new JsonParser(); return parser.parse(str).getAsJsonObject(); } public static JsonElement buildFromStream(InputStream is) { - JsonElement result = new JsonParser().parse(new InputStreamReader(is)); + JsonElement result = parser.parse(new InputStreamReader(is)); return result != null ? result : new JsonObject(); } diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/util/NodeUtil.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/util/NodeUtil.java deleted file mode 100644 index a891e260..00000000 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/util/NodeUtil.java +++ /dev/null @@ -1,425 +0,0 @@ -package gov.nasa.jpl.view_repo.util; - -import java.io.File; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Enumeration; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.transaction.UserTransaction; - -import org.alfresco.model.ContentModel; -import org.alfresco.repo.jscript.ScriptNode; -import org.alfresco.repo.model.Repository; -import org.alfresco.repo.security.authentication.AuthenticationUtil; -import org.alfresco.service.ServiceRegistry; -import org.alfresco.service.cmr.module.ModuleDependency; -import org.alfresco.service.cmr.module.ModuleDetails; -import org.alfresco.service.cmr.module.ModuleService; -import org.alfresco.service.cmr.repository.ContentData; -import org.alfresco.service.cmr.repository.ContentWriter; -import org.alfresco.service.cmr.repository.NodeRef; -import org.alfresco.service.cmr.security.AuthorityService; -import org.alfresco.service.cmr.security.AuthorityType; -import org.alfresco.service.cmr.security.PersonService; -import org.alfresco.service.namespace.NamespaceService; -import org.alfresco.service.namespace.QName; -import org.apache.log4j.Logger; - -import com.google.gson.JsonObject; -import com.google.gson.JsonArray; - -public class NodeUtil { - - static Logger logger = Logger.getLogger(NodeUtil.class); - - /* static flags and constants */ - - protected static Map transactionMap = - Collections.synchronizedMap(new LinkedHashMap()); - - public static UserTransaction getTransaction() { - return transactionMap.get(Thread.currentThread().getId()); - } - - public static boolean skipSvgToPng = false; - - public static ServiceRegistry services = null; - public static Repository repository = null; - - public static Repository getRepository() { - return repository; - } - - public static void setRepository(Repository repositoryHelper) { - NodeUtil.repository = repositoryHelper; - } - - public static ServiceRegistry getServices() { - return getServiceRegistry(); - } - - public static void setServices(ServiceRegistry services) { - NodeUtil.services = services; - } - - public static ServiceRegistry getServiceRegistry() { - return services; - } - - /** - * Given a long-form QName, this method uses the namespace service to create a short-form QName - * string. - *

- * Copied from {@link ScriptNode#getShortQName(QName)}. - * - * @param longQName - * @return the short form of the QName string, e.g. "cm:content" - */ - public static String getShortQName(QName longQName) { - return longQName.toPrefixString(getServices().getNamespaceService()); - } - - /** - * Helper to create a QName from either a fully qualified or short-name QName string - *

- * - * @param s Fully qualified or short-name QName string - * @param services ServiceRegistry for getting the service to resolve the name space - * @return QName - */ - public static QName createQName(String s, ServiceRegistry services) { - if (s == null) - return null; - QName qname; - if (s.indexOf("{") != -1) { - qname = QName.createQName(s); - } else { - qname = QName.createQName(s, getServices().getNamespaceService()); - } - return qname; - } - - - public static EmsScriptNode getCompanyHome(ServiceRegistry services) { - EmsScriptNode companyHome = null; - if (services == null) - services = getServiceRegistry(); - if (services == null || services.getNodeLocatorService() == null) { - logger.error("getCompanyHome() failed, no services or no nodeLocatorService: " + services); - } - NodeRef companyHomeNodeRef = - services != null ? services.getNodeLocatorService().getNode("companyhome", null, null) : null; - if (companyHomeNodeRef != null) { - companyHome = new EmsScriptNode(companyHomeNodeRef, services); - } - return companyHome; - } - - public static Object getNodeProperty(ScriptNode node, Object o, ServiceRegistry services, - boolean useFoundationalApi, boolean cacheOkay) { - return getNodeProperty(node.getNodeRef(), o, services, useFoundationalApi, cacheOkay); - } - - /** - * Gets a specified property of a specified node. Don't use the cache (cacheOkay should be - * false) for alfresco-managed properties like "modified" and "modifier." Handling - * alfresco-managed properties here might require a string compare that may be expensive. Thus, - * it is the caller's responsibility to make sure the cache is not used for these. - * - * @param node - * @param key the name of the property, e.g., "cm:name" - * @param services - * @param cacheOkay whether to look in the cache and cache a new value, assuming the cache is - * turned on. - * @return - */ - public static Object getNodeProperty(NodeRef node, Object key, ServiceRegistry services, boolean useFoundationalApi, - boolean cacheOkay) { - if (node == null || key == null) - return null; - - boolean oIsString = key instanceof String; - String keyStr = oIsString ? (String) key : NodeUtil.getShortQName((QName) key); - if (keyStr.isEmpty()) { - if (logger.isTraceEnabled()) - logger - .trace("getNodeProperty(" + node + ", " + key + ", cacheOkay=" + cacheOkay + ") = null. No Key!"); - return null; - } - QName qName = oIsString ? NodeUtil.createQName(keyStr, services) : (QName) key; - Object result; - if (useFoundationalApi) { - if (services == null) - services = NodeUtil.getServices(); - result = services.getNodeService().getProperty(node, qName); - if (logger.isTraceEnabled()) - logger.trace("^ cache miss! getNodeProperty(" + node + ", " + key + ", cacheOkay=" + cacheOkay + ") = " - + result); - } else { - ScriptNode sNode = new ScriptNode(node, services); - result = sNode.getProperties().get(keyStr); - } - if (logger.isTraceEnabled()) - logger.trace("getNodeProperty(" + node + ", " + key + ", cacheOkay=" + cacheOkay + ") = " + result); - return result; - } - - public static boolean exists(EmsScriptNode node) { - return exists(node, false); - } - - public static boolean exists(EmsScriptNode node, boolean includeDeleted) { - if (node == null) - return false; - return node.exists(includeDeleted); - } - - public static boolean exists(NodeRef ref) { - return exists(ref, false); - } - - public static boolean exists(NodeRef ref, boolean includeDeleted) { - if (ref == null) - return false; - EmsScriptNode node = new EmsScriptNode(ref, getServices()); - return node.exists(includeDeleted); - } - - public static String getUserName() { - return AuthenticationUtil.getRunAsUser(); - } - - public static EmsScriptNode getUserHomeFolder(String userName, boolean createIfNotFound) { - NodeRef homeFolderNode; - EmsScriptNode homeFolderScriptNode = null; - PersonService personService = getServices().getPersonService(); - NodeRef personNode = personService.getPerson(userName); - homeFolderNode = (NodeRef) getNodeProperty(personNode, ContentModel.PROP_HOMEFOLDER, getServices(), true, true); - if (homeFolderNode == null || !exists(homeFolderNode)) { - EmsScriptNode homes = getCompanyHome(getServices()); - if (homes != null) { - homes = homes.childByNamePath("/User Homes"); - } - if (createIfNotFound && homes != null && homes.exists()) { - homeFolderScriptNode = homes.createFolder(userName, null, null); - } else { - logger.error("Error! No user homes folder!"); - } - } - if (!exists(homeFolderScriptNode) && exists(homeFolderNode)) { - homeFolderScriptNode = new EmsScriptNode(homeFolderNode, getServices()); - } - return homeFolderScriptNode; - } - - /** - * Returns a list of all the groups the passed user belongs to. Note, there is no java interface - * for this, so this code is based on what the javascript interface does. - * - * See: https://svn.alfresco.com/repos/alfresco-open-mirror/alfresco/HEAD/root - * /projects/repository/source/java/org/alfresco/repo/jscript/People.java - * - * @param user - * @return - */ - public static List getUserGroups(String user) { - - List authorityNames = new ArrayList<>(); - - AuthorityService aService = services.getAuthorityService(); - Set authorities = aService.getContainingAuthoritiesInZone(AuthorityType.GROUP, user, null, null, 1000); - for (String authority : authorities) { - NodeRef group = aService.getAuthorityNodeRef(authority); - if (group != null) { - authorityNames.add(authority); - } - } - - return authorityNames; - } - - public static EmsScriptNode updateOrCreateArtifact(String artifactId, Path filePath, String fileType, String orgId, String projectId, String refId) { - - EmsScriptNode artifactNode; - String finalType = null; - File content = filePath.toFile(); - - try { - finalType = Files.probeContentType(filePath); - } catch (Exception e) { - if (logger.isDebugEnabled()) { - logger.debug("updateOrCreateArtifact: ", e); - } - } - - if (finalType == null) { - // Fallback if getting content type fails - if (fileType != null) { - finalType = fileType; - } else { - logger.error("Could not determine type of artifact: " + filePath.getFileName().toString()); - return null; - } - } - - EmsScriptNode targetSiteNode = EmsScriptNode.getSiteNode(orgId); - - // find site; it must exist! - if (targetSiteNode == null || !targetSiteNode.exists()) { - logger.error("Can't find node for site: " + orgId + "!"); - return null; - } - - // find or create subfolder - EmsScriptNode subfolder = targetSiteNode.childByNamePath("/" + projectId + "/refs/" + refId); - if (subfolder == null || !subfolder.exists()) { - return null; - } - - // find or create node: - artifactNode = subfolder.childByNamePath("/" + artifactId); - // Node wasnt found, so create one: - if (artifactNode == null) { - artifactNode = subfolder.createNode(artifactId, "cm:content"); - } - - if (artifactNode == null || !artifactNode.exists()) { - logger.error("Failed to create new PNG artifact " + artifactId + "!"); - return null; - } - - if (!artifactNode.hasAspect("cm:versionable")) { - artifactNode.addAspect("cm:versionable"); - } - if (!artifactNode.hasAspect("cm:indexControl")) { - artifactNode.addAspect("cm:indexControl"); - } - - artifactNode.createOrUpdateProperty(Acm.CM_TITLE, artifactId); - artifactNode.createOrUpdateProperty("cm:isIndexed", true); - artifactNode.createOrUpdateProperty("cm:isContentIndexed", false); - - if (logger.isDebugEnabled()) { - logger.debug("Creating artifact with indexing: " + artifactNode.getProperty("cm:isIndexed")); - } - - ContentWriter writer = - services.getContentService().getWriter(artifactNode.getNodeRef(), ContentModel.PROP_CONTENT, true); - writer.putContent(content); - - ContentData contentData = writer.getContentData(); - contentData = ContentData.setMimetype(contentData, finalType); - contentData = ContentData.setEncoding(contentData, "UTF-8"); - services.getNodeService().setProperty(artifactNode.getNodeRef(), ContentModel.PROP_CONTENT, contentData); - - return artifactNode; - } - - public static String getHostname() { - return services.getSysAdminParams().getAlfrescoHost(); - } - - /** - * getModuleService Retrieves the ModuleService of the ServiceRegistry passed in - * - * @param services ServiceRegistry object that contains the desired ModuleService - * @return ModuleService - */ - public static ModuleService getModuleService(ServiceRegistry services) { - // Checks to see if the services passed in is null, if so, it will call - // on class method getServices - if (services == null) { - services = getServices(); - } - // Takes the ServiceRegistry and calls the ModuleService super method - // getService(Creates an Alfresco QName using the namespace - // service and passes in the default URI - ModuleService moduleService = - (ModuleService) services.getService(QName.createQName(NamespaceService.ALFRESCO_URI, "ModuleService")); - return moduleService; - } - - /** - * getServiceModules - * - * Returns a JSONArray of Module Details from the Service Modules - * - * @param service the service containing modules to be returned - * @return JSONArray of ModuleDetails within the ModuleService object - */ - public static JsonArray getServiceModulesJson(ModuleService service) { - - JsonArray jsonArray = new JsonArray(); - List modules = service.getAllModules(); - for (ModuleDetails detail : modules) { - JsonObject jsonModule = moduleDetailsToJson(detail); - jsonArray.add(jsonModule); - } - return jsonArray; - } - - /** - * moduleDetailsToJson - * - * Takes a module of type ModuleDetails and retrieves all off the module's members and puts them - * into a newly instantiated JSONObject. - * - * JSONObject will have the details : title, version, aliases, class, dependencies, editions id - * and properties - * - * @param module A single module of type ModuleDetails - * @return JSONObject which contains all the details of that module - */ - public static JsonObject moduleDetailsToJson(ModuleDetails module) { - JsonObject jsonModule = new JsonObject(); - jsonModule.addProperty("mmsTitle", module.getTitle()); - jsonModule.addProperty("mmsVersion", module.getModuleVersionNumber().toString()); - JsonUtil.addStringList(jsonModule, "mmsAliases", module.getAliases()); - jsonModule.addProperty("mmsClass", module.getClass().toString()); - JsonArray depArray = new JsonArray(); - for (ModuleDependency depend: module.getDependencies()) - depArray.add(depend.toString()); - jsonModule.add("mmsDependencies", depArray); - JsonUtil.addStringList(jsonModule, "mmsEditions", module.getEditions()); - jsonModule.addProperty("mmsId", module.getId()); - JsonObject propObj = new JsonObject(); - Enumeration enumerator = module.getProperties().propertyNames(); - while (enumerator.hasMoreElements()) { - String key = (String)enumerator.nextElement(); - propObj.addProperty(key, module.getProperties().getProperty(key)); - } - jsonModule.add("mmsProperties", propObj); - return jsonModule; - } - - /** - * getMMSversion - * - * Gets the version number of a module, returns a JSONObject which calls on getString with - * 'version' as an argument. This will return a String representing the version of the - * mms. - * - * @return Version number of the MMS as type String - */ - public static String getMMSversion() { - ModuleService service = getModuleService(services); - JsonArray moduleDetails = getServiceModulesJson(service); - String mmsVersion = "NA"; - for (int i = 0; i < moduleDetails.size(); i++) { - JsonObject o = moduleDetails.get(i).getAsJsonObject(); - if (o.get("mmsId").getAsString().equalsIgnoreCase("mms-amp")) { - mmsVersion = o.get("mmsVersion").getAsString(); - } - } - - // Remove appended tags from version - int endIndex = mmsVersion.indexOf('-'); - return endIndex > -1 ? mmsVersion.substring(0, endIndex) : mmsVersion; - } -} diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/util/Sjm.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/util/Sjm.java index d540b245..84fef4e6 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/util/Sjm.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/util/Sjm.java @@ -28,9 +28,11 @@ import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import javax.servlet.http.HttpServletResponse; /** * Simple static class for keeping track of Sysml JSON mappings @@ -43,7 +45,13 @@ public class Sjm { public static final String INFO = "info"; public static final String WARN = "warn"; public static final String ERROR = "error"; - public static final List ERRORLEVELS = new ArrayList<>(Arrays.asList(INFO, WARN, ERROR)); + public static final Map ERROR_LEVELS; + static { + Map temp = new HashMap<>(); + temp.put(Sjm.FAILED, HttpServletResponse.SC_NOT_FOUND); + temp.put(Sjm.DELETED, HttpServletResponse.SC_GONE); + ERROR_LEVELS = Collections.unmodifiableMap(temp); + } public static final String RES = "res"; public static final String ELEMENTS = "elements"; @@ -54,6 +62,7 @@ public class Sjm { public static final String COMMITS = "commits"; public static final String REJECTED = "rejected"; public static final String FAILED = "failed"; + public static final String DELETED = "deleted"; public static final String AGGREGATION = "aggregation"; public static final String APPLIEDSTEREOTYPEINSTANCEID = "appliedStereotypeInstanceId"; @@ -85,8 +94,10 @@ public class Sjm { public static final String ISSTATIC = "isStatic"; public static final String ISUNIQUE = "isUnique"; public static final String LOWERVALUE = "lowerValue"; + public static final String KEYWORDS = "keywords"; public static final String MDEXTENSIONSIDS = "mdExtensionsIds"; public static final String MEMBERENDIDS = "memberEndIds"; + public static final String METADATA = "metadata"; public static final String MOUNTEDELEMENTPROJECTID = "mountedElementProjectId"; public static final String MOUNTEDREFID = "mountedRefId"; public static final String NAME = "name"; @@ -158,6 +169,7 @@ public class Sjm { public static final String ELEMENT = "Element"; public static final String ARTIFACT = "Artifact"; public static final String PROFILES = "profile"; + public static final String MOVES = "moves"; public static final Map STEREOTYPEIDS; diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/util/tasks/BranchTask.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/util/tasks/BranchTask.java index 7b0f521c..4e2e84d7 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/util/tasks/BranchTask.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/util/tasks/BranchTask.java @@ -11,6 +11,7 @@ import gov.nasa.jpl.view_repo.util.JsonUtil; import gov.nasa.jpl.view_repo.util.LogUtil; import gov.nasa.jpl.view_repo.util.Sjm; +import org.alfresco.service.ServiceRegistry; import org.apache.log4j.Logger; import com.google.gson.JsonArray; @@ -93,6 +94,8 @@ public BranchTask(String projectId, String srcId, String createdString, String e private JsonObject createBranch() { + Thread.currentThread().setPriority(Thread.MIN_PRIORITY); + timer = new Timer(); JsonObject created = JsonUtil.buildFromString(createdString); @@ -199,7 +202,7 @@ private JsonObject createBranch() { } try { - eh.updateElement(elasticId, created, projectId); + eh.updateById(elasticId, created, projectId, ElasticHelper.REF); } catch (Exception e) { //Do nothing } @@ -291,7 +294,9 @@ public void done() { Transport.send(msg); } catch (SendFailedException sfe) { + logger.error("Could not send email: ", sfe); } catch (Exception e) { + logger.error("Sending Email Exception: ", e); } } diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/AbstractJavaWebScript.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/AbstractJavaWebScript.java index 7f019187..fc0fb064 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/AbstractJavaWebScript.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/AbstractJavaWebScript.java @@ -28,8 +28,11 @@ ******************************************************************************/ package gov.nasa.jpl.view_repo.webscripts; +import com.google.gson.JsonArray; +import gov.nasa.jpl.view_repo.util.Sjm; import java.util.Arrays; import java.util.Map; +import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -52,7 +55,6 @@ import gov.nasa.jpl.view_repo.util.EmsScriptNode; import gov.nasa.jpl.view_repo.util.JsonUtil; import gov.nasa.jpl.view_repo.util.LogUtil; -import gov.nasa.jpl.view_repo.util.NodeUtil; import gov.nasa.jpl.view_repo.util.EmsNodeUtil; /** @@ -65,9 +67,6 @@ public abstract class AbstractJavaWebScript extends DeclarativeJavaWebScript { private static Logger logger = Logger.getLogger(AbstractJavaWebScript.class); - static boolean checkMmsVersions = false; - private JsonObject privateRequestJSON = null; - // injected members protected ServiceRegistry services; // get any of the Alfresco services protected Repository repository; // used for lucene search @@ -168,50 +167,12 @@ protected void log(Level level, int code, String msg, Exception e) { } } - // If no need for string formatting (calls with no string concatenation) - protected void log(Level level, int code, Exception e) { - String levelMessage = addLevelInfoToMsg(level, LogUtil.getStackTrace(e)); - updateResponse(code, levelMessage); - if (level.toInt() >= logger.getLevel().toInt()) { - // print to response stream if >= existing log level - log(level, levelMessage); - } - } - - // only logging loglevel and a message (no code) - protected void log(Level level, String msg, Object... params) { - if (level.toInt() >= logger.getLevel().toInt()) { - String formattedMsg = formatMessage(msg, params); //formatter.format (msg,params).toString(); - String levelMessage = addLevelInfoToMsg(level, formattedMsg); - //TODO: unsure if need to call responseStatus.setMessage(...) since there is no code - response.append(levelMessage); - log(level, levelMessage); - } - } - - // only logging code and a message (no loglevel, and thus, no check for log level status) - protected void log(int code, String msg, Object... params) { - String formattedMsg = formatMessage(msg, params); //formatter.format (msg,params).toString(); - updateResponse(code, formattedMsg); - } - - protected void log(String msg, Object... params) { - String formattedMsg = formatMessage(msg, params); //formatter.format (msg,params).toString(); - log(formattedMsg); - } - protected void updateResponse(int code, String msg) { response.append(msg); responseStatus.setCode(code); responseStatus.setMessage(msg); } - protected void log(String msg) { - response.append(msg + System.lineSeparator()); - //TODO: add to responseStatus too (below)? - //responseStatus.setMessage(msg); - } - protected static void log(Level level, Exception e) { log(level, LogUtil.getStackTrace(e)); } @@ -253,6 +214,24 @@ protected String addLevelInfoToMsg(Level level, String msg) { } + protected JsonArray parseErrors(Map> errors) { + JsonArray errorMessages = new JsonArray(); + + for (Map.Entry level : Sjm.ERROR_LEVELS.entrySet()) { + if (errors.get(level.getKey()) != null && !errors.get(level.getKey()).isEmpty()) { + for (String sysmlid : errors.get(level.getKey())) { + JsonObject errorPayload = new JsonObject(); + errorPayload.addProperty("code", level.getValue()); + errorPayload.addProperty(Sjm.SYSMLID, sysmlid); + errorPayload.addProperty("message", + String.format("Element %s was not found", sysmlid)); + errorMessages.add(errorPayload); + } + } + } + return errorMessages; + } + // formatMessage function is used to catch certain objects that must be dealt with individually // formatter.format() is avoided because it applies toString() directly to objects which provide unreadable outputs protected String formatMessage(String initMsg, Object... params) { @@ -298,10 +277,7 @@ protected boolean checkPermissions(EmsScriptNode node, String permissions) { } public ServiceRegistry getServices() { - if (services == null) { - services = NodeUtil.getServices(); - } - return services; + return this.services; } protected boolean checkRequestContent(WebScriptRequest req) { @@ -343,28 +319,8 @@ public static boolean getBooleanArg(WebScriptRequest req, String name, boolean d return defaultValue; } - - public StringBuffer getResponse() { - return response; - } - - public Status getResponseStatus() { - return responseStatus; - } - - /** - * Should create the new instances with the response in constructor, so - * this can be removed every where - * - * @param instance - */ - public void appendResponseStatusInfo(AbstractJavaWebScript instance) { - response.append(instance.getResponse()); - responseStatus.setCode(instance.getResponseStatus().getCode()); - } - protected void printFooter(String user, Logger logger, Timer timer) { - logger.info(String.format("%d %s %s", getResponseStatus().getCode(), user, timer)); + logger.info(String.format("%d %s %s", responseStatus.getCode(), user, timer)); } protected void printHeader(String user, Logger logger, WebScriptRequest req) { @@ -405,17 +361,6 @@ public static String getProjectId(WebScriptRequest req) { return null; } - public static String getProjectId(WebScriptRequest req, String siteName) { - String projectId = req.getServiceMatch().getTemplateVars().get(PROJECT_ID); - if (projectId == null || projectId.length() <= 0) { - if (siteName == null) { - siteName = NO_SITE_ID; - } - projectId = siteName + "_" + NO_PROJECT_ID; - } - return projectId; - } - public static String getRefId(WebScriptRequest req) { String refId = req.getServiceMatch().getTemplateVars().get(REF_ID); if (refId == null || refId.length() <= 0) { @@ -424,20 +369,6 @@ public static String getRefId(WebScriptRequest req) { return refId; } - public EmsScriptNode getWorkspace(WebScriptRequest req) { - String refId = getRefId(req); - String projectId = getProjectId(req); - EmsNodeUtil emsNodeUtil = new EmsNodeUtil(projectId, refId); - String orgId = emsNodeUtil.getOrganizationFromProject(projectId); - EmsScriptNode node = EmsScriptNode.getSiteNode(orgId); - node = node.childByNamePath("/" + projectId + "/refs/" + refId); - if (node != null) { - return new EmsScriptNode(node.getNodeRef(), services); - } - - return null; - } - /** * This needs to be called with the incoming JSON request to populate the local source * variable that is used in the sendDeltas call. @@ -458,179 +389,4 @@ public String createResponseJson() { String resStr = !Utils.isNullOrEmpty(resToString) ? resToString.replaceAll(System.lineSeparator(), "") : ""; return !Utils.isNullOrEmpty(resStr) ? String.format("{\"message\":\"%s\"}", resStr) : "{}"; } - - - /** - * compareMmsVersions - *
- *

Note: Returns true if this compare fails for either incorrect versions or if there is an error with the request.
- * Returns false if the check is successful and the versions match.

- *
-     * Takes a request created when a service is called and will retrieve the mmsVersion that is sent with it.
-     *  The flag checkMmsVersions needs to be set to true for this service to work.
-     *  
1. Check if there the request comes with the parameter mmsVersion=2.#. If the global flag - * is set to check for mmsVersion it will then return either none if either invalid input or if none has been - * specified, or the value of the version the service is being called with. - *
2. If the value that is received after checking for mmsVersion in the request, is 'none' then - * it will call parseContent of the request to create a JSONObject. If that fails, an exception is thrown - * and the boolean value 'true' is returned to the calling method to signify failure of the check. Else it - * will try to grab the mmsVersion from where ever it may lie within the JSONObject. - *
3. - *
- * - * @param req WebScriptRequest - * @param response StringBuffer response - * @param status Status of the request - * @return boolean false if versions match, true if they do not match or if is an incorrect request. - * @author EDK - */ - public boolean compareMmsVersions(WebScriptRequest req, StringBuffer response, Status status) { - // Calls getBooleanArg to check if they have request for mms version - // TODO: Possibly remove this and implement as an aspect? - boolean incorrectVersion = true; - JsonObject jsonRequest = null; - char logCase = '0'; - JsonObject jsonVersion = null; - String mmsVersion = null; - - // Checks if the argument is mmsVersion and returns the value specified - // by the request - // if there is no request it will return 'none' - String paramVal = getStringArg(req, "mmsVersion", "none"); - String paramArg = paramVal; - // Checks data member requestJSON to see if it is not null and if - // paramVal is none - - // // Check if input is K or JSON - String contentType = req.getContentType() == null ? "" : req.getContentType().toLowerCase(); - - boolean jsonNotK = !contentType.contains("application/k"); - - - if (!jsonNotK && paramVal.equals("none")) { - jsonRequest = getRequestJSON(req); - - if (jsonRequest != null) { - paramVal = JsonUtil.getOptString(jsonRequest, "mmsVersion"); - } - } - - if (paramVal != null && !paramVal.equals("none") && paramVal.length() > 0) { - // Calls NodeUtil's getMMSversion - jsonVersion = getMMSversion(); - mmsVersion = jsonVersion.get("mmsVersion").toString(); - - log(Level.INFO, HttpServletResponse.SC_OK, "Comparing Versions...."); - if (mmsVersion.equals(paramVal)) { - // Compared versions matches - logCase = '1'; - incorrectVersion = false; - } else { - // Versions do not match - logCase = '2'; - } - } else if (Utils.isNullOrEmpty(paramVal) || paramVal.equals("none")) { - // Missing MMS Version parameter - logCase = '3'; - } else { - // Wrong MMS Version or Invalid input - logCase = '4'; - } - switch (logCase) { - case '1': - log(Level.INFO, HttpServletResponse.SC_OK, "Correct Versions"); - break; - case '2': - log(Level.WARN, HttpServletResponse.SC_CONFLICT, - "Versions do not match! Expected Version " + mmsVersion + ". Instead received " + paramVal); - break; - case '3': - log(Level.ERROR, HttpServletResponse.SC_CONFLICT, - "Missing MMS Version or invalid parameter. Received parameter:" + paramArg + " and argument:" - + mmsVersion + ". Request was: " + jsonRequest); - break; - // TODO: This should be removed but for the moment I am leaving this - // in as a contingency if anything else may break this. - case '4': - log(Level.ERROR, HttpServletResponse.SC_CONFLICT, - "Wrong MMS Version or invalid input. Expected mmsVersion=" + mmsVersion + ". Instead received " - + paramVal); - break; - } - // Returns true if it is either the wrong version or if it failed to - // compare it - // Returns false if it was successful in retrieving the mmsVersions from - // both the MMS and the request and - return incorrectVersion; - } - - /** - * getMMSversion
- * Returns a JSONObject representing the mms version being used. It's format - * will be - * - *
-     *  {
-     *     "mmsVersion":"2.2"
-     * }
-     * 
- * - * @return JSONObject mmsVersion - */ - public static JsonObject getMMSversion() { - JsonObject version = new JsonObject(); - version.addProperty("mmsVersion", NodeUtil.getMMSversion()); - return version; - } - - /** - * Helper utility to get the String value of a request parameter, calls on - * getParameterNames from the WebScriptRequest object to compare the - * parameter name passed in that is desired from the header. - * - * @param req WebScriptRequest with parameter to be checked - * @param name String of the request parameter name to check - * @param defaultValue default value if there is no parameter with the given name - * @return 'empty' if the parameter is assigned no value, if it is assigned - * "parameter value" (ignoring case), or if it's default is default - * value and it is not assigned "empty" (ignoring case). - * @author dank - */ - public static String getStringArg(WebScriptRequest req, String name, String defaultValue) { - if (!Arrays.asList(req.getParameterNames()).contains(name)) { - return defaultValue; - } - return req.getParameter(name); - } - - /** - * setRequestJSON
- * This will set the AbstractJavaWebScript data member requestJSON. It will - * make the parsedContent JSONObject remain within the scope of the - * AbstractJavaWebScript. {@link} - * - * @param req WebScriptRequest - */ - private void setRequestJSON(WebScriptRequest req) { - - JsonParser parser = new JsonParser(); - try { - JsonElement parsed = parser.parse(req.getContent().getContent()); - privateRequestJSON = parsed.isJsonNull() ? new JsonObject() : - parsed.getAsJsonObject(); - } catch (Exception e) { - log(Level.ERROR, HttpServletResponse.SC_BAD_REQUEST, "Could not retrieve JSON"); - logger.error(String.format("%s", LogUtil.getStackTrace(e))); - } - } - - private JsonObject getRequestJSON(WebScriptRequest req) { - // Returns immediately if requestJSON has already been set before checking MMS Versions - if (privateRequestJSON == null) { - return null; - } - // Sets privateRequestJSON - setRequestJSON(req); - return privateRequestJSON; - } } diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/AllFlagsGet.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/AllFlagsGet.java index 602519f8..f154caf4 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/AllFlagsGet.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/AllFlagsGet.java @@ -1,15 +1,11 @@ package gov.nasa.jpl.view_repo.webscripts; -import gov.nasa.jpl.view_repo.util.NodeUtil; +import gov.nasa.jpl.view_repo.util.EmsScriptNode; public class AllFlagsGet extends FlagSet { private static final String[] flags = - new String[] { "debug", - - "checkMmsVersions", - - "skipSvgToPng"}; + new String[] { "debug"}; @Override public String[] getAllFlags() { @@ -31,11 +27,6 @@ protected boolean set( boolean val ) { if (path.equalsIgnoreCase( "all" )) { return false; } - if (path.equalsIgnoreCase("checkMmsVersions")){ - AbstractJavaWebScript.checkMmsVersions = val; - } else if (path.equalsIgnoreCase("skipSvgToPng")){ - NodeUtil.skipSvgToPng = val; - } return true; } @@ -49,25 +40,14 @@ protected boolean get( String path ) { if (path.equalsIgnoreCase( "all" )) { return true; } - - if (path.equalsIgnoreCase("checkMmsVersions")){ - return AbstractJavaWebScript.checkMmsVersions; - } else if (path.equalsIgnoreCase( "skipSvgToPng" )) { - return NodeUtil.skipSvgToPng; - } return false; } @Override protected boolean clear() { String path = getPath(); - if (path.equalsIgnoreCase ("debug")) { return false; - } else if (path.equalsIgnoreCase("checkMmsVersions")){ - return false; - } else if (path.equalsIgnoreCase( "skipSvgToPng" )) { - return false; } return false; } @@ -87,11 +67,6 @@ protected String flagName() { } if (path.equalsIgnoreCase ("debug")) { return "debug"; - - } else if (path.equalsIgnoreCase("checkMmsVersions")){ - return "checkMmsVersions"; - } else if (path.equalsIgnoreCase( "skipSvgToPng")) { - return "skipSvgToPg"; } return null; } diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/ArtifactGet.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/ArtifactGet.java index b9860f3d..f2a9158d 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/ArtifactGet.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/ArtifactGet.java @@ -27,30 +27,17 @@ package gov.nasa.jpl.view_repo.webscripts; import java.io.IOException; -import java.util.HashMap; -import java.util.HashSet; import java.util.Map; -import java.util.Set; - -import javax.servlet.http.HttpServletResponse; +import com.google.gson.*; import gov.nasa.jpl.view_repo.util.*; import org.alfresco.repo.model.Repository; -import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.service.ServiceRegistry; -import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.springframework.extensions.webscripts.Cache; import org.springframework.extensions.webscripts.Status; import org.springframework.extensions.webscripts.WebScriptRequest; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; - -import gov.nasa.jpl.mbee.util.Timer; - /** * Descriptor in /view-repo/src/main/amp/config/alfresco/extension/templates/webscripts * /gov/nasa/jpl/javawebscripts/model.get.desc.xml @@ -61,10 +48,6 @@ public class ArtifactGet extends ModelGet { static Logger logger = Logger.getLogger(ArtifactGet.class); - private static final String ARTIFACTID = "artifactId"; - private static final String COMMITID = "commitId"; - private static final String CONTENTTYPE = "contentType"; - public ArtifactGet() { super(); } @@ -81,143 +64,8 @@ public ArtifactGet(Repository repositoryHelper, ServiceRegistry registry) { return instance.executeImplImpl(req, status, cache); } - @Override protected Map executeImplImpl(WebScriptRequest req, Status status, Cache cache) { - String user = AuthenticationUtil.getFullyAuthenticatedUser(); - printHeader(user, logger, req); - Timer timer = new Timer(); - - Map model = new HashMap<>(); - JsonObject top = new JsonObject(); - - String[] accepts = req.getHeaderValues("Accept"); - String accept = (accepts != null && accepts.length != 0) ? accepts[0] : ""; - - if (logger.isDebugEnabled()) { - logger.debug(String.format("Accept: %s", accept)); - } - boolean isCommit = req.getParameter(COMMITID) != null && !req.getParameter(COMMITID).isEmpty(); - // :TODO refactor to handle the response consistently - try { - if (isCommit) { - JsonArray commitJsonToArray = new JsonArray(); - JsonObject commitJson = handleCommitRequest(req); - commitJsonToArray.add(commitJson); - if (commitJson == null || commitJson.size() == 0) { - log(Level.ERROR, HttpServletResponse.SC_NOT_FOUND, "No elements found."); - } - if (commitJson != null && commitJson.size() > 0) { - top.add(Sjm.ARTIFACTS, filterByPermission(commitJsonToArray, req)); - } - if (top.has(Sjm.ARTIFACTS) && top.get(Sjm.ARTIFACTS).getAsJsonArray().size() < 1) { - log(Level.ERROR, HttpServletResponse.SC_FORBIDDEN, "Permission denied."); - } - status.setCode(responseStatus.getCode()); - if (prettyPrint || accept.contains("webp")) { - Gson gson = new GsonBuilder().setPrettyPrinting().create(); - model.put(Sjm.RES, gson.toJson(top)); - } else { - model.put(Sjm.RES, top); - } - } else { - model = handleArtifactGet(req, status, accept); - } - } catch (Exception e) { - log(Level.ERROR, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Internal error", e); - } - - printFooter(user, logger, timer); - - return model; - } - - private JsonObject handleCommitRequest(WebScriptRequest req) { - // getElement at commit - String projectId = getProjectId(req); - String refId = getRefId(req); - EmsNodeUtil emsNodeUtil = new EmsNodeUtil(projectId, refId); - - String artifactId = req.getServiceMatch().getTemplateVars().get(ARTIFACTID); - String commitId = req.getParameter(COMMITID); - if (emsNodeUtil.getArtifactById(artifactId, true) != null) { - JsonObject artifact = emsNodeUtil.getArtifactByArtifactAndCommitId(commitId, artifactId); - if (artifact == null || artifact.size() == 0) { - // :TODO I don't think this logic needs to be changed at all for Artifact - //this is true if element id and artifact id are mutually unique - return emsNodeUtil.getElementAtCommit(artifactId, commitId); - } else { - return artifact; - } - } - - JsonObject mountsJson = new JsonObject(); - mountsJson.addProperty(Sjm.SYSMLID, projectId); - mountsJson.addProperty(Sjm.REFID, refId); - // convert commitId to timestamp - String commit = emsNodeUtil.getCommitObject(commitId).get(Sjm.CREATED).getAsString(); - - JsonArray result = new JsonArray(); - Set elementsToFind = new HashSet<>(); - elementsToFind.add(artifactId); - - try { - EmsNodeUtil.handleMountSearch(mountsJson, false, false, 0L, elementsToFind, result, commit, "artifacts"); - if (result.size() > 0) { - return JsonUtil.getOptObject(result, 0); - } - } catch (Exception e) { - log(Level.ERROR, HttpServletResponse.SC_NOT_FOUND, "Could not find artifact %s at commit %s", artifactId, - commitId); - logger.error(String.format("%s", LogUtil.getStackTrace(e))); - } - return new JsonObject(); - } - - protected Map handleArtifactGet(WebScriptRequest req, Status status, String accept) { - - Map model = new HashMap<>(); - - if (validateRequest(req, status)) { - JsonObject result = null; - String artifactId = req.getServiceMatch().getTemplateVars().get(ARTIFACTID); - String projectId = getProjectId(req); - String refId = getRefId(req); - if (artifactId != null) { - JsonObject mountsJson = new JsonObject(); - mountsJson.addProperty(Sjm.SYSMLID, projectId); - mountsJson.addProperty(Sjm.REFID, refId); - - JsonArray results = new JsonArray(); - Set elementsToFind = new HashSet<>(); - elementsToFind.add(artifactId); - try { - EmsNodeUtil - .handleMountSearch(mountsJson, false, false, 0L, elementsToFind, results, null, "artifacts"); - if (results.size() > 0) { - result = JsonUtil.getOptObject(results, 0); - } - } catch (IOException e) { - log(Level.ERROR, HttpServletResponse.SC_NOT_FOUND, "Artifact not found!\n"); - logger.error(String.format("%s", LogUtil.getStackTrace(e))); - } - if (result != null) { - JsonObject r = new JsonObject(); - JsonArray array = new JsonArray(); - array.add(result); - r.add("artifacts", array); - model.put(Sjm.RES, r); - } else { - log(Level.ERROR, HttpServletResponse.SC_NOT_FOUND, "Artifact not found!\n"); - } - } else { - log(Level.ERROR, HttpServletResponse.SC_BAD_REQUEST, "ArtifactId not supplied!\n"); - } - } else { - log(Level.ERROR, HttpServletResponse.SC_BAD_REQUEST, "Invalid request!"); - } - status.setCode(responseStatus.getCode()); - if (!model.containsKey(Sjm.RES)) { - model.put(Sjm.RES, createResponseJson()); - } - return model; + @Override protected Map getModel(WebScriptRequest req) throws IOException { + JsonObject result = handleRequest(req, 0L, Sjm.ARTIFACTS); + return finish(req, result, true, Sjm.ARTIFACTS); } } diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/ArtifactPost.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/ArtifactPost.java index e9d78d97..46f72223 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/ArtifactPost.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/ArtifactPost.java @@ -41,6 +41,9 @@ import org.apache.commons.io.FilenameUtils; import org.apache.log4j.Level; import org.apache.log4j.Logger; +import org.apache.tika.Tika; +import org.apache.tika.config.TikaConfig; +import org.apache.tika.mime.MimeTypeException; import org.springframework.extensions.surf.util.Content; import org.springframework.extensions.webscripts.Cache; import org.springframework.extensions.webscripts.Status; @@ -71,6 +74,9 @@ public class ArtifactPost extends AbstractJavaWebScript { protected String mimeType = null; protected String encoding = null; + protected Tika tika = new Tika(); + protected TikaConfig tikaConfig = TikaConfig.getDefaultConfig(); + private final String NEWELEMENTS = "newElements"; public ArtifactPost() { @@ -118,7 +124,7 @@ protected Map executeImplImpl(final WebScriptRequest req, final filePath = EmsNodeUtil.saveToFilesystem(filename, field.getInputStream()); content = new String(Files.readAllBytes(filePath)); - finalContentType = Files.probeContentType(filePath); + finalContentType = tika.detect(filePath); if (logger.isDebugEnabled()) { logger.debug("filename: " + filename); @@ -210,7 +216,9 @@ boolean handleArtifactPost(final WebScriptRequest req, final Status status, Stri Map model = new HashMap<>(); // Replace with true content type - postJson.addProperty(Sjm.CONTENTTYPE, finalContentType); + if (finalContentType != null) { + postJson.addProperty(Sjm.CONTENTTYPE, finalContentType); + } String projectId = getProjectId(req); String refId = getRefId(req); @@ -220,7 +228,16 @@ boolean handleArtifactPost(final WebScriptRequest req, final Status status, Stri if (validateRequest(req, status) && !siteName.isEmpty()) { - extension = FilenameUtils.getExtension(filename); + try { + extension = tikaConfig.getMimeRepository().forName(JsonUtil.getOptString(postJson, Sjm.CONTENTTYPE)).getExtension(); + } catch (MimeTypeException mte) { + logger.debug(mte); + } + + if (extension == null) { + extension = FilenameUtils.getExtension(filename); + } + artifactId = postJson.get(Sjm.SYSMLID).getAsString(); // Create return json: @@ -237,13 +254,13 @@ boolean handleArtifactPost(final WebScriptRequest req, final Status status, Stri // :TODO check against checksum first, md5hash(content), if matching return the previous version if (filePath != null) { - artifact = NodeUtil + artifact = EmsScriptNode .updateOrCreateArtifact(alfrescoId, filePath, JsonUtil.getOptString(postJson, Sjm.CONTENTTYPE), siteName, projectId, refId); } if (artifact == null) { - log(HttpServletResponse.SC_BAD_REQUEST, "Was not able to create the artifact!\n"); + log(Level.ERROR, HttpServletResponse.SC_BAD_REQUEST, "Was not able to create the artifact!\n"); model.put(Sjm.RES, createResponseJson()); } else { String url = artifact.getUrl(); @@ -252,11 +269,11 @@ boolean handleArtifactPost(final WebScriptRequest req, final Status status, Stri } } } else { - log(HttpServletResponse.SC_BAD_REQUEST, "artifactId not supplied or content is empty!"); + log(Level.INFO, HttpServletResponse.SC_BAD_REQUEST, "artifactId not supplied or content is empty!"); model.put(Sjm.RES, createResponseJson()); } } else { - log(HttpServletResponse.SC_BAD_REQUEST, "Invalid request, no sitename specified or no content provided!"); + log(Level.INFO, HttpServletResponse.SC_BAD_REQUEST, "Invalid request, no sitename specified or no content provided!"); model.put(Sjm.RES, createResponseJson()); } diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/ArtifactsGet.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/ArtifactsGet.java index 75ca9bfd..74f64f45 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/ArtifactsGet.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/ArtifactsGet.java @@ -30,33 +30,16 @@ package gov.nasa.jpl.view_repo.webscripts; import java.io.IOException; -import java.sql.SQLException; -import java.util.HashMap; -import java.util.HashSet; import java.util.Map; -import java.util.Set; - -import javax.servlet.http.HttpServletResponse; +import com.google.gson.*; import org.alfresco.repo.model.Repository; -import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.service.ServiceRegistry; -import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.springframework.extensions.webscripts.Cache; import org.springframework.extensions.webscripts.Status; import org.springframework.extensions.webscripts.WebScriptRequest; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; - -import gov.nasa.jpl.mbee.util.Timer; - -import gov.nasa.jpl.view_repo.util.EmsNodeUtil; -import gov.nasa.jpl.view_repo.util.JsonUtil; -import gov.nasa.jpl.view_repo.util.LogUtil; import gov.nasa.jpl.view_repo.util.Sjm; /** @@ -81,119 +64,9 @@ public ArtifactsGet(Repository repositoryHelper, ServiceRegistry registry) { return instance.executeImplImpl(req, status, cache); } - @Override protected Map executeImplImpl(WebScriptRequest req, Status status, Cache cache) { - String user = AuthenticationUtil.getFullyAuthenticatedUser(); - printHeader(user, logger, req); - Timer timer = new Timer(); - - String[] accepts = req.getHeaderValues("Accept"); - String accept = (accepts != null && accepts.length != 0) ? accepts[0] : ""; - - Map model = new HashMap<>(); - JsonArray elementsJson = new JsonArray(); - JsonArray errors = new JsonArray(); - JsonObject result = new JsonObject(); - - try { - - if (validateRequest(req, status)) { - result = handleRequest(req); - elementsJson = JsonUtil.getOptArray(result, Sjm.ARTIFACTS); - } - - JsonObject top = new JsonObject(); - if (elementsJson != null && elementsJson.size() > 0) { - JsonArray elements = filterByPermission(elementsJson, req); - if (elements.size() == 0) { - log(Level.ERROR, HttpServletResponse.SC_FORBIDDEN, "Permission denied."); - } - - top.add(Sjm.ARTIFACTS, elements); - - JsonArray errorMessages = new JsonArray(); - for (String level : Sjm.ERRORLEVELS) { - errors = JsonUtil.getOptArray(result, level); - if (errors != null && errors.size() > 0) { - for (int i = 0; i < errors.size(); i++) { - JsonObject errorPayload = new JsonObject(); - errorPayload.addProperty("code", HttpServletResponse.SC_NOT_FOUND); - errorPayload.add(Sjm.SYSMLID, errors.get(i)); - errorPayload.addProperty("message", String.format("Element %s was not found", errors.get(i))); - errorPayload.addProperty("severity", level); - errorMessages.add(errorPayload); - } - } - } - - if (errorMessages.size() > 0) { - top.add("messages", errorMessages); - } - - if (prettyPrint || accept.contains("webp")) { - Gson gson = new GsonBuilder().setPrettyPrinting().create(); - model.put(Sjm.RES, gson.toJson(top)); - } else { - model.put(Sjm.RES, top); - } - } else { - log(Level.INFO, HttpServletResponse.SC_OK, "No elements found"); - top.add(Sjm.ARTIFACTS, new JsonArray()); - model.put(Sjm.RES, top); - } - } catch (Exception e) { - logger.error(String.format("%s", LogUtil.getStackTrace(e))); - } - - status.setCode(responseStatus.getCode()); - - printFooter(user, logger, timer); - - return model; - } - - /** - * Wrapper for handling a request and getting the appropriate JSONArray of - * elements - * - * @param req - * @return - * @throws IOException - */ - private JsonObject handleRequest(WebScriptRequest req) - throws IOException, SQLException { - JsonObject requestJson = JsonUtil.buildFromString(req.getContent().getContent()); - if (requestJson.has(Sjm.ARTIFACTS)) { - JsonArray elementsToFindJson = requestJson.get(Sjm.ARTIFACTS).getAsJsonArray(); - - String refId = getRefId(req); - String projectId = getProjectId(req); - String commitId = req.getParameter(Sjm.COMMITID.replace("_","")); - - JsonObject mountsJson = new JsonObject(); - mountsJson.addProperty(Sjm.SYSMLID, projectId); - mountsJson.addProperty(Sjm.REFID, refId); - - JsonArray found = new JsonArray(); - JsonObject result = new JsonObject(); - - Set uniqueElements = new HashSet<>(); - for (int i = 0; i < elementsToFindJson.size(); i++) { - uniqueElements.add(elementsToFindJson.get(i).getAsJsonObject().get(Sjm.SYSMLID).getAsString()); - } - - EmsNodeUtil emsNodeUtil = new EmsNodeUtil(projectId, refId); - JsonObject commitObject = emsNodeUtil.getCommitObject(commitId); - - String timestamp = - commitObject != null && commitObject.has(Sjm.CREATED) ? commitObject.get(Sjm.CREATED).getAsString() : null; - - EmsNodeUtil.handleMountSearch(mountsJson, false, false, 0L, uniqueElements, found, timestamp, "artifacts"); - result.add(Sjm.ARTIFACTS, found); - JsonUtil.addStringSet(result, Sjm.WARN, uniqueElements); - return result; - } else { - return new JsonObject(); - } + @Override protected Map getModel(WebScriptRequest req) throws IOException { + JsonObject result = handleRequest(req, 0L, Sjm.ARTIFACTS); + return finish(req, result, false, Sjm.ARTIFACTS); } } diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/CfIdsGet.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/CfIdsGet.java index dc4135a1..a91a2eb3 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/CfIdsGet.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/CfIdsGet.java @@ -51,7 +51,7 @@ import gov.nasa.jpl.mbee.util.Utils; import gov.nasa.jpl.view_repo.db.Node; -public class CfIdsGet extends AbstractJavaWebScript { +public class CfIdsGet extends ModelGet { static Logger logger = Logger.getLogger(CfIdsGet.class); @@ -65,20 +65,6 @@ public CfIdsGet(Repository repositoryHelper, ServiceRegistry registry) { super(repositoryHelper, registry); } - @Override protected boolean validateRequest(WebScriptRequest req, Status status) { - String refId = getRefId(req); - String projectId = getProjectId(req); - EmsNodeUtil emsNodeUtil = new EmsNodeUtil(projectId, refId); - - if (refId != null && refId.equalsIgnoreCase(NO_WORKSPACE_ID)) { - return true; - } else if (refId != null && !emsNodeUtil.refExists(refId)) { - log(Level.ERROR, HttpServletResponse.SC_NOT_FOUND, "Reference with id, %s not found", refId); - return false; - } - return true; - } - /** * Entry point */ @@ -137,15 +123,7 @@ protected JsonArray handleElementHierarchy(String rootSysmlid, WebScriptRequest Long depth = null; String depthParam = req.getParameter("depth"); if (depthParam != null) { - try { - depth = Long.parseLong(depthParam); - if (depth < 0) { - depth = 100000L; - } - } catch (NumberFormatException nfe) { - // don't do any recursion, ignore the depth - log(Level.WARN, HttpServletResponse.SC_BAD_REQUEST, "Bad depth specified, returning depth 0"); - } + depth = parseDepth(depthParam); } if (depth == null) { depth = 5L; @@ -156,7 +134,7 @@ protected JsonArray handleElementHierarchy(String rootSysmlid, WebScriptRequest protected JsonArray handleMountSearch(JsonObject mountsJson, String rootSysmlid, Long depth) throws SQLException, IOException { JsonArray result = null; - EmsNodeUtil emsNodeUtil = new EmsNodeUtil(mountsJson.get(Sjm.SYSMLID).getAsString(), + EmsNodeUtil emsNodeUtil = new EmsNodeUtil(mountsJson.get(Sjm.SYSMLID).getAsString(), mountsJson.get(Sjm.REFID).getAsString()); Node n = emsNodeUtil.getById(rootSysmlid); if (n != null) { @@ -168,7 +146,7 @@ protected JsonArray handleMountSearch(JsonObject mountsJson, String rootSysmlid, } if (!mountsJson.has(Sjm.MOUNTS)) { mountsJson = emsNodeUtil.getProjectWithFullMounts( - mountsJson.get(Sjm.SYSMLID).getAsString(), + mountsJson.get(Sjm.SYSMLID).getAsString(), mountsJson.get(Sjm.REFID).getAsString(), null); } JsonArray mountsArray = mountsJson.get(Sjm.MOUNTS).getAsJsonArray(); diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/DeclarativeJavaWebScript.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/DeclarativeJavaWebScript.java index 59cd4e45..438e08ac 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/DeclarativeJavaWebScript.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/DeclarativeJavaWebScript.java @@ -56,7 +56,6 @@ public class DeclarativeJavaWebScript extends AbstractWebScript { // Logger private static final Log logger = LogFactory.getLog(DeclarativeJavaWebScript.class); - static boolean cacheSnapshotsFlag = false; protected boolean editable = false; public static final String REF_ID = "refId"; @@ -70,9 +69,6 @@ public class DeclarativeJavaWebScript extends AbstractWebScript { public static final String NO_PROJECT_ID = "no_project"; public static final String NO_SITE_ID = "no_site"; - private static final String HEADER_CONTENT_RANGE = "Content-Range"; - private static final String HEADER_CONTENT_LENGTH = "Content-Length"; - /* (non-Javadoc) * @see org.alfresco.web.scripts.WebScript#execute(org.alfresco.web.scripts.WebScriptRequest, org.alfresco.web.scripts.WebScriptResponse) */ @@ -91,7 +87,6 @@ public class DeclarativeJavaWebScript extends AbstractWebScript { // construct model for script / template Status status = new Status(); Cache cache = new Cache(getDescription().getRequiredCache()); - setCacheHeaders(req, cache); // add in custom headers for nginx caching Map model; @@ -121,49 +116,29 @@ public class DeclarativeJavaWebScript extends AbstractWebScript { model.put("cache", cache); try { - // create model for template rendering - Map templateModel = createTemplateParameters(req, res, model); - // is a redirect to a status specific template required? - if (status.getRedirect()) { - sendStatus(req, res, status, cache, format, templateModel); - } else { - // render output - int statusCode = status.getCode(); - if (statusCode != HttpServletResponse.SC_OK && !req.forceSuccessStatus()) { - if (logger.isDebugEnabled()) { - logger.debug("Force success status header in response: " + req.forceSuccessStatus()); - logger.debug("Setting status " + statusCode); - } - res.setStatus(statusCode); - } - - // apply location - String location = status.getLocation(); - if (location != null && location.length() > 0) { - if (logger.isDebugEnabled()) - logger.debug("Setting location to " + location); - res.setHeader(WebScriptResponse.HEADER_LOCATION, location); - } - - // apply cache - res.setCache(cache); - - // render response according to requested format - if (templateModel.containsKey(Sjm.RES) && templateModel.get(Sjm.RES) != null) { - res.setContentType("application/json"); - res.setContentEncoding("UTF-8"); - if (templateModel.get(Sjm.RES) instanceof JsonObject) { - JsonObject json = (JsonObject) templateModel.get(Sjm.RES); - Map jsonMap = new Gson().fromJson(json, new TypeToken>(){}.getType()); - JsonContentReader reader = new JsonContentReader(jsonMap); - - // get the content and stream directly to the response output stream - // assuming the repository is capable of streaming in chunks, this should allow large files - // to be streamed directly to the browser response stream. - reader.getStreamContent(res.getOutputStream()); - } else { - res.getWriter().write(templateModel.get(Sjm.RES).toString()); - } + res.setStatus(status.getCode()); + String location = status.getLocation(); + if (location != null && location.length() > 0) { + res.setHeader(WebScriptResponse.HEADER_LOCATION, location); + } + // apply cache + res.setCache(cache); + + // render response according to requested format + if (model.containsKey(Sjm.RES) && model.get(Sjm.RES) != null) { + res.setContentType("application/json"); + res.setContentEncoding("UTF-8"); + if (model.get(Sjm.RES) instanceof JsonObject) { + JsonObject json = (JsonObject) model.get(Sjm.RES); + Map jsonMap = new Gson().fromJson(json, new TypeToken>(){}.getType()); + JsonContentReader reader = new JsonContentReader(jsonMap); + + // get the content and stream directly to the response output stream + // assuming the repository is capable of streaming in chunks, this should allow large files + // to be streamed directly to the browser response stream. + reader.getStreamContent(res.getOutputStream()); + } else { + res.getWriter().write(model.get(Sjm.RES).toString()); } } } finally { @@ -177,73 +152,6 @@ public class DeclarativeJavaWebScript extends AbstractWebScript { } } - /** - * Set the cache headers for caching server based on the request. This is single place - * that we need to modify to update cache-control headers across all webscripts. - * - * @param req - * @param cache - */ - private boolean setCacheHeaders(WebScriptRequest req, Cache cache) { - String[] names = req.getParameterNames(); - boolean cacheUpdated = false; - // check if timestamp - for (String name : names) { - if (name.equals("timestamp")) { - cacheUpdated = updateCache(cache); - break; - } - } - // check if configuration snapshots and products - if (!cacheUpdated) { - if (cacheSnapshotsFlag) { - String url = req.getURL(); - if (url.contains("configurations")) { - if (url.contains("snapshots") || url.contains(Sjm.PRODUCTS)) { - cacheUpdated = updateCache(cache); - } - } - } - } - - return cacheUpdated; - } - - private boolean updateCache(Cache cache) { - if (!cache.getIsPublic()) { - cache.setIsPublic(true); - cache.setMaxAge(31557000L); - // following are true by default, so need to set them to false - cache.setNeverCache(false); - cache.setMustRevalidate(false); - } - return true; - } - - /** - * Execute custom Java logic - * - * @param req Web Script request - * @param status Web Script status - * @return custom service model - * @deprecated - */ - @Deprecated protected Map executeImpl(WebScriptRequest req, WebScriptStatus status) { - return null; - } - - /** - * Execute custom Java logic - * - * @param req Web Script request - * @param status Web Script status - * @return custom service model - * @deprecated - */ - @Deprecated protected Map executeImpl(WebScriptRequest req, Status status) { - return executeImpl(req, new WebScriptStatus(status)); - } - /** * Execute custom Java logic * @@ -253,8 +161,7 @@ private boolean updateCache(Cache cache) { * @return custom service model */ protected Map executeImpl(WebScriptRequest req, Status status, Cache cache) { - // NOTE: Redirect to those web scripts implemented before cache support and v2.9 - return executeImpl(req, status); + return null; } /** @@ -371,7 +278,9 @@ private JsonObject filterElementByPermission(JsonObject element, String projectI permCache.put(cacheKey, writePermMap); } } - element.addProperty(Sjm.EDITABLE, editable); + if (element.has(Sjm.SYSMLID)) { + element.addProperty(Sjm.EDITABLE, editable); + } return element; } return null; diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/DocumentsGet.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/DocumentsGet.java index 5d272da5..1a615829 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/DocumentsGet.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/DocumentsGet.java @@ -51,14 +51,6 @@ public DocumentsGet(Repository repository, ServiceRegistry services) { Map model = new HashMap<>(); - // Checks mms versions - if (checkMmsVersions) { - if (compareMmsVersions(req, getResponse(), getResponseStatus())) { - model.put(Sjm.RES, createResponseJson()); - return model; - } - } - JsonObject jsonObject = new JsonObject(); try { diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/HostnameGet.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/HostnameGet.java index 00250601..89037947 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/HostnameGet.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/HostnameGet.java @@ -89,8 +89,8 @@ public String getAlfrescoProtocol(){ private String alfrescoUrl; public String getAlfrescoUrl(){ - if(alfrescoUrl==null || alfrescoUrl.isEmpty()){ - if(this.alfrescoHost.compareToIgnoreCase(LOCAL_HOST)==0 || this.alfrescoHost.compareToIgnoreCase(LOCAL_HOST_IP)==0){ + if(alfrescoUrl==null || alfrescoUrl.isEmpty() || alfrescoPort > 0) { + if(this.alfrescoHost.compareToIgnoreCase(LOCAL_HOST)==0 || this.alfrescoHost.compareToIgnoreCase(LOCAL_HOST_IP)==0){ alfrescoUrl = this.alfrescoProtocol + "://" + this.alfrescoHost + ":" + alfrescoPort; } else{ diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/HtmlConverterPost.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/HtmlConverterPost.java index 99c6112f..5894ac9e 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/HtmlConverterPost.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/HtmlConverterPost.java @@ -7,7 +7,6 @@ import gov.nasa.jpl.view_repo.util.EmsNodeUtil; import gov.nasa.jpl.view_repo.util.EmsScriptNode; import gov.nasa.jpl.view_repo.util.JsonUtil; -import gov.nasa.jpl.view_repo.util.NodeUtil; import gov.nasa.jpl.view_repo.util.Sjm; import gov.nasa.jpl.view_repo.util.LogUtil; @@ -63,7 +62,6 @@ public HtmlConverterPost(Repository repositoryHelper, ServiceRegistry registry) Map model = new HashMap<>(); - HtmlConverterPost instance = new HtmlConverterPost(repository, services); JsonObject postJson = null; JsonObject result = new JsonObject(); try { @@ -100,7 +98,6 @@ public HtmlConverterPost(Repository repositoryHelper, ServiceRegistry registry) logger.error(String.format("%s", LogUtil.getStackTrace(e))); } - appendResponseStatusInfo(instance); status.setCode(responseStatus.getCode()); if (postJson == null) { @@ -132,7 +129,7 @@ private void createDoc(JsonObject postJson, String filename, String siteName, St pandocConverter.convert(JsonUtil.getOptString(postJson, "body"), JsonUtil.getOptString(postJson, "css")); String artifactId = postJson.get(Sjm.NAME).getAsString().replaceAll("[^a-zA-Z0-9.-]", "_") + System.currentTimeMillis() + format; - EmsScriptNode artifact = NodeUtil.updateOrCreateArtifact(artifactId, filePath, format, siteName, projectId, refId); + EmsScriptNode artifact = EmsScriptNode.updateOrCreateArtifact(artifactId, filePath, format, siteName, projectId, refId); sendEmail(artifact, format); if (artifact == null) { diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/MmsVersion.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/MmsVersion.java index 97cdf6b2..abb27448 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/MmsVersion.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/MmsVersion.java @@ -3,6 +3,7 @@ import java.util.HashMap; import java.util.Map; +import gov.nasa.jpl.view_repo.util.EmsNodeUtil; import org.alfresco.repo.model.Repository; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.service.ServiceRegistry; @@ -47,13 +48,11 @@ protected Map executeImplImpl(WebScriptRequest req, Status statu Map model = new HashMap<>(); - JsonObject mmsVersion; - if (logger.isDebugEnabled()) { logger.debug("Checking MMS Versions"); } - - mmsVersion = getMMSversion(); + JsonObject mmsVersion = new JsonObject(); + mmsVersion.addProperty("mmsVersion", EmsNodeUtil.getMMSversion(services)); if (prettyPrint) { Gson gson = new GsonBuilder().setPrettyPrinting().create(); model.put(Sjm.RES, gson.toJson(mmsVersion)); diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/ModelDelete.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/ModelDelete.java index 4806da9c..40cd2f59 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/ModelDelete.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/ModelDelete.java @@ -57,7 +57,7 @@ public ModelDelete(Repository repositoryHelper, ServiceRegistry registry) { JsonObject result = null; try { - result = handleRequest(req, status, user); + result = handleRequest(req, user); if (result != null) { model.put(Sjm.RES, result); } else { @@ -73,7 +73,7 @@ public ModelDelete(Repository repositoryHelper, ServiceRegistry registry) { return model; } - protected JsonObject handleRequest(WebScriptRequest req, final Status status, String user) throws IOException { + protected JsonObject handleRequest(WebScriptRequest req, String user) throws IOException { JsonObject result = new JsonObject(); String date = TimeUtils.toTimestamp(new Date().getTime()); diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/ModelGet.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/ModelGet.java index c1ce3018..a3c877d5 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/ModelGet.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/ModelGet.java @@ -26,8 +26,12 @@ package gov.nasa.jpl.view_repo.webscripts; +import com.google.gson.JsonElement; +import com.google.gson.JsonParseException; +import gov.nasa.jpl.mbee.util.TimeUtils; import java.io.IOException; -import java.sql.SQLException; +import java.text.ParseException; +import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -51,7 +55,6 @@ import com.google.gson.JsonObject; import gov.nasa.jpl.mbee.util.Timer; -import gov.nasa.jpl.mbee.util.Utils; /** * Descriptor in /view-repo/src/main/amp/config/alfresco/extension/templates/webscripts @@ -63,8 +66,11 @@ public class ModelGet extends AbstractJavaWebScript { static Logger logger = Logger.getLogger(ModelGet.class); - private static final String ELEMENTID = "elementId"; - private static final String COMMITID = "commitId"; + protected static final String ELEMENTID = "elementId"; + protected static final String ARTIFACTID = "artifactId"; + + protected Set elementsToFind = new HashSet<>(); + protected JsonArray deletedElementsCache = new JsonArray(); public ModelGet() { super(); @@ -75,6 +81,10 @@ public ModelGet(Repository repositoryHelper, ServiceRegistry registry) { } @Override protected boolean validateRequest(WebScriptRequest req, Status status) { + // get timestamp if specified + String timestamp = req.getParameter("timestamp"); + Date dateTime = TimeUtils.dateFromTimestamp(timestamp); + String refId = getRefId(req); String projectId = getProjectId(req); EmsNodeUtil emsNodeUtil = new EmsNodeUtil(projectId, refId); @@ -82,7 +92,8 @@ public ModelGet(Repository repositoryHelper, ServiceRegistry registry) { if (refId != null && refId.equalsIgnoreCase(NO_WORKSPACE_ID)) { return true; } else if (refId != null && !emsNodeUtil.refExists(refId)) { - log(Level.ERROR, HttpServletResponse.SC_NOT_FOUND, "Reference with id, %s not found", refId); + log(Level.ERROR, HttpServletResponse.SC_NOT_FOUND, "Reference with id, %s not found", + refId + (dateTime == null ? "" : " at " + dateTime)); return false; } return true; @@ -98,161 +109,189 @@ public ModelGet(Repository repositoryHelper, ServiceRegistry registry) { @Override protected Map executeImplImpl(WebScriptRequest req, Status status, Cache cache) { String user = AuthenticationUtil.getFullyAuthenticatedUser(); - if (logger.isDebugEnabled()) { printHeader(user, logger, req); } else { printHeader(user, logger, req, true); } - Timer timer = new Timer(); - Map model; - - String[] accepts = req.getHeaderValues("Accept"); - String accept = (accepts != null && accepts.length != 0) ? accepts[0] : ""; - - if (logger.isDebugEnabled()) { - logger.debug(String.format("Accept: %s", accept)); + Map model = new HashMap<>(); + try { + if (validateRequest(req, status)) { + model = getModel(req); + } + } catch (IllegalStateException e) { + log(Level.ERROR, HttpServletResponse.SC_BAD_REQUEST, "unable to get JSON object from request", e); + } catch (JsonParseException e) { + log(Level.ERROR, HttpServletResponse.SC_BAD_REQUEST, "Malformed JSON request", e); + } catch (Exception e) { + logger.error(String.format("%s", LogUtil.getStackTrace(e))); } - - model = handleElementGet(req, status, accept); - + if (model.isEmpty()) { + model.put(Sjm.RES, createResponseJson()); + } + status.setCode(responseStatus.getCode()); printFooter(user, logger, timer); - return model; } - protected Map handleElementGet(WebScriptRequest req, Status status, String accept) { + protected Map getModel(WebScriptRequest req) throws IOException { + Long depth = getDepthFromRequest(req); + JsonObject result = handleRequest(req, depth, Sjm.ELEMENTS); + return finish(req, result, true, Sjm.ELEMENTS); + } - Map model = new HashMap<>(); + protected Map finish(WebScriptRequest req, JsonObject result, boolean single, String type) { + Map> errors = new HashMap<>(); + JsonArray elementsJson = JsonUtil.getOptArray(result, type); JsonObject top = new JsonObject(); - - if (validateRequest(req, status)) { - boolean isCommit = req.getParameter(COMMITID) != null && !req.getParameter(COMMITID).isEmpty(); - try { - if (isCommit) { - JsonArray commitJsonToArray = new JsonArray(); - JsonObject commitJson = handleCommitRequest(req); - commitJsonToArray.add(commitJson); - if (commitJson.size() == 0) { - log(Level.ERROR, HttpServletResponse.SC_NOT_FOUND, "No elements found."); - } - if (commitJson.size() > 0) { - top.add(Sjm.ELEMENTS, filterByPermission(commitJsonToArray, req)); - } - if (top.has(Sjm.ELEMENTS) && top.get(Sjm.ELEMENTS).getAsJsonArray().size() < 1) { - log(Level.ERROR, HttpServletResponse.SC_FORBIDDEN, "Permission denied."); - } - } else { - JsonArray elementsJson = handleRequest(req); - if (elementsJson.size() == 0) { - log(Level.ERROR, HttpServletResponse.SC_NOT_FOUND, "No elements found."); - } - if (elementsJson.size() > 0) { - top.add(Sjm.ELEMENTS, filterByPermission(elementsJson, req)); - } - if (top.has(Sjm.ELEMENTS) && top.get(Sjm.ELEMENTS).getAsJsonArray().size() < 1) { - log(Level.ERROR, HttpServletResponse.SC_FORBIDDEN, "Permission denied."); - } + JsonArray got = filterByPermission(elementsJson, req); + if (elementsJson.size() > 0) { + top.add(type, got); + if (got.size() < 1) { + responseStatus.setCode(HttpServletResponse.SC_FORBIDDEN); + } + } else if (!single) { + top.add(type, got); + } + if (deletedElementsCache.size() > 0) { + JsonArray deleted = filterByPermission(deletedElementsCache, req); + if (deleted.size() > 0) { + Set deletedSet = new HashSet<>(); + for (int i = 0; i < deleted.size(); i++) { + deletedSet.add(deleted.get(i).getAsJsonObject().get(Sjm.SYSMLID).getAsString()); + } + elementsToFind.removeAll(deletedSet); + errors.put(Sjm.DELETED, deletedSet); + top.add(Sjm.DELETED, deleted); + if (single) { + responseStatus.setCode(HttpServletResponse.SC_GONE); } - if (!Utils.isNullOrEmpty(response.toString())) - top.addProperty("message", response.toString()); - } catch (Exception e) { - log(Level.ERROR, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Internal error", e); } + } + if (!elementsToFind.isEmpty()) { + errors.put(Sjm.FAILED, elementsToFind); + if (single) { + responseStatus.setCode(HttpServletResponse.SC_NOT_FOUND); + } + } - status.setCode(responseStatus.getCode()); + JsonArray errorMessages = parseErrors(errors); + if (errorMessages.size() > 0) { + top.add("messages", errorMessages); } - if (prettyPrint || accept.contains("webp")) { - Gson gson = new GsonBuilder().setPrettyPrinting().create(); + + String[] accepts = req.getHeaderValues("Accept"); + String accept = (accepts != null && accepts.length != 0) ? accepts[0] : ""; + + Map model = new HashMap<>(); + if (prettyPrint || accept.contains("html")) { + Gson gson = new GsonBuilder().setPrettyPrinting().create(); model.put(Sjm.RES, gson.toJson(top)); } else { model.put(Sjm.RES, top); } - return model; } /** - * Wrapper for handling a request and getting the appropriate JSONArray of elements + * Wrapper for handling a request and getting the appropriate JSONArray of + * elements * - * @param req WebScriptRequest object - * @return JSONArray of elements + * @param req + * @return + * @throws IOException */ - private JsonArray handleRequest(WebScriptRequest req) { - // REVIEW -- Why check for errors here if validate has already been - // called? Is the error checking code different? Why? - try { - String modelId = req.getServiceMatch().getTemplateVars().get(ELEMENTID); - String projectId = getProjectId(req); - String refId = getRefId(req); - Long depth = getDepthFromRequest(req); - boolean extended = Boolean.parseBoolean(req.getParameter("extended")); - - EmsNodeUtil emsNodeUtil = new EmsNodeUtil(projectId, refId); - if (null == modelId) { - log(Level.ERROR, HttpServletResponse.SC_NOT_FOUND, "Could not find element %s", modelId); - return new JsonArray(); - } else if (emsNodeUtil.isDeleted(modelId)) { - log(Level.ERROR, HttpServletResponse.SC_GONE, "Element %s is deleted", modelId); - return new JsonArray(); - } - - JsonObject mountsJson = new JsonObject(); - mountsJson.addProperty(Sjm.SYSMLID, projectId); - mountsJson.addProperty(Sjm.REFID, refId); + protected JsonObject handleRequest(WebScriptRequest req, final Long maxDepth, String type) throws IOException { + JsonObject requestJson = JsonUtil.buildFromString(req.getContent().getContent()); + String templateVar = type.equals(Sjm.ELEMENTS) ? ELEMENTID : ARTIFACTID; - JsonArray result = new JsonArray(); - Set elementsToFind = new HashSet<>(); - elementsToFind.add(modelId); - EmsNodeUtil.handleMountSearch(mountsJson, extended, false, depth, elementsToFind, result); - return result; - } catch (Exception e) { - logger.error(String.format("%s", LogUtil.getStackTrace(e))); - } - return new JsonArray(); - } - - private JsonObject handleCommitRequest(WebScriptRequest req) { - // getElement at commit - String projectId = getProjectId(req); String refId = getRefId(req); - Long depth = getDepthFromRequest(req); + String projectId = getProjectId(req); + String commitId = req.getParameter(Sjm.COMMITID.replace("_", "")); + String elementId = req.getServiceMatch().getTemplateVars().get(templateVar); EmsNodeUtil emsNodeUtil = new EmsNodeUtil(projectId, refId); - - String elementId = req.getServiceMatch().getTemplateVars().get(ELEMENTID); - String commitId = req.getParameter(COMMITID); - - if (emsNodeUtil.getById(elementId) != null) { - JsonObject element = emsNodeUtil.getElementByElementAndCommitId(commitId, elementId); - if (element == null || element.size() == 0) { - return emsNodeUtil.getElementAtCommit(elementId, commitId); - } else { - return element; + JsonArray elementsToFindJson = new JsonArray(); + + if (elementId != null) { + if (commitId != null) { + JsonObject element = emsNodeUtil.getByCommitId(elementId, commitId, type); + if (element != null && element.size() > 0) { + JsonObject result = new JsonObject(); + JsonArray elements = new JsonArray(); + elements.add(element); + result.add(type, elements); + return result; + } } + JsonObject element = new JsonObject(); + element.addProperty(Sjm.SYSMLID, elementId); + elementsToFindJson.add(element); + } else if (requestJson.has(type)) { + elementsToFindJson = requestJson.get(type).getAsJsonArray(); + } else { + return new JsonObject(); } + boolean extended = Boolean.parseBoolean(req.getParameter("extended")); + JsonObject mountsJson = new JsonObject(); mountsJson.addProperty(Sjm.SYSMLID, projectId); mountsJson.addProperty(Sjm.REFID, refId); - // convert commitId to timestamp - String commit = emsNodeUtil.getCommitObject(commitId).get(Sjm.CREATED).getAsString(); - JsonArray result = new JsonArray(); - Set elementsToFind = new HashSet<>(); - elementsToFind.add(elementId); - try { - EmsNodeUtil.handleMountSearch(mountsJson, false, false, depth, elementsToFind, result, commit, "elements"); - if (result.size() > 0) { - return JsonUtil.getOptObject(result, 0); + JsonArray found = new JsonArray(); + JsonObject result = new JsonObject(); + + for (int i = 0; i < elementsToFindJson.size(); i++) { + try { + String currentId = elementsToFindJson.get(i).getAsJsonObject().get(Sjm.SYSMLID).getAsString(); + elementsToFind.add(currentId); + } catch (Exception e) { + // Intentionally empty } - } catch (Exception e) { - log(Level.ERROR, HttpServletResponse.SC_NOT_FOUND, "Could not find element %s at commit %s", - elementId, commitId); - logger.error(String.format("%s", LogUtil.getStackTrace(e))); } - return new JsonObject(); + + JsonObject commitObject = emsNodeUtil.getCommitObject(commitId); + + String timestamp = commitObject != null && commitObject.has(Sjm.CREATED) ? + commitObject.get(Sjm.CREATED).getAsString() : + null; + + if (commitId != null && commitObject == null) { + elementsToFind = new HashSet<>(); + log(Level.ERROR, HttpServletResponse.SC_BAD_REQUEST, "Invalid commit id"); + } else { + EmsNodeUtil.handleMountSearch(mountsJson, extended, false, maxDepth, elementsToFind, found, timestamp, type); + } + + if (!elementsToFind.isEmpty()) { + JsonArray deletedElementsJson; + if (type.equals(Sjm.ELEMENTS)) { + deletedElementsJson = emsNodeUtil.getNodesBySysmlids(elementsToFind, false, true); + } else { + deletedElementsJson = emsNodeUtil.getArtifactsBySysmlids(elementsToFind, true); + } + if (timestamp != null) { + for (JsonElement check : deletedElementsJson) { + try { + Date created = EmsNodeUtil.df.parse(JsonUtil.getOptString((JsonObject) check, Sjm.CREATED)); + Date commitDate = EmsNodeUtil.df.parse(timestamp); + if (!created.after(commitDate)) { + this.deletedElementsCache.add(check); + } + } catch (ParseException pe) { + if (logger.isDebugEnabled()) { + logger.debug(pe); + } + } + } + } else { + this.deletedElementsCache = deletedElementsJson; + } + } + result.add(type, found); + return result; } /** @@ -262,34 +301,27 @@ private JsonObject handleCommitRequest(WebScriptRequest req) { * @return Depth < 0 is infinite recurse, depth = 0 is just the element (if no request * parameter) */ - public Long getDepthFromRequest(WebScriptRequest req) { - Long depth = null; + Long getDepthFromRequest(WebScriptRequest req) { + long depth = 0L; String depthParam = req.getParameter("depth"); if (depthParam != null) { - try { - depth = Long.parseLong(depthParam); - if (depth < 0) { - depth = 100000L; - } - } catch (NumberFormatException nfe) { - // don't do any recursion, ignore the depth - log(Level.WARN, HttpServletResponse.SC_BAD_REQUEST, "Bad depth specified, returning depth 0"); - } + depth = parseDepth(depthParam); } - // recurse default is false - boolean recurse = getBooleanArg(req, "recurse", false); - // for backwards compatiblity convert recurse to infinite depth (this - // overrides - // any depth setting) - if (recurse) { - depth = 100000L; - } + return getBooleanArg(req, "recurse", false) ? 100000L : depth; + } - if (depth == null) { - depth = 0L; + Long parseDepth(String depthParam) { + long depth = 0L; + try { + depth = Long.parseLong(depthParam); + if (depth < 0) { + depth = 100000L; + } + } catch (NumberFormatException nfe) { + // don't do any recursion, ignore the depth + log(Level.WARN, HttpServletResponse.SC_BAD_REQUEST, "Bad depth specified, returning depth 0"); } - return depth; } } diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/ModelPost.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/ModelPost.java index 3ef0d5f3..8669fe4a 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/ModelPost.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/ModelPost.java @@ -104,32 +104,41 @@ protected Map executeImplImpl(final WebScriptRequest req, final Timer timer = new Timer(); - Map result; - String contentType = req.getContentType() == null ? "" : req.getContentType().toLowerCase(); + Map result = new HashMap(); + JsonObject postJson = new JsonObject(); - result = handleElementPost(req, status, user, contentType); + try { + postJson = JsonUtil.buildFromStream(req.getContent().getInputStream()).getAsJsonObject(); + } catch (IllegalStateException e) { + log(Level.ERROR, HttpServletResponse.SC_BAD_REQUEST, "Unable to parse JSON request"); + result.put(Sjm.RES, createResponseJson()); + } + + if (!postJson.has(Sjm.RES)){ + result = handleElementPost(req, postJson, status, user); + } printFooter(user, logger, timer); return result; } - protected Map handleElementPost(final WebScriptRequest req, final Status status, String user, String contentType) { + protected Map handleElementPost(final WebScriptRequest req, JsonObject postJson, + final Status status, String user) { JsonObject newElementsObject = new JsonObject(); JsonObject results; - boolean extended = Boolean.parseBoolean(req.getParameter("extended")); - boolean withChildViews = Boolean.parseBoolean(req.getParameter("childviews")); - boolean overwriteJson = Boolean.parseBoolean(req.getParameter("overwrite")); + + Map model = new HashMap<>(); String refId = getRefId(req); String projectId = getProjectId(req); - Map model = new HashMap<>(); + boolean extended = Boolean.parseBoolean(req.getParameter("extended")); + boolean withChildViews = Boolean.parseBoolean(req.getParameter("childviews")); + boolean overwriteJson = Boolean.parseBoolean(req.getParameter("overwrite")); EmsNodeUtil emsNodeUtil = new EmsNodeUtil(projectId, refId); try { - JsonObject postJson = JsonUtil.buildFromStream(req.getContent().getInputStream()).getAsJsonObject(); - if (logger.isDebugEnabled()) { logger.debug(String.format("Post Data: '%s'", postJson)); } @@ -140,9 +149,8 @@ protected Map handleElementPost(final WebScriptRequest req, fina String comment = JsonUtil.getOptString(postJson, Sjm.COMMENT); results = emsNodeUtil - .processPostJson(postJson.get(Sjm.ELEMENTS).getAsJsonArray(), - user, oldElasticIds, overwriteJson, - this.requestSourceApplication, comment, Sjm.ELEMENT); + .processPostJson(postJson.get(Sjm.ELEMENTS).getAsJsonArray(), user, oldElasticIds, overwriteJson, + this.requestSourceApplication, comment, Sjm.ELEMENT); String commitId = results.get("commit").getAsJsonObject().get(Sjm.ELASTICID).getAsString(); @@ -165,15 +173,16 @@ protected Map handleElementPost(final WebScriptRequest req, fina Map commitObject = emsNodeUtil.getGuidAndTimestampFromElasticId(commitId); if (withChildViews) { - JsonArray array = results.get(NEWELEMENTS).getAsJsonArray(); + JsonArray array = results.get(NEWELEMENTS).getAsJsonArray(); for (int i = 0; i < array.size(); i++) { - array.set(i, emsNodeUtil.addChildViews(array.get(i).getAsJsonObject())); + array.set(i, emsNodeUtil.addChildViews(array.get(i).getAsJsonObject())); } } newElementsObject.add(Sjm.ELEMENTS, extended ? - emsNodeUtil.addExtendedInformation(filterByPermission(results.get(NEWELEMENTS).getAsJsonArray(), req)) - : filterByPermission(results.get(NEWELEMENTS).getAsJsonArray(), req)); + emsNodeUtil + .addExtendedInformation(filterByPermission(results.get(NEWELEMENTS).getAsJsonArray(), req)) : + filterByPermission(results.get(NEWELEMENTS).getAsJsonArray(), req)); if (results.has("rejectedElements")) { newElementsObject.add(Sjm.REJECTED, results.get("rejectedElements")); } @@ -182,7 +191,7 @@ protected Map handleElementPost(final WebScriptRequest req, fina newElementsObject.addProperty(Sjm.CREATOR, user); if (prettyPrint) { - Gson gson = new GsonBuilder().setPrettyPrinting().create(); + Gson gson = new GsonBuilder().setPrettyPrinting().create(); model.put(Sjm.RES, gson.toJson(newElementsObject)); } else { model.put(Sjm.RES, newElementsObject); diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/ModelSearch.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/ModelSearch.java index 922e6412..726f3473 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/ModelSearch.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/ModelSearch.java @@ -90,21 +90,17 @@ public ModelSearch(Repository repositoryHelper, ServiceRegistry registry) { Map model = new HashMap<>(); - try { - boolean noprocess = Boolean.parseBoolean(req.getParameter("literal")); JsonObject json = JsonUtil.buildFromString(req.getContent().getContent()); - if (noprocess) { - ElasticHelper eh = new ElasticHelper(); - JsonObject result = eh.searchLiteral(json); - model.put(Sjm.RES, result.toString()); - } else { + if (!ElasticHelper.containsScript(json)) { JsonObject top = executeSearchRequest(req, json); if (!Utils.isNullOrEmpty(response.toString())) { top.addProperty("message", response.toString()); } model.put(Sjm.RES, top); + } else { + log(Level.ERROR, HttpServletResponse.SC_BAD_REQUEST, "Request contained script"); } } catch (IllegalStateException e) { log(Level.ERROR, HttpServletResponse.SC_BAD_REQUEST, "unable to get JSON object from request", e); @@ -150,9 +146,11 @@ private JsonObject executeSearchRequest(WebScriptRequest req, JsonObject json) { } else if (e.get(Sjm.TYPE).getAsString().equals("Slot")) { ownere = getGrandOwnerJson(eprojId, erefId, e.get(Sjm.OWNERID).getAsString()); } - if (ownere != null && ownere.has(Sjm.SYSMLID) && !found.contains(ownere.get(Sjm.SYSMLID).getAsString())) { + if (ownere != null && ownere.has(Sjm.SYSMLID) && !found + .contains(ownere.get(Sjm.SYSMLID).getAsString())) { finalResult.add(ownere); - String key = ownere.get(Sjm.PROJECTID).getAsString() + " " + ownere.get(Sjm.REFID).getAsString(); + String key = + ownere.get(Sjm.PROJECTID).getAsString() + " " + ownere.get(Sjm.REFID).getAsString(); if (!bins.containsKey(key)) { bins.put(key, new JsonArray()); } @@ -162,13 +160,13 @@ private JsonObject executeSearchRequest(WebScriptRequest req, JsonObject json) { } finalResult.add(e); found.add(e.get(Sjm.SYSMLID).getAsString()); - String key = e.get(Sjm.PROJECTID).getAsString() + " " + e.get(Sjm.REFID).getAsString(); + String key = e.get(Sjm.PROJECTID).getAsString() + " " + e.get(Sjm.REFID).getAsString(); if (!bins.containsKey(key)) { bins.put(key, new JsonArray()); } bins.get(key).add(e); } - for (Entry entry: bins.entrySet()) { + for (Entry entry : bins.entrySet()) { String[] split = entry.getKey().split(" "); projectId = split[0]; refId = split[1]; diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/ModelsGet.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/ModelsGet.java index 9294c466..966be84d 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/ModelsGet.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/ModelsGet.java @@ -30,32 +30,19 @@ package gov.nasa.jpl.view_repo.webscripts; import java.io.IOException; -import java.sql.SQLException; import java.util.*; -import javax.servlet.http.HttpServletResponse; - import org.alfresco.repo.model.Repository; -import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.service.ServiceRegistry; -import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.springframework.extensions.webscripts.Cache; import org.springframework.extensions.webscripts.Status; import org.springframework.extensions.webscripts.WebScriptRequest; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; - -import gov.nasa.jpl.mbee.util.TimeUtils; -import gov.nasa.jpl.mbee.util.Timer; import gov.nasa.jpl.view_repo.util.EmsNodeUtil; -import gov.nasa.jpl.view_repo.util.JsonUtil; -import gov.nasa.jpl.view_repo.util.LogUtil; import gov.nasa.jpl.view_repo.util.Sjm; /** @@ -72,25 +59,6 @@ public ModelsGet(Repository repositoryHelper, ServiceRegistry registry) { super(repositoryHelper, registry); } - @Override protected boolean validateRequest(WebScriptRequest req, Status status) { - // get timestamp if specified - String timestamp = req.getParameter("timestamp"); - Date dateTime = TimeUtils.dateFromTimestamp(timestamp); - - String refId = getRefId(req); - String projectId = getProjectId(req); - EmsNodeUtil emsNodeUtil = new EmsNodeUtil(projectId, refId); - if (refId != null && refId.equalsIgnoreCase(NO_WORKSPACE_ID)) { - return true; - } else if (refId != null && !emsNodeUtil.refExists(refId)) { - log(Level.ERROR, HttpServletResponse.SC_NOT_FOUND, "Reference with id, %s not found", - refId + (dateTime == null ? "" : " at " + dateTime)); - return false; - } - - return true; - } - /** * Entry point */ @@ -99,135 +67,11 @@ public ModelsGet(Repository repositoryHelper, ServiceRegistry registry) { return instance.executeImplImpl(req, status, cache); } - @Override protected Map executeImplImpl(WebScriptRequest req, Status status, Cache cache) { - String user = AuthenticationUtil.getFullyAuthenticatedUser(); - - if (logger.isDebugEnabled()) { - printHeader(user, logger, req); - } else { - printHeader(user, logger, req, true); - } - - Timer timer = new Timer(); - - String[] accepts = req.getHeaderValues("Accept"); - String accept = (accepts != null && accepts.length != 0) ? accepts[0] : ""; - - Map model = new HashMap<>(); - JsonArray elementsJson = new JsonArray(); - JsonObject result = new JsonObject(); - - try { - - if (validateRequest(req, status)) { - try { - Long depth = getDepthFromRequest(req); - result = - (!req.getContent().getContent().isEmpty()) ? handleRequest(req, depth) : getAllElements(req); - elementsJson = JsonUtil.getOptArray(result, Sjm.ELEMENTS); - } catch (IllegalStateException e) { - log(Level.ERROR, HttpServletResponse.SC_BAD_REQUEST, "unable to get JSON object from request", e); - } catch (JsonParseException e) { - log(Level.ERROR, HttpServletResponse.SC_BAD_REQUEST, "Malformed JSON request", e); - } - } - - JsonObject top = new JsonObject(); - if (elementsJson.size() > 0) { - JsonArray elements = filterByPermission(elementsJson, req); - if (elements.size() == 0) { - log(Level.ERROR, HttpServletResponse.SC_FORBIDDEN, "Permission denied."); - } - top.add(Sjm.ELEMENTS, elements); - } else { - log(Level.INFO, HttpServletResponse.SC_OK, "No elements found"); - top.add(Sjm.ELEMENTS, new JsonArray()); - } - - JsonArray errorMessages = new JsonArray(); - for (String level : Sjm.ERRORLEVELS) { - JsonArray errors = JsonUtil.getOptArray(result, level); - if (errors.size() > 0) { - for (int i = 0; i < errors.size(); i++) { - JsonObject errorPayload = new JsonObject(); - errorPayload.addProperty("code", HttpServletResponse.SC_NOT_FOUND); - errorPayload.add(Sjm.SYSMLID, errors.get(i)); - errorPayload.addProperty("message", - String.format("Element %s was not found", errors.get(i).getAsString())); - errorPayload.addProperty("severity", level); - errorMessages.add(errorPayload); - } - } - } - - if (errorMessages.size() > 0) { - top.add("messages", errorMessages); - } - - if (prettyPrint || accept.contains("webp")) { - Gson gson = new GsonBuilder().setPrettyPrinting().create(); - model.put(Sjm.RES, gson.toJson(top)); - } else { - model.put(Sjm.RES, top); - } - - } catch (Exception e) { - logger.error(String.format("%s", LogUtil.getStackTrace(e))); - } - - status.setCode(responseStatus.getCode()); - - printFooter(user, logger, timer); - - return model; - } - - /** - * Wrapper for handling a request and getting the appropriate JSONArray of - * elements - * - * @param req - * @return - * @throws IOException - */ - private JsonObject handleRequest(WebScriptRequest req, final Long maxDepth) throws IOException { - JsonObject requestJson = JsonUtil.buildFromString(req.getContent().getContent()); - if (requestJson.has(Sjm.ELEMENTS)) { - JsonArray elementsToFindJson = requestJson.get(Sjm.ELEMENTS).getAsJsonArray(); - - String refId = getRefId(req); - String projectId = getProjectId(req); - String commitId = req.getParameter(Sjm.COMMITID.replace("_", "")); - - boolean extended = Boolean.parseBoolean(req.getParameter("extended")); - - JsonObject mountsJson = new JsonObject(); - mountsJson.addProperty(Sjm.SYSMLID, projectId); - mountsJson.addProperty(Sjm.REFID, refId); - - JsonArray found = new JsonArray(); - JsonObject result = new JsonObject(); - - Set uniqueElements = new HashSet<>(); - for (int i = 0; i < elementsToFindJson.size(); i++) { - uniqueElements.add(elementsToFindJson.get(i).getAsJsonObject().get(Sjm.SYSMLID).getAsString()); - } - - EmsNodeUtil emsNodeUtil = new EmsNodeUtil(projectId, refId); - JsonObject commitObject = emsNodeUtil.getCommitObject(commitId); - - String timestamp = commitObject != null && commitObject.has(Sjm.CREATED) ? - commitObject.get(Sjm.CREATED).getAsString() : - null; - - EmsNodeUtil - .handleMountSearch(mountsJson, extended, false, maxDepth, uniqueElements, found, timestamp, null); - result.add(Sjm.ELEMENTS, found); - JsonUtil.addStringSet(result, Sjm.WARN, uniqueElements); - return result; - } else { - return new JsonObject(); - } + @Override protected Map getModel(WebScriptRequest req) throws IOException { + Long depth = getDepthFromRequest(req); + JsonObject result = + (!req.getContent().getContent().isEmpty()) ? handleRequest(req, depth, Sjm.ELEMENTS) : getAllElements(req); + return finish(req, result, false, Sjm.ELEMENTS); } /** @@ -253,7 +97,7 @@ private JsonObject getAllElements(WebScriptRequest req) { JsonArray elements = emsNodeUtil.getJsonByElasticIds(elementsToFindJson, false); result.add(Sjm.ELEMENTS, elements); } else { - result = emsNodeUtil.getModelAtCommit(commitId); + result = emsNodeUtil.getModelAtCommit(commitId); //this now gets all artifacts too } if (extended && commitId == null) { extendedElements diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/MovePost.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/MovePost.java new file mode 100644 index 00000000..adb7607c --- /dev/null +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/MovePost.java @@ -0,0 +1,131 @@ +/******************************************************************************* + * Copyright (c) <2013>, California Institute of Technology ("Caltech"). + * + * U.S. Government sponsorship acknowledged. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are permitted + * provided that the following conditions are met: + * + * - Redistributions of source code must retain the above copyright notice, this list of conditions + * and the following disclaimer. - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. - Neither the name of Caltech nor its operating + * division, the Jet Propulsion Laboratory, nor the names of its contributors may be used to endorse + * or promote products derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY + * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +package gov.nasa.jpl.view_repo.webscripts; + +import java.util.*; +import javax.servlet.http.HttpServletResponse; + +import gov.nasa.jpl.view_repo.util.EmsNodeUtil; +import gov.nasa.jpl.view_repo.util.LogUtil; +import gov.nasa.jpl.view_repo.util.Sjm; +import gov.nasa.jpl.view_repo.util.JsonUtil; + +import org.alfresco.repo.model.Repository; +import org.alfresco.repo.security.authentication.AuthenticationUtil; +import org.alfresco.service.ServiceRegistry; +import org.apache.log4j.Level; +import org.json.JSONObject; +import org.springframework.extensions.webscripts.Cache; +import org.springframework.extensions.webscripts.Status; +import org.springframework.extensions.webscripts.WebScriptRequest; + +import com.google.gson.JsonObject; + +import gov.nasa.jpl.mbee.util.Timer; + +public class MovePost extends ModelPost { + + private final String NEWELEMENTS = "newElements"; + + public MovePost() { + super(); + } + + public MovePost(Repository repositoryHelper, ServiceRegistry registry) { + super(repositoryHelper, registry); + } + + /** + * Entry point + */ + @Override protected Map executeImpl(WebScriptRequest req, Status status, Cache cache) { + + MovePost instance = new MovePost(repository, services); + instance.setServices(getServices()); + + return instance.executeImplImpl(req, status, cache); + } + + @Override + protected Map executeImplImpl(final WebScriptRequest req, final Status status, Cache cache) { + String user = AuthenticationUtil.getFullyAuthenticatedUser(); + + printHeader(user, logger, req, true); + + Timer timer = new Timer(); + + Map result = new HashMap<>(); + JsonObject moved = new JsonObject(); + + // call move logic + try { + moved = createDeltaForMove(req); + } catch (IllegalStateException e) { + log(Level.ERROR, HttpServletResponse.SC_BAD_REQUEST, "Unable to parse JSON request"); + result.put(Sjm.RES, createResponseJson()); + } catch (Exception e) { + log(Level.ERROR, HttpServletResponse.SC_BAD_REQUEST, "Cannot process move request"); + logger.error(String.format("%s", LogUtil.getStackTrace(e))); + result.put(Sjm.RES, createResponseJson()); + } + if (moved.has(Sjm.ELEMENTS)) { + result = handleElementPost(req, moved, status, user); + } + + status.setCode(responseStatus.getCode()); + + printFooter(user, logger, timer); + + return result; + } + + protected JsonObject createDeltaForMove(final WebScriptRequest req) { + String refId = getRefId(req); + String projectId = getProjectId(req); + + EmsNodeUtil emsNodeUtil = new EmsNodeUtil(projectId, refId); + + JsonObject postJson = JsonUtil.buildFromStream(req.getContent().getInputStream()).getAsJsonObject(); + JsonObject moved = emsNodeUtil.processMove(postJson.get(Sjm.MOVES).getAsJsonArray()); + String comment = JsonUtil.getOptString(postJson, Sjm.COMMENT); + String src = JsonUtil.getOptString(postJson, Sjm.SOURCE); + moved.addProperty(Sjm.COMMENT, comment); + moved.addProperty(Sjm.SOURCE, src); + + return moved; + } + + + + @Override protected boolean validateRequest(WebScriptRequest req, Status status) { + String elementId = req.getServiceMatch().getTemplateVars().get("elementid"); + if (elementId != null && !checkRequestVariable(elementId, "elementid")) { + return false; + } + + return checkRequestContent(req); + } +} diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/OrgGet.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/OrgGet.java index bba3f17f..b50a6b93 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/OrgGet.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/OrgGet.java @@ -79,10 +79,7 @@ public OrgGet(Repository repositoryHelper, ServiceRegistry registry) { Timer timer = new Timer(); Map model = new HashMap<>(); - if (checkMmsVersions && compareMmsVersions(req, getResponse(), getResponseStatus())) { - model.put(Sjm.RES, createResponseJson()); - return model; - } + JsonObject json = null; String[] accepts = req.getHeaderValues("Accept"); String accept = (accepts != null && accepts.length != 0) ? accepts[0] : ""; diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/OrgPost.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/OrgPost.java index 6cc41674..6527d6c0 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/OrgPost.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/OrgPost.java @@ -133,7 +133,6 @@ public OrgPost(Repository repositoryHelper, ServiceRegistry registry) { } } else { - EmsScriptNode site = new EmsScriptNode(siteInfo.getNodeRef(), services, response); JsonObject res = CommitUtil.sendOrganizationDelta(orgId, orgName, projJson); if (res != null && !JsonUtil.getOptString(res, Sjm.SYSMLID).isEmpty()) { log(Level.INFO, HttpServletResponse.SC_OK, diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/ProjectDelete.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/ProjectDelete.java index f94ad6e9..cd9fc31c 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/ProjectDelete.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/ProjectDelete.java @@ -3,9 +3,11 @@ import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import javax.servlet.http.HttpServletResponse; import gov.nasa.jpl.view_repo.db.ElasticHelper; @@ -76,7 +78,7 @@ public ProjectDelete(Repository repositoryHelper, ServiceRegistry registry) { deleteProjectSiteFolder(projectId); // Postgres helper to commit elasticids before dropping db - ArrayList commitList = getCommitElasticIDs(projectId); + Set commitList = getCommitElasticIDs(projectId); // Search and delete for all elements in elasticsearch with project id deleteCommitsInElastic(commitList, projectId); @@ -124,8 +126,8 @@ public ProjectDelete(Repository repositoryHelper, ServiceRegistry registry) { * @param projectId * @return CommitElasticIDs */ - protected ArrayList getCommitElasticIDs(String projectId) { - ArrayList commitIds = new ArrayList<>(); + protected Set getCommitElasticIDs(String projectId) { + Set commitIds = new HashSet<>(); logger.debug("Getting Commit Elastic IDs for " + projectId); // Instantiate and configure pgh. @@ -147,12 +149,12 @@ protected ArrayList getCommitElasticIDs(String projectId) { * @param commitIds * @return */ - protected void deleteCommitsInElastic(ArrayList commitIds, String projectId) { + protected void deleteCommitsInElastic(Set commitIds, String projectId) { logger.debug("Deleting commits in Elastic"); try { ElasticHelper elasticHelper = new ElasticHelper(); - elasticHelper.bulkDeleteByType("commit", commitIds, projectId); + elasticHelper.bulkDeleteByType(commitIds, projectId, ElasticHelper.COMMIT); } catch (IOException e) { logger.error(e.getMessage()); } catch (Exception e) { diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/ProjectPost.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/ProjectPost.java index 1b7925ac..99297710 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/ProjectPost.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/ProjectPost.java @@ -27,6 +27,7 @@ package gov.nasa.jpl.view_repo.webscripts; import gov.nasa.jpl.mbee.util.Timer; +import gov.nasa.jpl.view_repo.db.ElasticHelper; import gov.nasa.jpl.view_repo.util.Acm; import gov.nasa.jpl.view_repo.util.CommitUtil; import gov.nasa.jpl.view_repo.util.EmsNodeUtil; @@ -71,8 +72,6 @@ public ProjectPost(Repository repositoryHelper, ServiceRegistry registry) { private static final String REF_PATH = "refs"; private static final String REF_PATH_SEARCH = "/" + REF_PATH; - private static final String JSON_SPECIALIZATION = "specialization"; - private static final String JSON_PROJECT_VERSION = "projectVersion"; /** * Webscript entry point @@ -110,15 +109,17 @@ public ProjectPost(Repository repositoryHelper, ServiceRegistry registry) { orgId = emsNodeUtil.getOrganizationFromProject(projectId); } - SiteInfo siteInfo = services.getSiteService().getSite(orgId); - if (siteInfo != null) { - - CommitUtil.sendProjectDelta(projJson, orgId, user); - - if (projectId != null && !projectId.equals(NO_SITE_ID)) { - responseStatus.setCode(updateOrCreateProject(projJson, projectId, orgId)); + EmsScriptNode siteNode = getSiteNode(orgId); + if (siteNode != null) { + if (siteNode.checkPermissions(PermissionService.WRITE)) { + CommitUtil.sendProjectDelta(projJson, orgId, user); + if (projectId != null && !projectId.equals(NO_SITE_ID)) { + responseStatus.setCode(updateOrCreateProject(projJson, projectId, orgId)); + } else { + responseStatus.setCode(checkNoProject(siteNode)); + } } else { - responseStatus.setCode(updateOrCreateProject(projJson, projectId)); + responseStatus.setCode(HttpServletResponse.SC_FORBIDDEN); } if (responseStatus.getCode() == HttpServletResponse.SC_OK) { @@ -126,7 +127,6 @@ public ProjectPost(Repository repositoryHelper, ServiceRegistry registry) { } else { failure.add(projJson); } - } else { EmsNodeUtil emsNodeUtil = new EmsNodeUtil(projectId, NO_WORKSPACE_ID); // This should not happen, since the Organization should be created before a Project is posted @@ -176,9 +176,7 @@ public ProjectPost(Repository repositoryHelper, ServiceRegistry registry) { return model; } - public int updateOrCreateProject(JsonObject jsonObject, String projectId) { - EmsScriptNode projectNode = getSiteNode(projectId); - + public int checkNoProject(EmsScriptNode projectNode) { if (projectNode == null) { log(Level.ERROR, HttpServletResponse.SC_NOT_FOUND, "Could not find project"); return HttpServletResponse.SC_NOT_FOUND; @@ -212,37 +210,38 @@ public int updateOrCreateProject(JsonObject jsonObject, String projectId, String EmsScriptNode projectContainerNode = site.childByNamePath(projectId); if (projectContainerNode == null) { - projectContainerNode = site.createFolder(projectId, null, null); - projectContainerNode.createOrUpdateProperty(Acm.CM_TITLE, JsonUtil.getOptString(jsonObject, Sjm.NAME)); + projectContainerNode = site.createFolder(projectId, null); + projectContainerNode.setProperty(Acm.CM_TITLE, JsonUtil.getOptString(jsonObject, Sjm.NAME)); log(Level.INFO, HttpServletResponse.SC_OK, "Project folder created.\n"); } EmsScriptNode documentLibrary = site.childByNamePath("documentLibrary"); if (documentLibrary == null) { - documentLibrary = site.createFolder("documentLibrary", null, null); + documentLibrary = site.createFolder("documentLibrary", null); } EmsScriptNode documentProjectContainer = documentLibrary.childByNamePath(projectId); if (documentProjectContainer == null) { - documentProjectContainer = documentLibrary.createFolder(projectId, null, null); - documentProjectContainer.createOrUpdateProperty(Acm.CM_TITLE, JsonUtil.getOptString(jsonObject, Sjm.NAME)); + documentProjectContainer = documentLibrary.createFolder(projectId, null); + documentProjectContainer.setProperty(Acm.CM_TITLE, JsonUtil.getOptString(jsonObject, Sjm.NAME)); } EmsScriptNode refContainerNode = projectContainerNode.childByNamePath(REF_PATH_SEARCH); if (refContainerNode == null) { - refContainerNode = projectContainerNode.createFolder("refs", null, null); + refContainerNode = projectContainerNode.createFolder("refs", null); } EmsScriptNode branch = refContainerNode.childByNamePath(NO_WORKSPACE_ID); if (branch == null) { - branch = refContainerNode.createFolder(NO_WORKSPACE_ID, null, null); + branch = refContainerNode.createFolder(NO_WORKSPACE_ID, null); EmsNodeUtil emsNodeUtil = new EmsNodeUtil(projectId, NO_WORKSPACE_ID); JsonObject masterWs = new JsonObject(); masterWs.addProperty("id", NO_WORKSPACE_ID); masterWs.addProperty("name", NO_WORKSPACE_ID); + masterWs.addProperty("type", "Branch"); // :TODO going to have to check that index doesn't exist if ES doesn't already do this emsNodeUtil.insertProjectIndex(projectId); - String elasticId = emsNodeUtil.insertSingleElastic(masterWs); + String elasticId = emsNodeUtil.insertSingleElastic(masterWs, ElasticHelper.REF); emsNodeUtil.insertRef(NO_WORKSPACE_ID, NO_WORKSPACE_ID, elasticId, false); } diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/SiteGet.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/SiteGet.java index c8a27832..d90cc369 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/SiteGet.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/SiteGet.java @@ -87,12 +87,7 @@ public SiteGet(Repository repositoryHelper, ServiceRegistry registry) { Timer timer = new Timer(); Map model = new HashMap<>(); - if (checkMmsVersions) { - if (compareMmsVersions(req, getResponse(), getResponseStatus())) { - model.put(Sjm.RES, createResponseJson()); - return model; - } - } + JsonObject json = null; try { diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/UserPreferencesGet.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/UserPreferencesGet.java index c34b3943..61e8faf3 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/UserPreferencesGet.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/UserPreferencesGet.java @@ -27,6 +27,7 @@ package gov.nasa.jpl.view_repo.webscripts; import gov.nasa.jpl.mbee.util.Timer; +import gov.nasa.jpl.view_repo.db.ElasticHelper; import gov.nasa.jpl.view_repo.util.*; import org.alfresco.repo.model.Repository; import org.alfresco.repo.security.authentication.AuthenticationUtil; @@ -83,7 +84,7 @@ public UserPreferencesGet(Repository repositoryHelper, ServiceRegistry registry) try { if (validateRequest(req, status)) { EmsNodeUtil emsNodeUtil = new EmsNodeUtil(); - JsonObject res = emsNodeUtil.getProfile(username); + JsonObject res = (new ElasticHelper()).getByElasticId(username, EmsConfig.get("elastic.index.element"), ElasticHelper.PROFILE); if (res != null && res.size() > 0) { response.add(Sjm.PROFILES, res); } else { diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/UserPreferencesPost.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/UserPreferencesPost.java index 228db2e0..6bc95df5 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/UserPreferencesPost.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/UserPreferencesPost.java @@ -27,6 +27,7 @@ package gov.nasa.jpl.view_repo.webscripts; import gov.nasa.jpl.mbee.util.Timer; +import gov.nasa.jpl.view_repo.db.ElasticHelper; import gov.nasa.jpl.view_repo.util.*; import org.alfresco.repo.model.Repository; import org.alfresco.repo.security.authentication.AuthenticationUtil; @@ -87,7 +88,7 @@ public UserPreferencesPost(Repository repositoryHelper, ServiceRegistry registry JsonObject postJson = postJsonTop.get(Sjm.PROFILES).getAsJsonObject(); // creates a new document if one didn't exist, otherwise updates existing document - JsonObject res = CommitUtil.indexProfile(username, postJson, elementIndex); + JsonObject res = (new ElasticHelper()).updateById(username, postJson, elementIndex, ElasticHelper.PROFILE); if (res != null && res.size() > 0) { response.add(Sjm.PROFILES, res); } else { diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/WorkspaceDelete.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/WorkspaceDelete.java index e3a5273d..f2e9f2c4 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/WorkspaceDelete.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/WorkspaceDelete.java @@ -68,14 +68,7 @@ public WorkspaceDelete(Repository repositoryHelper, ServiceRegistry service) { } else { EmsNodeUtil emsNodeUtil = new EmsNodeUtil(projectId, wsId); emsNodeUtil.deleteRef(wsId); - EmsScriptNode target = getWorkspace(req); - if (target != null) { - object = printObject(target); - target.delete(); //this didn't actually delete the alfresco folder just added deleted aspect - responseStatus.setCode(HttpServletResponse.SC_OK); - } else { - log(Level.WARN, HttpServletResponse.SC_NOT_FOUND, "Could not find workspace %s", wsId); - } + object = new JsonObject(); } } } catch (JsonParseException e) { @@ -108,9 +101,5 @@ public WorkspaceDelete(Repository repositoryHelper, ServiceRegistry service) { return model; } - - private JsonObject printObject(EmsScriptNode workspace) { - return new JsonObject(); - } } diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/WorkspacesPost.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/WorkspacesPost.java index 26745d40..399d2ba0 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/WorkspacesPost.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/WorkspacesPost.java @@ -29,6 +29,7 @@ package gov.nasa.jpl.view_repo.webscripts; +import gov.nasa.jpl.view_repo.db.ElasticHelper; import java.util.Date; import java.util.HashMap; import java.util.Map; @@ -113,7 +114,7 @@ public WorkspacesPost(Repository repositoryHelper, ServiceRegistry registry) { String commitId = !JsonUtil.getOptString(o, "parentCommitId").isEmpty() ? JsonUtil.getOptString(o, "parentCommitId") : req.getParameter("commitId"); - json = createWorkSpace(projectId, sourceWorkspaceParam, newName, commitId, reqJson, user, status); + json = createWorkSpace(projectId, sourceWorkspaceParam, newName, commitId, o, user, status); statusCode = status.getCode(); if (statusCode == HttpServletResponse.SC_OK) { success.add(json); @@ -177,7 +178,7 @@ public JsonObject createWorkSpace(String projectId, String sourceWorkId, String String date = TimeUtils.toTimestamp(new Date().getTime()); if (orgNode == null) { - log(Level.WARN, "Site Not Found", HttpServletResponse.SC_NOT_FOUND); + log(Level.WARN, HttpServletResponse.SC_NOT_FOUND, "Site Not Found"); status.setCode(HttpServletResponse.SC_NOT_FOUND); return null; } @@ -188,6 +189,8 @@ public JsonObject createWorkSpace(String projectId, String sourceWorkId, String JsonObject srcJson = new JsonObject(); String workspaceName = null; String desc = null; + JsonArray keywords = new JsonArray(); + JsonObject metadata = new JsonObject(); String elasticId = null; boolean isTag = false; String permission = "read"; // Default is public read permission @@ -197,8 +200,7 @@ public JsonObject createWorkSpace(String projectId, String sourceWorkId, String // and ignore any URL parameters: if (jsonObject != null) { - JsonArray jarr = jsonObject.get("refs").getAsJsonArray(); - wsJson = jarr.get(0).getAsJsonObject(); // Will only post/update one workspace + wsJson = jsonObject; sourceWorkspaceId = JsonUtil.getOptString(wsJson, "parentRefId"); srcJson = emsNodeUtil.getRefJson(sourceWorkspaceId); newWorkspaceId = JsonUtil.getOptString(wsJson, Sjm.SYSMLID, null); // alfresco id of workspace node @@ -206,6 +208,8 @@ public JsonObject createWorkSpace(String projectId, String sourceWorkId, String workspaceName = JsonUtil.getOptString(wsJson, "name"); // user or auto-generated name, ems:workspace_name isTag = JsonUtil.getOptString(wsJson, "type", "Branch").equals("Tag"); desc = JsonUtil.getOptString(wsJson, "description"); + keywords = JsonUtil.getOptArray(wsJson, "keywords"); + metadata = JsonUtil.getOptObject(wsJson, "metadata"); permission = JsonUtil.getOptString(wsJson, "permission", "read"); // "read" or "write" } else { sourceWorkspaceId = sourceWorkId; @@ -231,12 +235,17 @@ public JsonObject createWorkSpace(String projectId, String sourceWorkId, String if (desc != null && !desc.isEmpty()) { wsJson.addProperty(Sjm.DESCRIPTION, desc); } + if (keywords.size() > 0) { + wsJson.add(Sjm.KEYWORDS, keywords); + } + if (metadata.size() > 0) { + wsJson.add(Sjm.METADATA, metadata); + } wsJson.addProperty(Sjm.CREATED, date); wsJson.addProperty(Sjm.CREATOR, user); wsJson.addProperty(Sjm.MODIFIED, date); wsJson.addProperty(Sjm.MODIFIER, user); - wsJson.addProperty("status", "creating"); - elasticId = emsNodeUtil.insertSingleElastic(wsJson); + elasticId = emsNodeUtil.insertSingleElastic(wsJson, ElasticHelper.REF); if (!NO_WORKSPACE_ID.equals(sourceWorkspaceId) && srcWs == null) { log(Level.WARN, HttpServletResponse.SC_NOT_FOUND, "Source workspace not found."); @@ -244,7 +253,7 @@ public JsonObject createWorkSpace(String projectId, String sourceWorkId, String return null; } else { EmsScriptNode refContainerNode = orgNode.childByNamePath("/" + projectId + "/refs"); - EmsScriptNode dstWs = refContainerNode.createFolder(newWorkspaceId, null, null); + EmsScriptNode dstWs = refContainerNode.createFolder(newWorkspaceId, null); if (dstWs != null && srcWs != null) { // keep history of the branch @@ -255,13 +264,17 @@ public JsonObject createWorkSpace(String projectId, String sourceWorkId, String CommitUtil.sendBranch(projectId, srcJson, wsJson, elasticId, isTag, JsonUtil.getOptString(jsonObject, "source", null), commitId, services); + if (wsJson.get("status").getAsString().equalsIgnoreCase("rejected")) { + status.setCode(HttpServletResponse.SC_SERVICE_UNAVAILABLE); + } + finalWorkspace = dstWs; } } } else { // Workspace was found, so update it: if (existingRef.getId() != null) { - log(Level.INFO, "Workspace is modified", HttpServletResponse.SC_OK); + log(Level.INFO, HttpServletResponse.SC_OK, "Workspace is modified"); finalWorkspace = existingRef; } else { log(Level.WARN, HttpServletResponse.SC_NOT_FOUND, "Workspace not found."); @@ -269,9 +282,22 @@ public JsonObject createWorkSpace(String projectId, String sourceWorkId, String return null; } + JsonObject existingWsJson = emsNodeUtil.getRefJson(newWorkspaceId); + + if (wsJson.get(Sjm.COMMITID) != null) { + wsJson.remove(Sjm.COMMITID); + } + if (wsJson.get("parentRefId") != null) { + wsJson.remove("parentRefId"); + } + if (wsJson.get("parentCommitId") != null) { + wsJson.remove("parentCommitId"); + } + wsJson.addProperty(Sjm.MODIFIED, date); wsJson.addProperty(Sjm.MODIFIER, user); - elasticId = emsNodeUtil.insertSingleElastic(wsJson); + wsJson.addProperty(Sjm.ELASTICID, existingWsJson.get(Sjm.ELASTICID).getAsString()); + elasticId = emsNodeUtil.updateSingleElastic(wsJson, ElasticHelper.REF); emsNodeUtil.updateRef(newWorkspaceId, workspaceName, elasticId, isTag); } diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/util/LoginTicket.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/util/LoginTicket.java index 9db6e4b1..76c2e03e 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/util/LoginTicket.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/util/LoginTicket.java @@ -35,7 +35,7 @@ import com.google.gson.JsonObject; -import static gov.nasa.jpl.view_repo.util.NodeUtil.services; +import static gov.nasa.jpl.view_repo.util.EmsScriptNode.services; import gov.nasa.jpl.view_repo.util.Sjm; /** @@ -90,8 +90,8 @@ protected Map executeImpl(WebScriptRequest req, Status status) } catch (AuthenticationException e) { //status.setRedirect(true); status.setCode(HttpServletResponse.SC_NOT_FOUND); - status.setMessage("Ticket not found"); - result.addProperty("message", "Ticket not found"); + status.setMessage(e.getMsgId()); + result.addProperty("message", e.getMsgId()); } model.put(Sjm.RES, result.toString() ); diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/util/ModuleInfoGet.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/util/ModuleInfoGet.java index c6944027..432fb6c8 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/util/ModuleInfoGet.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/util/ModuleInfoGet.java @@ -21,9 +21,7 @@ import com.google.gson.JsonArray; import com.google.gson.JsonObject; -import gov.nasa.jpl.view_repo.util.NodeUtil; import gov.nasa.jpl.view_repo.util.Sjm; -import gov.nasa.jpl.view_repo.webscripts.AbstractJavaWebScript; public class ModuleInfoGet extends DeclarativeWebScript { private static Logger logger = Logger.getLogger(ModuleInfoGet.class) diff --git a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/util/SitePermission.java b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/util/SitePermission.java index ecc6b350..8fc44c69 100644 --- a/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/util/SitePermission.java +++ b/mms-ent/repo-amp/src/main/java/gov/nasa/jpl/view_repo/webscripts/util/SitePermission.java @@ -4,12 +4,12 @@ import java.util.Arrays; import java.util.List; +import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.apache.log4j.Logger; import gov.nasa.jpl.mbee.util.Utils; import gov.nasa.jpl.view_repo.util.EmsNodeUtil; import gov.nasa.jpl.view_repo.util.EmsScriptNode; -import gov.nasa.jpl.view_repo.util.NodeUtil; public class SitePermission { @@ -57,7 +57,7 @@ public static boolean hasPermissionToBranch(String orgId, String projectId, Stri } public static boolean isAdmin() { - List userGroups = NodeUtil.getUserGroups(NodeUtil.getUserName()); + List userGroups = EmsScriptNode.getUserGroups(AuthenticationUtil.getRunAsUser()); for (String adminString : adminList) { for (String userGroup : userGroups) { if (userGroup.contains(adminString)) { diff --git a/mms-ent/repo-amp/src/main/resources/mapping_template.json b/mms-ent/repo-amp/src/main/resources/mapping_template.json index 45304ef1..10bb7bc0 100644 --- a/mms-ent/repo-amp/src/main/resources/mapping_template.json +++ b/mms-ent/repo-amp/src/main/resources/mapping_template.json @@ -1,11 +1,11 @@ { - "template" : "*", - "settings" : { - "index" : { - "number_of_shards" : 3 + "template": "*", + "settings": { + "index": { + "number_of_shards": 3 } }, - "mappings" : { + "mappings": { "artifact": { "properties": { "id": { @@ -40,7 +40,7 @@ "type": "date", "format": "yyyy-MM-dd'T'HH:mm:ss.SSSZ" }, - "_elasticId":{ + "_elasticId": { "type": "keyword" } } @@ -48,8 +48,8 @@ "commit": { "properties": { "added": { - "properties" : { - "id":{ + "properties": { + "id": { "type": "keyword" }, "_elasticId": { @@ -64,11 +64,11 @@ } }, "updated": { - "properties" : { - "id":{ + "properties": { + "id": { "type": "keyword" }, - "_elasticId":{ + "_elasticId": { "type": "keyword" }, "previousElasticId": { @@ -80,11 +80,11 @@ } }, "deleted": { - "properties" : { - "id":{ + "properties": { + "id": { "type": "keyword" }, - "previousElasticId":{ + "previousElasticId": { "type": "keyword" }, "type": { @@ -223,17 +223,78 @@ "type": "date", "format": "yyyy-MM-dd'T'HH:mm:ss.SSSZ" }, - "_elasticId":{ + "_elasticId": { "type": "keyword" } } }, "profile": { + "dynamic_templates": [ + { + "id_as_keywords": { + "match_mapping_type": "string", + "match_pattern": "regex", + "match": ".*(Id|Ids)", + "mapping": { + "type": "keyword" + } + } + }, + { + "id_and_type": { + "match_mapping_type": "string", + "match_pattern": "regex", + "match": "(id|ids|type|uri|URI)", + "mapping": { + "type": "keyword" + } + } + } + ], "properties": { "username": { "type": "keyword" } } + }, + "ref": { + "dynamic_templates": [ + { + "id_as_keywords": { + "match_mapping_type": "string", + "match_pattern": "regex", + "match": ".*(Id|Ids)", + "mapping": { + "type": "keyword" + } + } + } + ], + "properties": { + "status" : { + "type": "keyword" + }, + "_created": { + "type": "date", + "format": "yyyy-MM-dd'T'HH:mm:ss.SSSZ" + }, + "_modified": { + "type": "date", + "format": "yyyy-MM-dd'T'HH:mm:ss.SSSZ" + }, + "_creator": { + "type": "keyword" + }, + "_modifier": { + "type": "keyword" + }, + "type": { + "type": "keyword" + }, + "id": { + "type": "keyword" + } + } } } } diff --git a/mms-ent/repo-amp/src/test/java/gov/nasa/jpl/view_repo/db/PostgresPoolTest.java b/mms-ent/repo-amp/src/test/java/gov/nasa/jpl/view_repo/db/PostgresPoolTest.java new file mode 100644 index 00000000..45e04ea3 --- /dev/null +++ b/mms-ent/repo-amp/src/test/java/gov/nasa/jpl/view_repo/db/PostgresPoolTest.java @@ -0,0 +1,157 @@ +package gov.nasa.jpl.view_repo.db; + +import gov.nasa.jpl.view_repo.util.EmsConfig; +import org.apache.commons.dbcp.BasicDataSource; +import org.apache.commons.dbcp.DelegatingConnection; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import java.sql.Connection; +import java.sql.SQLException; + +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.*; +import static org.mockito.internal.verification.VerificationModeFactory.atLeast; +import static org.mockito.internal.verification.VerificationModeFactory.times; + +/** + * Created by lm392c on 4/19/2018. + */ +public class PostgresPoolTest { + + + @Before + public void setup() { + EmsConfig.setProperty(PostgresPool.PG_CONN_MAX, "96"); + EmsConfig.setProperty(PostgresPool.PG_SEC, "true"); + } + + @After + public void teardown() { + PostgresPool.purgeDatabasePools(); + } + + @Test + public void testPoolCreationGoActive() throws SQLException { + + PostgresPool.IBasicDataSourceFactory mockFactory = mock(PostgresPool.IBasicDataSourceFactory.class); + PostgresPool.setBasicDataSourceFactory(mockFactory); + + BasicDataSource mockBasicDataSource = mock(BasicDataSource.class); + Connection mockConnection = mock(Connection.class); + + when(mockFactory.getNewBasicDataSource()).thenReturn(mockBasicDataSource); + when(mockBasicDataSource.getConnection()).thenReturn(mockConnection); + + Connection connection = PostgresPool.getInstance("host", "name").getConnection(); + + assertSame(mockConnection, connection); + + verify(mockBasicDataSource, atLeast(1)).setMaxIdle(PostgresPool.MAX_IDLE_CONN); + verify(mockBasicDataSource, never()).setMaxIdle(PostgresPool.MIN_IDLE_CONN); + } + + @Test + public void testPoolNoActiveOverflowBySize() throws SQLException { + + PostgresPool.IBasicDataSourceFactory mockFactory = mock(PostgresPool.IBasicDataSourceFactory.class); + PostgresPool.setBasicDataSourceFactory(mockFactory); + + BasicDataSource mockBasicDataSource = mock(BasicDataSource.class); + Connection mockConnection = mock(Connection.class); + + when(mockFactory.getNewBasicDataSource()).thenReturn(mockBasicDataSource); + when(mockBasicDataSource.getConnection()).thenReturn(mockConnection); + + when(mockBasicDataSource.getNumIdle()).thenReturn(1); + when(mockBasicDataSource.getNumActive()).thenReturn(1); + + for(int count = 0; count < PostgresPool.MAX_CONN_LIMIT/4; ++count){ + PostgresPool.getInstance("host", String.valueOf(count)).getConnection(); + } + + verify(mockBasicDataSource, never()).setMaxIdle(PostgresPool.MIN_IDLE_CONN); + } + + @Test + public void testPoolActiveOverflow() throws SQLException { + + PostgresPool.IBasicDataSourceFactory mockFactory = mock(PostgresPool.IBasicDataSourceFactory.class); + PostgresPool.setBasicDataSourceFactory(mockFactory); + + BasicDataSource mockBasicDataSource = mock(BasicDataSource.class); + Connection mockConnection = mock(Connection.class); + + when(mockFactory.getNewBasicDataSource()).thenReturn(mockBasicDataSource); + when(mockBasicDataSource.getConnection()).thenReturn(mockConnection); + + when(mockBasicDataSource.getNumIdle()).thenReturn(1); + when(mockBasicDataSource.getNumActive()).thenReturn(1); + + for(int count = 0; count < PostgresPool.MAX_CONN_LIMIT/2 + 1; ++count){ + PostgresPool.getInstance("host", String.valueOf(count)).getConnection(); + } + + verify(mockBasicDataSource, atLeast(1)).setMaxIdle(PostgresPool.MIN_IDLE_CONN); + } + + @Test + public void testPoolNoActiveOverflowByMultiHost() throws SQLException { + + PostgresPool.IBasicDataSourceFactory mockFactory = mock(PostgresPool.IBasicDataSourceFactory.class); + PostgresPool.setBasicDataSourceFactory(mockFactory); + + BasicDataSource mockBasicDataSource = mock(BasicDataSource.class); + Connection mockConnection = mock(Connection.class); + + when(mockFactory.getNewBasicDataSource()).thenReturn(mockBasicDataSource); + when(mockBasicDataSource.getConnection()).thenReturn(mockConnection); + + when(mockBasicDataSource.getNumIdle()).thenReturn(1); + when(mockBasicDataSource.getNumActive()).thenReturn(1); + + for(int count = 0; count < PostgresPool.MAX_CONN_LIMIT/2 + 1; ++count){ + PostgresPool.getInstance(String.format("host%d", count), String.valueOf(count)).getConnection(); + } + + verify(mockBasicDataSource, never()).setMaxIdle(PostgresPool.MIN_IDLE_CONN); + } + + @Test + public void testPoolInactiveToActive() throws SQLException { + PostgresPool.IBasicDataSourceFactory mockFactory = mock(PostgresPool.IBasicDataSourceFactory.class); + PostgresPool.setBasicDataSourceFactory(mockFactory); + + BasicDataSource mockBasicDataSource = mock(BasicDataSource.class); + Connection mockConnection = mock(Connection.class); + + when(mockFactory.getNewBasicDataSource()).thenReturn(mockBasicDataSource); + when(mockBasicDataSource.getConnection()).thenReturn(mockConnection); + + when(mockBasicDataSource.getNumIdle()).thenReturn(1); + when(mockBasicDataSource.getNumActive()).thenReturn(1); + + PostgresPool instance = PostgresPool.getInstance("host", "name"); + instance.getConnection(); + + reset(mockBasicDataSource); + + PostgresPool.idleDatabasePools(); + + verify(mockBasicDataSource, atLeast(1)).setMaxIdle(PostgresPool.MIN_IDLE_CONN); + verify(mockBasicDataSource, never()).setMaxIdle(PostgresPool.MAX_IDLE_CONN); + + reset(mockBasicDataSource); + + PostgresPool instance2 = PostgresPool.getInstance("host", "name"); + instance2.getConnection(); + + assertSame(instance, instance2); + + verify(mockBasicDataSource, never()).setMaxIdle(PostgresPool.MIN_IDLE_CONN); + verify(mockBasicDataSource, atLeast(1)).setMaxIdle(PostgresPool.MAX_IDLE_CONN); + } + +} diff --git a/mms-ent/repo/pom.xml b/mms-ent/repo/pom.xml index 1f02d639..44839c57 100755 --- a/mms-ent/repo/pom.xml +++ b/mms-ent/repo/pom.xml @@ -18,7 +18,7 @@ gov.nasa.jpl.mbee mms-ent - 3.3.0 + 3.4.0 diff --git a/mms-ent/run-tests.sh b/mms-ent/run-tests.sh new file mode 100755 index 00000000..3fbe0a1b --- /dev/null +++ b/mms-ent/run-tests.sh @@ -0,0 +1,47 @@ +#!/bin/bash +DOCKER_CHECK=$( which docker ) +if [ ! $DOCKER_CHECK ];then + echo "Docker not found in PATH." +fi + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +POSTGRES_INSTANCE=$( nc -z -v 127.0.0.1 5432 2>&1 | grep open | wc -l ) +POSTGRES_USER=mmsuser +POSTGRES_PASS=test123 +DB_SCHEMA=$( cat $DIR/repo-amp/src/main/resources/mms.sql | tail -n +2 | tr -d "\n" ) + +ELASTIC_INSTANCE=$( nc -z -v 127.0.0.1 9200 2>&1 | grep open | wc -l ) +ELASTIC_MAPPING=$DIR/repo-amp/src/main/resources/mapping_template.json + +if [ $POSTGRES_INSTANCE -eq 0 ];then + docker run -d --name postgres-docker --publish=5432:5432 -e POSTGRES_USER=${POSTGRES_USER} -e POSTGRES_PASSWORD=${POSTGRES_PASS} postgres:9.4-alpine +else + echo 'Existing database found.' + docker rm -f postgres-docker + docker run -d --name postgres-docker --publish=5432:5432 -e POSTGRES_USER=${POSTGRES_USER} -e POSTGRES_PASSWORD=${POSTGRES_PASS} postgres:9.4-alpine +fi + +if [ $ELASTIC_INSTANCE -eq 0 ];then + docker run -d --name elasticsearch-docker --publish=9200:9200 elasticsearch:5.5-alpine +else + echo 'Existing elasticsearch server found.' + docker rm -f elasticsearch-docker + docker run -d --name elasticsearch-docker --publish=9200:9200 elasticsearch:5.5-alpine +fi + +while [ $( docker exec -it postgres-docker ps aux | grep postgres | uniq | wc -l ) -lt 6 ] || [ $( curl -v --silent localhost:9200/_cat/health 2>&1 | grep 'green' | wc -l ) -lt 1 ];do + sleep 1; +done + +docker exec -it postgres-docker psql -h localhost -U postgres -c "ALTER ROLE ${POSTGRES_USER} CREATEDB" +docker exec -it postgres-docker createdb -h localhost -U ${POSTGRES_USER} mms +docker exec -it postgres-docker psql -h localhost -U ${POSTGRES_USER} -d mms -c "${DB_SCHEMA}" +echo 'Postgresql initialized' + +curl -s -o /dev/null -d @${ELASTIC_MAPPING} -XPUT http://localhost:9200/_template/template +echo 'Elasticsearch mappings applied' + +rm -rf $DIR/alf_data_dev + +./mvnw clean -Ppurge && ./mvnw install -Prun,robot-tests diff --git a/mms-ent/runner/pom.xml b/mms-ent/runner/pom.xml index 3aa46e18..4a30a1db 100755 --- a/mms-ent/runner/pom.xml +++ b/mms-ent/runner/pom.xml @@ -9,7 +9,7 @@ gov.nasa.jpl.mbee mms-ent - 3.3.0 + 3.4.0 diff --git a/mms-ent/runner/src/test/robotframework/JsonData/MoveMultipleOwners.json b/mms-ent/runner/src/test/robotframework/JsonData/MoveMultipleOwners.json new file mode 100644 index 00000000..20693017 --- /dev/null +++ b/mms-ent/runner/src/test/robotframework/JsonData/MoveMultipleOwners.json @@ -0,0 +1,28 @@ +{ + "moves": [ + { + "_creator": "admin", + "_modifier": "admin", + "id": "propMove2", + "from": "oldParent", + "to": "newParent", + "index":"3" + }, + { + "_creator": "admin", + "_modifier": "admin", + "id": "propMove3", + "from": "oldParent", + "to": "newParent", + "index":"1" + }, + { + "_creator": "admin", + "_modifier": "admin", + "id": "propMove4", + "from": "oldParent", + "to": "newParent", + "index":"0" + } + ] +} diff --git a/mms-ent/runner/src/test/robotframework/JsonData/MoveOwner.json b/mms-ent/runner/src/test/robotframework/JsonData/MoveOwner.json new file mode 100644 index 00000000..4c12803f --- /dev/null +++ b/mms-ent/runner/src/test/robotframework/JsonData/MoveOwner.json @@ -0,0 +1,12 @@ +{ + "moves": [ + { + "_creator": "admin", + "_modifier": "admin", + "id": "propMove", + "from": "oldParent", + "to": "newParent", + "index":"0" + } + ] +} diff --git a/mms-ent/runner/src/test/robotframework/JsonData/MovePosition.json b/mms-ent/runner/src/test/robotframework/JsonData/MovePosition.json new file mode 100644 index 00000000..4729b359 --- /dev/null +++ b/mms-ent/runner/src/test/robotframework/JsonData/MovePosition.json @@ -0,0 +1,28 @@ +{ + "moves": [ + { + "_creator": "admin", + "_modifier": "admin", + "id": "propMove2", + "from": "oldParent", + "to": "oldParent", + "index":"3" + }, + { + "_creator": "admin", + "_modifier": "admin", + "id": "propMove3", + "from": "oldParent", + "to": "oldParent", + "index":"1" + }, + { + "_creator": "admin", + "_modifier": "admin", + "id": "propMove4", + "from": "oldParent", + "to": "oldParent", + "index":"0" + } + ] +} diff --git a/mms-ent/runner/src/test/robotframework/JsonData/PostMoveElements.json b/mms-ent/runner/src/test/robotframework/JsonData/PostMoveElements.json new file mode 100644 index 00000000..0dc7d125 --- /dev/null +++ b/mms-ent/runner/src/test/robotframework/JsonData/PostMoveElements.json @@ -0,0 +1,118 @@ +{ // ownerId of a1 becomes pack2 and propertyType of ap1 becomes b2 + "elements": [ + { + "id": "package1", + "type": "Package", + "ownerId": "MoveModel" + }, + { + "id": "package2", + "type": "Package", + "ownerId": "MoveModel" + }, + { + "documentation": "something", + "id": "oldParent", + "ownedAttributeIds": [ + "propMove", + "propMove2", + "propMove3", + "propMove4" + ], + "name": "org parent of p", + "ownerId": "package1", + "type": "Class", + "isDerived": false, + "value": [ + { + "type": "LiteralString", + "string": "dlam_string" + } + ] + }, + { + "documentation": "else", + "id": "newParent", + "ownedAttributeIds": [], + "name": "new parent of p", + "ownerId": "package2", + "type": "Class", + "isDerived": false, + "value": [ + { + "type": "LiteralString", + "string": "dlam_string" + } + ] + }, + { + "documentation": "else", + "id": "propMove", + "associationId":"a1", + "name": "three hundred and one", + "ownerId": "oldParent", + "type": "Property", + "isDerived": false, + "value": [ + { + "type": "LiteralString", + "string": "dlam_string" + } + ] + }, + { + "type": "Association", + "id": "a1", + "ownedEndIds": ["ap1"], + "ownerId": "package1" + }, + { + "type": "Property", + "id": "ap1", + "typeId": "oldParent", + "ownerId": "a1" + }, + { + "documentation": "else", + "id": "propMove2", + "name": "three hundred and one", + "ownerId": "oldParent", + "type": "Property", + "isDerived": false, + "value": [ + { + "type": "LiteralString", + "string": "dlam_string" + } + ] + }, + { + "documentation": "else", + "id": "propMove3", + "name": "three hundred and one", + "ownerId": "oldParent", + "type": "Property", + "isDerived": false, + "value": [ + { + "type": "LiteralString", + "string": "dlam_string" + } + ] + }, + { + "documentation": "else", + "id": "propMove4", + "name": "three hundred and one", + "ownerId": "oldParent", + "type": "Property", + "isDerived": false, + "value": [ + { + "type": "LiteralString", + "string": "dlam_string" + } + ] + } + ] +} diff --git a/mms-ent/runner/src/test/robotframework/JsonData/PostNewBranchToPA.json b/mms-ent/runner/src/test/robotframework/JsonData/PostNewBranchToPA.json index 0e7db3cc..dabfc681 100644 --- a/mms-ent/runner/src/test/robotframework/JsonData/PostNewBranchToPA.json +++ b/mms-ent/runner/src/test/robotframework/JsonData/PostNewBranchToPA.json @@ -4,7 +4,11 @@ "id": "newbranch", "type": "Branch", "name": "newBranch", - "parentRefId": "master" + "parentRefId": "master", + "metadata": { + "active": true, + "someAttribute": "blah" + } } ] } diff --git a/mms-ent/runner/src/test/robotframework/JsonData/ProjectCreationForMove.json b/mms-ent/runner/src/test/robotframework/JsonData/ProjectCreationForMove.json new file mode 100644 index 00000000..522f3ad2 --- /dev/null +++ b/mms-ent/runner/src/test/robotframework/JsonData/ProjectCreationForMove.json @@ -0,0 +1,11 @@ +{ + "projects": [ + { + "_creator": "admin", + "_modifier": "admin", + "id": "MoveModel", + "name": "Project", + "type": "Project" + } + ] +} diff --git a/mms-ent/runner/src/test/robotframework/JsonData/SearchQueryLiteral.json b/mms-ent/runner/src/test/robotframework/JsonData/SearchQueryLiteral.json index 47143e11..12bf9838 100644 --- a/mms-ent/runner/src/test/robotframework/JsonData/SearchQueryLiteral.json +++ b/mms-ent/runner/src/test/robotframework/JsonData/SearchQueryLiteral.json @@ -30,7 +30,15 @@ ] } } - ] + ], + "must": { + "script": { + "script": { + "inline": "doc['num1'].value > 1", + "lang": "painless" + } + } + } } } ], diff --git a/mms-ent/runner/src/test/robotframework/output/baseline/ChangeOwner.json b/mms-ent/runner/src/test/robotframework/output/baseline/ChangeOwner.json new file mode 100644 index 00000000..e77356c8 --- /dev/null +++ b/mms-ent/runner/src/test/robotframework/output/baseline/ChangeOwner.json @@ -0,0 +1,96 @@ +{ + "_creator": "admin", + "elements": [ + { + "_creator": "admin", + "_editable": true, + "_modifier": "admin", + "_projectId": "MoveModel", + "_refId": "master", + "id": "a1", + "ownedEndIds": [ + "ap1" + ], + "ownerId": "package2", + "type": "Association" + }, + { + "_creator": "admin", + "_editable": true, + "_modifier": "admin", + "_projectId": "MoveModel", + "_refId": "master", + "id": "ap1", + "ownerId": "a1", + "type": "Property", + "typeId": "newParent" + }, + { + "_creator": "admin", + "_editable": true, + "_modifier": "admin", + "_projectId": "MoveModel", + "_refId": "master", + "associationId": "a1", + "documentation": "else", + "id": "propMove", + "isDerived": false, + "name": "three hundred and one", + "ownerId": "newParent", + "type": "Property", + "value": [ + { + "string": "dlam_string", + "type": "LiteralString" + } + ] + }, + { + "_creator": "admin", + "_editable": true, + "_modifier": "admin", + "_projectId": "MoveModel", + "_refId": "master", + "documentation": "else", + "id": "newParent", + "isDerived": false, + "name": "new parent of p", + "ownedAttributeIds": [ + "propMove" + ], + "ownerId": "package2", + "type": "Class", + "value": [ + { + "string": "dlam_string", + "type": "LiteralString" + } + ] + }, + { + "_creator": "admin", + "_editable": true, + "_modifier": "admin", + "_projectId": "MoveModel", + "_refId": "master", + "documentation": "something", + "id": "oldParent", + "isDerived": false, + "name": "org parent of p", + "ownedAttributeIds": [ + "propMove2", + "propMove3", + "propMove4" + ], + "ownerId": "package1", + "type": "Class", + "value": [ + { + "string": "dlam_string", + "type": "LiteralString" + } + ] + } + ], + "rejected": [] +} \ No newline at end of file diff --git a/mms-ent/runner/src/test/robotframework/output/baseline/DeleteArtifact.json b/mms-ent/runner/src/test/robotframework/output/baseline/DeleteArtifact.json index 1d02a9d1..6f77a10a 100644 --- a/mms-ent/runner/src/test/robotframework/output/baseline/DeleteArtifact.json +++ b/mms-ent/runner/src/test/robotframework/output/baseline/DeleteArtifact.json @@ -1,3 +1,25 @@ { - "message": "[ERROR]: Artifact not found!" -} \ No newline at end of file + "deleted": [ + { + "_creator": "admin", + "_editable": true, + "_inRefIds": [ + "master" + ], + "_modifier": "admin", + "_projectId": "PA", + "_refId": "master", + "checksum": "3bb7ef11b648725af351525ba6e77a38", + "contentType": "image/png", + "id": "deleteArtifact", + "type": "Artifact" + } + ], + "messages": [ + { + "code": 410.0, + "id": "deleteArtifact", + "message": "Element deleteArtifact was not found" + } + ] +} diff --git a/mms-ent/runner/src/test/robotframework/output/baseline/DeleteElement.json b/mms-ent/runner/src/test/robotframework/output/baseline/DeleteElement.json index 825e211d..15f23df6 100644 --- a/mms-ent/runner/src/test/robotframework/output/baseline/DeleteElement.json +++ b/mms-ent/runner/src/test/robotframework/output/baseline/DeleteElement.json @@ -1,3 +1,31 @@ { - "message": "[ERROR]: Element DeleteElement is deleted\n[ERROR]: No elements found.\n" -} \ No newline at end of file + "deleted": [ + { + "_creator": "admin", + "_editable": true, + "_inRefIds": [], + "_modifier": "admin", + "_projectId": "PA", + "_refId": "master", + "documentation": "Element that will be deleted", + "id": "DeleteElement", + "isDerived": false, + "name": "Deleted Element", + "ownerId": "PA", + "type": "Property", + "value": [ + { + "string": "dlam_string", + "type": "LiteralString" + } + ] + } + ], + "messages": [ + { + "code": 410.0, + "id": "DeleteElement", + "message": "Element DeleteElement was not found" + } + ] +} diff --git a/mms-ent/runner/src/test/robotframework/output/baseline/GetAllElementsForMove.json b/mms-ent/runner/src/test/robotframework/output/baseline/GetAllElementsForMove.json new file mode 100644 index 00000000..79446359 --- /dev/null +++ b/mms-ent/runner/src/test/robotframework/output/baseline/GetAllElementsForMove.json @@ -0,0 +1,236 @@ +{ + "elements": [ + { + "_creator": "admin", + "_editable": true, + "_modifier": "admin", + "_projectId": "MoveModel", + "_refId": "master", + "documentation": "else", + "id": "newParent", + "isDerived": false, + "name": "new parent of p", + "ownedAttributeIds": [], + "ownerId": "package2", + "type": "Class", + "value": [ + { + "string": "dlam_string", + "type": "LiteralString" + } + ] + }, + { + "_creator": "admin", + "_editable": true, + "_modifier": "admin", + "_projectId": "MoveModel", + "_refId": "master", + "id": "package1", + "ownerId": "MoveModel", + "type": "Package" + }, + { + "_creator": "admin", + "_editable": true, + "_modifier": "admin", + "_projectId": "MoveModel", + "_refId": "master", + "id": "package2", + "ownerId": "MoveModel", + "type": "Package" + }, + { + "_creator": "admin", + "_editable": true, + "_modifier": "admin", + "_projectId": "MoveModel", + "_refId": "master", + "documentation": "something", + "id": "oldParent", + "isDerived": false, + "name": "org parent of p", + "ownedAttributeIds": [ + "propMove", + "propMove2", + "propMove3", + "propMove4" + ], + "ownerId": "package1", + "type": "Class", + "value": [ + { + "string": "dlam_string", + "type": "LiteralString" + } + ] + }, + { + "_creator": "admin", + "_editable": true, + "_modifier": "admin", + "_projectId": "MoveModel", + "_refId": "master", + "associationId": "a1", + "documentation": "else", + "id": "propMove", + "isDerived": false, + "name": "three hundred and one", + "ownerId": "oldParent", + "type": "Property", + "value": [ + { + "string": "dlam_string", + "type": "LiteralString" + } + ] + }, + { + "_creator": "admin", + "_editable": true, + "_modifier": "admin", + "_projectId": "MoveModel", + "_refId": "master", + "id": "ap1", + "ownerId": "a1", + "type": "Property", + "typeId": "oldParent" + }, + { + "_creator": "admin", + "_editable": true, + "_modifier": "admin", + "_projectId": "MoveModel", + "_refId": "master", + "documentation": "else", + "id": "propMove3", + "isDerived": false, + "name": "three hundred and one", + "ownerId": "oldParent", + "type": "Property", + "value": [ + { + "string": "dlam_string", + "type": "LiteralString" + } + ] + }, + { + "_creator": "admin", + "_editable": true, + "_modifier": "admin", + "_projectId": "MoveModel", + "_refId": "master", + "documentation": "else", + "id": "propMove4", + "isDerived": false, + "name": "three hundred and one", + "ownerId": "oldParent", + "type": "Property", + "value": [ + { + "string": "dlam_string", + "type": "LiteralString" + } + ] + }, + { + "_creator": "admin", + "_editable": true, + "_modifier": "admin", + "_projectId": "MoveModel", + "_refId": "master", + "id": "a1", + "ownedEndIds": [ + "ap1" + ], + "ownerId": "package1", + "type": "Association" + }, + { + "_creator": "admin", + "_editable": true, + "_modifier": "admin", + "_projectId": "MoveModel", + "_refId": "master", + "documentation": "else", + "id": "propMove2", + "isDerived": false, + "name": "three hundred and one", + "ownerId": "oldParent", + "type": "Property", + "value": [ + { + "string": "dlam_string", + "type": "LiteralString" + } + ] + }, + { + "URI": null, + "_appliedStereotypeIds": [], + "_creator": "admin", + "_editable": true, + "_isGroup": false, + "_modifier": "admin", + "_projectId": "MoveModel", + "_refId": "master", + "appliedStereotypeInstanceId": null, + "clientDependencyIds": [], + "documentation": "", + "elementImportIds": [], + "id": "holding_bin_MoveModel", + "mdExtensionsIds": [], + "name": "Holding Bin", + "nameExpression": null, + "ownerId": "MoveModel", + "packageImportIds": [], + "packageMergeIds": [], + "profileApplicationIds": [], + "supplierDependencyIds": [], + "syncElementId": null, + "templateBindingIds": [], + "templateParameterId": null, + "type": "Package", + "visibility": "public" + }, + { + "_creator": "admin", + "_editable": true, + "_modifier": "admin", + "_projectId": "MoveModel", + "_refId": "master", + "id": "MoveModel", + "name": "Project", + "type": "Project" + }, + { + "URI": null, + "_appliedStereotypeIds": [], + "_creator": "admin", + "_editable": true, + "_isGroup": false, + "_modifier": "admin", + "_projectId": "MoveModel", + "_refId": "master", + "appliedStereotypeInstanceId": null, + "clientDependencyIds": [], + "documentation": "", + "elementImportIds": [], + "id": "view_instances_bin_MoveModel", + "mdExtensionsIds": [], + "name": "View Instances Bin", + "nameExpression": null, + "ownerId": "MoveModel", + "packageImportIds": [], + "packageMergeIds": [], + "profileApplicationIds": [], + "supplierDependencyIds": [], + "syncElementId": null, + "templateBindingIds": [], + "templateParameterId": null, + "type": "Package", + "visibility": "public" + } + ] +} \ No newline at end of file diff --git a/mms-ent/runner/src/test/robotframework/output/baseline/GetElementAtCommitBetweenDeletionAndResurrection.json b/mms-ent/runner/src/test/robotframework/output/baseline/GetElementAtCommitBetweenDeletionAndResurrection.json index 5d558369..47052a4f 100644 --- a/mms-ent/runner/src/test/robotframework/output/baseline/GetElementAtCommitBetweenDeletionAndResurrection.json +++ b/mms-ent/runner/src/test/robotframework/output/baseline/GetElementAtCommitBetweenDeletionAndResurrection.json @@ -1,3 +1,28 @@ { - "message": "[ERROR]: No elements found.\n" -} \ No newline at end of file + "deleted": [ + { + "_creator": "admin", + "_editable": true, + "_modifier": "admin", + "_projectId": "PA", + "_refId": "master", + "documentation": "Element that was deleted and is resurrected", + "isDerived": false, + "name": "Resurrect Deleted Resurrect Element", + "ownerId": "PA", + "type": "Property", + "value": [ + { + "string": "dlam_string", + "type": "LiteralString" + } + ] + } + ], + "messages": [ + { + "code": 410.0, + "message": "Element DeleteResurrectElement was not found" + } + ] +} diff --git a/mms-ent/runner/src/test/robotframework/output/baseline/GetElementsFromAllMountedProjectsViaPAWithInvalidElement.json b/mms-ent/runner/src/test/robotframework/output/baseline/GetElementsFromAllMountedProjectsViaPAWithInvalidElement.json index 39e03780..771ff89e 100644 --- a/mms-ent/runner/src/test/robotframework/output/baseline/GetElementsFromAllMountedProjectsViaPAWithInvalidElement.json +++ b/mms-ent/runner/src/test/robotframework/output/baseline/GetElementsFromAllMountedProjectsViaPAWithInvalidElement.json @@ -44,8 +44,7 @@ { "code": 404, "id": "notAnElement", - "message": "Element notAnElement was not found", - "severity": "warn" + "message": "Element notAnElement was not found" } ] -} \ No newline at end of file +} diff --git a/mms-ent/runner/src/test/robotframework/output/baseline/GetImage.json b/mms-ent/runner/src/test/robotframework/output/baseline/GetImage.json index 30cf0df9..97838c79 100644 --- a/mms-ent/runner/src/test/robotframework/output/baseline/GetImage.json +++ b/mms-ent/runner/src/test/robotframework/output/baseline/GetImage.json @@ -2,6 +2,7 @@ "artifacts": [ { "_creator": "admin", + "_editable": true, "_modifier": "admin", "_projectId": "PA", "_refId": "master", @@ -11,4 +12,4 @@ "type": "Artifact" } ] -} \ No newline at end of file +} diff --git a/mms-ent/runner/src/test/robotframework/output/baseline/GetImageInMountedProject.json b/mms-ent/runner/src/test/robotframework/output/baseline/GetImageInMountedProject.json index 1e62905a..4d86bcc5 100644 --- a/mms-ent/runner/src/test/robotframework/output/baseline/GetImageInMountedProject.json +++ b/mms-ent/runner/src/test/robotframework/output/baseline/GetImageInMountedProject.json @@ -2,6 +2,7 @@ "artifacts": [ { "_creator": "admin", + "_editable": true, "_modifier": "admin", "_projectId": "PB", "_refId": "master", diff --git a/mms-ent/runner/src/test/robotframework/output/baseline/GetRef.json b/mms-ent/runner/src/test/robotframework/output/baseline/GetRef.json index 3d0166c8..b09de396 100644 --- a/mms-ent/runner/src/test/robotframework/output/baseline/GetRef.json +++ b/mms-ent/runner/src/test/robotframework/output/baseline/GetRef.json @@ -4,10 +4,14 @@ "_creator": "admin", "_modifier": "admin", "id": "newbranch", + "metadata": { + "active": true, + "someAttribute": "blah" + }, "name": "newBranch", "parentRefId": "master", "status": "created", "type": "branch" } ] -} \ No newline at end of file +} diff --git a/mms-ent/runner/src/test/robotframework/output/baseline/MoveOrderInSameOwner.json b/mms-ent/runner/src/test/robotframework/output/baseline/MoveOrderInSameOwner.json new file mode 100644 index 00000000..a75ed0c3 --- /dev/null +++ b/mms-ent/runner/src/test/robotframework/output/baseline/MoveOrderInSameOwner.json @@ -0,0 +1,30 @@ +{ + "_creator": "admin", + "elements": [ + { + "_creator": "admin", + "_editable": true, + "_modifier": "admin", + "_projectId": "MoveModel", + "_refId": "master", + "documentation": "something", + "id": "oldParent", + "isDerived": false, + "name": "org parent of p", + "ownedAttributeIds": [ + "propMove4", + "propMove3", + "propMove2" + ], + "ownerId": "package1", + "type": "Class", + "value": [ + { + "string": "dlam_string", + "type": "LiteralString" + } + ] + } + ], + "rejected": [] +} \ No newline at end of file diff --git a/mms-ent/runner/src/test/robotframework/output/baseline/PostNewBranchToPA.json b/mms-ent/runner/src/test/robotframework/output/baseline/PostNewBranchToPA.json index 02098e5b..0f97be84 100644 --- a/mms-ent/runner/src/test/robotframework/output/baseline/PostNewBranchToPA.json +++ b/mms-ent/runner/src/test/robotframework/output/baseline/PostNewBranchToPA.json @@ -4,10 +4,14 @@ "_creator": "admin", "_modifier": "admin", "id": "newbranch", + "metadata": { + "active": true, + "someAttribute": "blah" + }, "name": "newBranch", "parentRefId": "master", "status": "creating", "type": "Branch" } ] -} \ No newline at end of file +} diff --git a/mms-ent/runner/src/test/robotframework/output/baseline/SearchIncludingType.json b/mms-ent/runner/src/test/robotframework/output/baseline/SearchIncludingType.json index 7ed46d54..e5a5884d 100644 --- a/mms-ent/runner/src/test/robotframework/output/baseline/SearchIncludingType.json +++ b/mms-ent/runner/src/test/robotframework/output/baseline/SearchIncludingType.json @@ -51,5 +51,6 @@ } ] } - ] + ], + "total": 1.0 } diff --git a/mms-ent/runner/src/test/robotframework/output/baseline/SearchLiteral.json b/mms-ent/runner/src/test/robotframework/output/baseline/SearchLiteral.json index fd6718d2..afa8fc14 100644 --- a/mms-ent/runner/src/test/robotframework/output/baseline/SearchLiteral.json +++ b/mms-ent/runner/src/test/robotframework/output/baseline/SearchLiteral.json @@ -1,35 +1,3 @@ { - "hits": { - "hits": [ - { - "_index": "pa", - "_source": { - "_creator": "admin", - "_inRefIds": [ - "master", - "imagebranch" - ], - "_modifier": "admin", - "_projectId": "PA", - "_refId": "master", - "documentation": "to", - "id": "302", - "isDerived": false, - "name": "three hundred and two", - "ownerId": "301", - "type": "Property", - "value": [ - { - "string": "dlam_string", - "type": "LiteralString" - } - ] - }, - "_type": "element" - } - ], - "max_score": null, - "total": 1 - }, - "timed_out": false + "message": "[ERROR]: Request contained script" } diff --git a/mms-ent/runner/src/test/robotframework/output/baseline/SearchWithAgg.json b/mms-ent/runner/src/test/robotframework/output/baseline/SearchWithAgg.json index 5c2bb225..f392e4b2 100644 --- a/mms-ent/runner/src/test/robotframework/output/baseline/SearchWithAgg.json +++ b/mms-ent/runner/src/test/robotframework/output/baseline/SearchWithAgg.json @@ -1,4 +1,16 @@ { + "aggregations": { + "group_by_type": { + "buckets": [ + { + "doc_count": 1.0, + "key": "Property" + } + ], + "doc_count_error_upper_bound": 0.0, + "sum_other_doc_count": 0.0 + } + }, "elements": [ { "_creator": "admin", @@ -27,16 +39,5 @@ ] } ], - "aggregations": { - "group_by_type": { - "buckets": [ - { - "doc_count": 1, - "key": "Property" - } - ], - "doc_count_error_upper_bound": 0, - "sum_other_doc_count": 0 - } - } + "total": 1.0 } diff --git a/mms-ent/runner/src/test/robotframework/suites/01__crud/01__master.robot b/mms-ent/runner/src/test/robotframework/suites/01__crud/01__master.robot index 4115215a..b04a96f3 100644 --- a/mms-ent/runner/src/test/robotframework/suites/01__crud/01__master.robot +++ b/mms-ent/runner/src/test/robotframework/suites/01__crud/01__master.robot @@ -254,9 +254,10 @@ DeleteElement # Delete element ${result} = Delete url=${ROOT}/projects/PA/refs/master/elements/DeleteElement headers=&{REQ_HEADER} Should Be Equal ${result.status_code} ${200} + Sleep ${POST_DELAY_INDEXING} # Try to get element ${result} = Get url=${ROOT}/projects/PA/refs/master/elements/DeleteElement headers=&{REQ_HEADER} - Should Be Equal ${result.status_code} ${404} + Should Be Equal ${result.status_code} ${410} ${filter} = Create List _commitId nodeRefId versionedRefId _created read lastModified _modified siteCharacterizationId time_total _elasticId _timestamp Generate JSON ${TEST_NAME} ${result.json()} ${filter} ${compare_result} = Compare JSON ${TEST_NAME} diff --git a/mms-ent/runner/src/test/robotframework/suites/01__crud/04__move_post.robot b/mms-ent/runner/src/test/robotframework/suites/01__crud/04__move_post.robot new file mode 100644 index 00000000..6b8966e5 --- /dev/null +++ b/mms-ent/runner/src/test/robotframework/suites/01__crud/04__move_post.robot @@ -0,0 +1,63 @@ +*** Settings *** +Documentation Testing CRUD Operations on Master +Resource ../resources.robot + +*** Test Cases *** +ProjectCreationForMove + [Documentation] "Create a project (ID: MoveModel) under the organization with ID: initorg" + [Tags] crud critical 010401 + ${post_json} = Get File ${CURDIR}/../../JsonData/ProjectCreationForMove.json + ${result} = Post url=${ROOT}/orgs/initorg/projects data=${post_json} headers=&{REQ_HEADER} + Should Be Equal ${result.status_code} ${200} +PostNewElementsToMove + [Documentation] "Post elements to the newly created project and organization." + [Tags] crud critical 010402 + ${post_json} = Get File ${CURDIR}/../../JsonData/PostMoveElements.json + ${result} = Post url=${ROOT}/projects/MoveModel/refs/master/elements data=${post_json} headers=&{REQ_HEADER} + Should Be Equal ${result.status_code} ${200} + Sleep ${POST_DELAY_INDEXING} + ${filter} = Create List _commitId nodeRefId versionedRefId _created read lastModified _modified siteCharacterizationId time_total _elasticId _timestamp _inRefIds + Generate JSON ${TEST_NAME} ${result.json()} ${filter} + ${commit} = Get Commit Id ${result.json()} + Set Global Variable ${commit} +GetAllElementsForMove + [Documentation] "Get All the elements in the model" + [Tags] mounts critical 010403 + ${result} = Get url=${ROOT}/projects/MoveModel/refs/master/elements headers=&{REQ_HEADER} + Should Be Equal ${result.status_code} ${200} + ${filter} = Create List _commitId nodeRefId versionedRefId _created read lastModified _modified siteCharacterizationId time_total _elasticId _timestamp _inRefIds + Generate JSON ${TEST_NAME} ${result.json()} ${filter} + ${compare_result} = Compare JSON ${TEST_NAME} + Should Match Baseline ${compare_result} +ChangeOwner + [Documentation] "Change owner of p from b1 to b2. Remove pId from b1's list of ownedAttributeIds. Insert pId to b2's list of ownedAttributeIds at i" + [Tags] crud critical 010404 + ${post_json} = Get File ${CURDIR}/../../JsonData/MoveOwner.json + ${result} = Post url=${ROOT}/projects/MoveModel/refs/master/propertyMove data=${post_json} headers=&{REQ_HEADER} + Should Be Equal ${result.status_code} ${200} + ${filter} = Create List _commitId nodeRefId versionedRefId _created read lastModified _modified siteCharacterizationId time_total _elasticId _timestamp _inRefIds + Generate JSON ${TEST_NAME} ${result.json()} ${filter} + ${compare_result} = Compare JSON ${TEST_NAME} + Should Match Baseline ${compare_result} +MoveOrderInSameOwner + [Documentation] "Swap positions of array" + [Tags] crud critical 010405 + ${post_json} = Get File ${CURDIR}/../../JsonData/MovePosition.json + ${result} = Post url=${ROOT}/projects/MoveModel/refs/master/propertyMove data=${post_json} headers=&{REQ_HEADER} + Should Be Equal ${result.status_code} ${200} + ${filter} = Create List _commitId nodeRefId versionedRefId _created read lastModified _modified siteCharacterizationId time_total _elasticId _timestamp _inRefIds + Generate JSON ${TEST_NAME} ${result.json()} ${filter} + ${compare_result} = Compare JSON ${TEST_NAME} + Should Match Baseline ${compare_result} +#ChangeOwnerOfMultipleElements +# [Documentation] "Swap to new owner" +# [Tags] crud critical 010406 +# ${post_json} = Get File ${CURDIR}/../../JsonData/MoveMultipleOwners.json +# ${result} = Post url=${ROOT}/projects/MoveModel/refs/master/propertyMove data=${post_json} headers=&{REQ_HEADER} +# Should Be Equal ${result.status_code} ${200} +# ${filter} = Create List _commitId nodeRefId versionedRefId _created read lastModified _modified siteCharacterizationId time_total _elasticId _timestamp _inRefIds +# Generate JSON ${TEST_NAME} ${result.json()} ${filter} +# ${compare_result} = Compare JSON ${TEST_NAME} +# Should Match Baseline ${compare_result} + + diff --git a/mms-ent/runner/src/test/robotframework/suites/04__image_handling/01__master.robot b/mms-ent/runner/src/test/robotframework/suites/04__image_handling/01__master.robot index 4a3dd366..ce5b7bb6 100644 --- a/mms-ent/runner/src/test/robotframework/suites/04__image_handling/01__master.robot +++ b/mms-ent/runner/src/test/robotframework/suites/04__image_handling/01__master.robot @@ -203,8 +203,8 @@ DeleteArtifact Should Be Equal ${result.status_code} ${200} # Try to get element ${result} = requests.Get url=${ROOT}/projects/PA/refs/master/artifacts/deleteArtifact headers=&{REQ_HEADER} - Should Be Equal ${result.status_code} ${404} - ${filter} = Create List _commitId nodeRefId versionedRefId _created read lastModified _modified siteCharacterizationId time_total _elasticId _timestamp _modified + Should Be Equal ${result.status_code} ${410} + ${filter} = Create List _commitId nodeRefId versionedRefId _created read lastModified _modified siteCharacterizationId time_total _elasticId _timestamp _modified artifactLocation Generate JSON ${TEST_NAME} ${result.json()} ${filter} ${compare_result} = Compare JSON ${TEST_NAME} Should Match Baseline ${compare_result} diff --git a/mms-ent/runner/src/test/robotframework/suites/07__search/01__master.robot b/mms-ent/runner/src/test/robotframework/suites/07__search/01__master.robot index d65f95cf..64e6f88d 100644 --- a/mms-ent/runner/src/test/robotframework/suites/07__search/01__master.robot +++ b/mms-ent/runner/src/test/robotframework/suites/07__search/01__master.robot @@ -21,7 +21,7 @@ SearchLiteral [Tags] search critical 0702 ${post_json} Get File ${CURDIR}/../../JsonData/SearchQueryLiteral.json ${result} Post url=${ROOT}/projects/PA/refs/master/search?literal=true data=${post_json} headers=&{REQ_HEADER} - Should Be Equal ${result.status_code} ${200} + Should Be Equal ${result.status_code} ${400} ${filter} = Create List _id _shards _score sort took _commitId nodeRefId versionedRefId _created read lastModified _modified siteCharacterizationId time_total _elasticId _timestamp Generate JSON ${TEST_NAME} ${result.json()} ${filter} ${compare_result} = Compare JSON ${TEST_NAME} diff --git a/mms-ent/runner/src/test/robotframework/suites/09__branches_and_history/02__commits.robot b/mms-ent/runner/src/test/robotframework/suites/09__branches_and_history/02__commits.robot index ea460f46..85ab5cc1 100644 --- a/mms-ent/runner/src/test/robotframework/suites/09__branches_and_history/02__commits.robot +++ b/mms-ent/runner/src/test/robotframework/suites/09__branches_and_history/02__commits.robot @@ -87,7 +87,7 @@ GetElementAtInvalidCommit [Documentation] "Try to get an element at an invalid commit." [Tags] branches critical 090208 ${result} = Get url=${ROOT}/projects/PA/refs/master/elements/300?commitId=ThisIdShouldNotExistAtAll headers=&{REQ_HEADER} - Should be Equal ${result.status_code} ${404} + Should be Equal ${result.status_code} ${400} BranchFromBranchAndCheckCommits [Documentation] "Create branch1, create branch 2 immediately from branch 1, getting branch history from branch 1 and branch 2 should be the same." @@ -99,7 +99,7 @@ BranchFromBranchAndCheckCommits ${post_json} = Get File ${CURDIR}/../../JsonData/PostBranch2FromBranch1.json ${branch_2_json} = Post url=${ROOT}/projects/PA/refs data=${post_json} headers=&{REQ_HEADER} Should Be Equal ${branch_2_json.status_code} ${200} - Sleep ${POST_DELAY_INDEXING} + Sleep ${BRANCH_DELAY_INDEXING} ${branch_1_json} = Get url=${ROOT}/projects/PA/refs/pa_branch_1/history ${branch_2_json} = Get url=${ROOT}/projects/PA/refs/pa_branch_2/history ${result} = Compare Json To Json ${branch_2_json.json()} ${branch_1_json.json()} @@ -155,7 +155,7 @@ GetElementAtCommitBetweenDeletionAndResurrection Sleep ${POST_DELAY_INDEXING} # Get element at the commit and it should be deleted ${result} = Get url=${ROOT}/projects/PA/refs/master/elements/DeleteResurrectElement?commitId=${commit_id} - Should Be Equal ${result.status_code} ${404} + Should Be Equal ${result.status_code} ${410} ${filter} = Create List _commitId nodeRefId versionedRefId _created read lastModified _modified siteCharacterizationId time_total _elasticId _timestamp _inRefIds id Generate JSON ${TEST_NAME} ${result.json()} ${filter} ${compare_result} = Compare JSON ${TEST_NAME} diff --git a/mms-ent/share-amp/pom.xml b/mms-ent/share-amp/pom.xml index 85da4573..20e1202a 100644 --- a/mms-ent/share-amp/pom.xml +++ b/mms-ent/share-amp/pom.xml @@ -9,7 +9,7 @@ gov.nasa.jpl.mbee mms-ent - 3.3.0 + 3.4.0