base changes to support offline pdpd

Issue-ID: POLICY-2191
Signed-off-by: jhh <jorge.hernandez-herrero@att.com>
Change-Id: I6f8029c1c771905357971331988a9b8408a93f10
Signed-off-by: jhh <jorge.hernandez-herrero@att.com>
diff --git a/packages/base/src/files/etc/m2/settings.xml b/packages/base/src/files/etc/m2/settings.xml
index 8530ae5..21212e0 100644
--- a/packages/base/src/files/etc/m2/settings.xml
+++ b/packages/base/src/files/etc/m2/settings.xml
@@ -17,14 +17,16 @@
   See the License for the specific language governing permissions and
   limitations under the License.
   ============LICENSE_END=========================================================
-  -->
+-->
 
 
 <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
-          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
 
-  <profiles>
+    <offline>false</offline>
+
+    <profiles>
 
         <profile>
             <id>policy-local</id>
@@ -46,105 +48,104 @@
 
         </profile>
 
-    <profile>
-      <id>policy-releases</id>
+        <profile>
+            <id>policy-releases</id>
 
-      <repositories>
-        <repository>
-          <id>${env.RELEASE_REPOSITORY_ID}</id>
-          <url>${env.RELEASE_REPOSITORY_URL}</url>
-          <releases>
-            <enabled>true</enabled>
-          </releases>
-          <snapshots>
-            <enabled>false</enabled>
-          </snapshots>
-        </repository>
-      </repositories>
+            <repositories>
+                <repository>
+                    <id>${env.RELEASE_REPOSITORY_ID}</id>
+                    <url>${env.RELEASE_REPOSITORY_URL}</url>
+                    <releases>
+                        <enabled>true</enabled>
+                        <updatePolicy>always</updatePolicy>
+                    </releases>
+                    <snapshots>
+                        <enabled>false</enabled>
+                    </snapshots>
+                </repository>
+            </repositories>
 
-    </profile>
+        </profile>
 
-    <profile>
-      <id>policy-snapshots</id>
+        <profile>
+            <id>policy-snapshots</id>
 
-      <repositories>
-        <repository>
-          <id>${env.SNAPSHOT_REPOSITORY_ID}</id>
-          <url>${env.SNAPSHOT_REPOSITORY_URL}</url>
-          <releases>
-            <enabled>false</enabled>
-          </releases>
-          <snapshots>
-            <enabled>true</enabled>
-            <updatePolicy>always</updatePolicy>
-          </snapshots>
-        </repository>
-      </repositories>
+            <repositories>
+                <repository>
+                    <id>${env.SNAPSHOT_REPOSITORY_ID}</id>
+                    <url>${env.SNAPSHOT_REPOSITORY_URL}</url>
+                    <releases>
+                        <enabled>false</enabled>
+                    </releases>
+                    <snapshots>
+                        <enabled>true</enabled>
+                        <updatePolicy>always</updatePolicy>
+                    </snapshots>
+                </repository>
+            </repositories>
 
-    </profile>
+        </profile>
 
-    <profile>
-      <id>onap-releases</id>
+        <profile>
+            <id>onap-releases</id>
 
-      <repositories>
-        <repository>
-          <id>onap-releases</id>
-          <name>onap-releases</name>
-          <url>https://nexus.onap.org/content/repositories/releases/</url>
-          <releases>
-            <enabled>true</enabled>
-          </releases>
-          <snapshots>
-            <enabled>false</enabled>
-          </snapshots>
-        </repository>
-      </repositories>
+            <repositories>
+                <repository>
+                    <id>onap-releases</id>
+                    <name>onap-releases</name>
+                    <url>https://nexus.onap.org/content/repositories/releases/</url>
+                    <releases>
+                        <enabled>true</enabled>
+                    </releases>
+                    <snapshots>
+                        <enabled>false</enabled>
+                    </snapshots>
+                </repository>
+            </repositories>
 
-    </profile>
+        </profile>
 
-    <profile>
+        <profile>
 
-      <id>onap-snapshots</id>
+            <id>onap-snapshots</id>
 
-      <repositories>
-        <repository>
-          <id>onap-snapshots</id>
-          <name>onap-snapshots</name>
-          <url>https://nexus.onap.org/content/repositories/snapshots/</url>
-          <releases>
-            <enabled>false</enabled>
-          </releases>
-          <snapshots>
-            <enabled>true</enabled>
-            <updatePolicy>always</updatePolicy>
-          </snapshots>
-        </repository>
-      </repositories>
+            <repositories>
+                <repository>
+                    <id>onap-snapshots</id>
+                    <name>onap-snapshots</name>
+                    <url>https://nexus.onap.org/content/repositories/snapshots/</url>
+                    <releases>
+                        <enabled>false</enabled>
+                    </releases>
+                    <snapshots>
+                        <enabled>true</enabled>
+                    </snapshots>
+                </repository>
+            </repositories>
 
-    </profile>
+        </profile>
 
-  </profiles>
+    </profiles>
 
-  <activeProfiles>
-    <activeProfile>policy-local</activeProfile>
-    <activeProfile>policy-releases</activeProfile>
-    <activeProfile>policy-snapshots</activeProfile>
-    <activeProfile>onap-releases</activeProfile>
-    <activeProfile>onap-snapshots</activeProfile>
-  </activeProfiles>
+    <activeProfiles>
+        <activeProfile>policy-local</activeProfile>
+        <activeProfile>policy-releases</activeProfile>
+        <activeProfile>policy-snapshots</activeProfile>
+        <activeProfile>onap-releases</activeProfile>
+        <activeProfile>onap-snapshots</activeProfile>
+    </activeProfiles>
 
-  <servers>
-    <server>
-      <id>${env.SNAPSHOT_REPOSITORY_ID}</id>
-      <username>${env.REPOSITORY_USERNAME}</username>
-      <password>${env.REPOSITORY_PASSWORD}</password>
-    </server>
-    <server>
-      <id>${env.RELEASE_REPOSITORY_ID}</id>
-      <username>${env.REPOSITORY_USERNAME}</username>
-      <password>${env.REPOSITORY_PASSWORD}</password>
-    </server>
-  </servers>
+    <servers>
+        <server>
+            <id>${env.SNAPSHOT_REPOSITORY_ID}</id>
+            <username>${env.REPOSITORY_USERNAME}</username>
+            <password>${env.REPOSITORY_PASSWORD}</password>
+        </server>
+        <server>
+            <id>${env.RELEASE_REPOSITORY_ID}</id>
+            <username>${env.REPOSITORY_USERNAME}</username>
+            <password>${env.REPOSITORY_PASSWORD}</password>
+        </server>
+    </servers>
 
 </settings>
-
diff --git a/packages/base/src/files/etc/m2/standalone-settings.xml b/packages/base/src/files/etc/m2/standalone-settings.xml
index 39e7751..e19180e 100644
--- a/packages/base/src/files/etc/m2/standalone-settings.xml
+++ b/packages/base/src/files/etc/m2/standalone-settings.xml
@@ -17,12 +17,14 @@
   See the License for the specific language governing permissions and
   limitations under the License.
   ============LICENSE_END=========================================================
-  -->
+-->
 
 
 <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
-          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
+
+    <offline>false</offline>
 
     <profiles>
 
@@ -66,26 +68,6 @@
         </profile>
 
         <profile>
-            <id>onap-staging</id>
-
-            <repositories>
-                <repository>
-                    <id>onap-staging</id>
-                    <name>onap-staging</name>
-                    <url>https://nexus.onap.org/content/repositories/staging/</url>
-                    <releases>
-                        <enabled>true</enabled>
-                        <updatePolicy>always</updatePolicy>
-                    </releases>
-                    <snapshots>
-                        <enabled>false</enabled>
-                    </snapshots>
-                </repository>
-            </repositories>
-
-        </profile>
-
-        <profile>
             <id>onap-snapshots</id>
 
             <repositories>
@@ -98,7 +80,6 @@
                     </releases>
                     <snapshots>
                         <enabled>true</enabled>
-                        <updatePolicy>always</updatePolicy>
                     </snapshots>
                 </repository>
             </repositories>
@@ -110,9 +91,7 @@
     <activeProfiles>
         <activeProfile>policy-local</activeProfile>
         <activeProfile>onap-releases</activeProfile>
-        <activeProfile>onap-staging</activeProfile>
         <activeProfile>onap-snapshots</activeProfile>
     </activeProfiles>
 
 </settings>
-
diff --git a/packages/install/src/files/base.conf b/packages/install/src/files/base.conf
index 1f5deec..28591d4 100644
--- a/packages/install/src/files/base.conf
+++ b/packages/install/src/files/base.conf
@@ -45,6 +45,7 @@
 RELEASE_REPOSITORY_URL=
 REPOSITORY_USERNAME=
 REPOSITORY_PASSWORD=
+REPOSITORY_OFFLINE=
 
 # Relational (SQL) DB access
 
diff --git a/policy-management/src/main/server-gen/bin/deploy-artifact b/policy-management/src/main/server-gen/bin/deploy-artifact
index 81f5f14..2fc101b 100644
--- a/policy-management/src/main/server-gen/bin/deploy-artifact
+++ b/policy-management/src/main/server-gen/bin/deploy-artifact
@@ -4,7 +4,7 @@
 # ============LICENSE_START=======================================================
 # ONAP
 # ================================================================================
-# Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+# Copyright (C) 2018-2019 AT&T Intellectual Property. All rights reserved.
 # ================================================================================
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -27,17 +27,117 @@
 function usage() {
     echo
     echo -e "syntax: $(basename "$0") "
-    echo -e "\t [-f]"
+    echo -e "\t [-f|-l|-d]"
+    echo -e "\t -s <custom-settings> "
     echo -e "\t -a <artifact> "
     echo
     echo -e "Options:"
-    echo -e "\t -f|--file-repo: deployment in the file repository"
-    echo -e "\t -a|--artifact: file artifact (jar or pom) to deploy"
+    echo -e "\t -f|--file-repo: deploy in the file repository"
+    echo -e "\t -l|--local-repo: install in the local repository"
+    echo -e "\t -d|--dependencies: install dependencies in the local repository"
+    echo -e "\t -s|--settings: custom settings.xml"
+    echo -e "\t -a|--artifact: file artifact (jar or pom) to deploy and/or install"
     echo
     echo
 }
 
 ##############################################################################
+# Usage: init <artifact>
+#
+# If the artifact is a jar, this function extracts the maven metadata for
+# consumption in this script.
+#
+# As a result the global variables will be set:
+# WORKING_DIR: working directory with extracted files.
+# WORKING_POM: pom file location
+# WORKING_POM_PROPERTIES: pom properties file location
+##############################################################################
+
+function init
+{
+    if [[ ${DEBUG} == y ]]; then
+        echo "-- ${FUNCNAME[0]} $* --"
+        set -x
+    fi
+
+    local artifact="${1}"
+    if [[ ! -f ${artifact} ]]; then
+        echo "${artifact}: artifact does not exist"
+        return 1
+    fi
+
+    if [[ ${artifact} != *.jar ]]; then
+        return 0
+    fi
+
+    local dir=$(mktemp -d)
+    local jar="${artifact##*/}"
+
+    WORKING_DIR=$(realpath "${dir}")
+
+    cp -p "${artifact}" "${WORKING_DIR}/${jar}"
+    pushd "${dir}"
+
+    local rc=0
+
+    # determine name of 'pom' file within JAR
+    local pom=$(jar tf "${jar}" META-INF | grep '/pom\.xml$' | head -1)
+    if [[ -n ${pom} ]] ; then
+        jar xf "${jar}" "${pom}"
+        WORKING_POM=$(realpath "${pom}")
+    else
+        echo "${artifact}: pom not found"
+    fi
+
+    local pomProperties=$(jar tf "${jar}" META-INF | grep '/pom\.properties$' | head -1)
+    if [[ -n ${pomProperties} ]]; then
+        jar xf "${jar}" "${pomProperties}"
+        WORKING_POM_PROPERTIES=$(realpath ${pomProperties})
+        source "${WORKING_POM_PROPERTIES}"
+        echo "${artifact}: sourcing in ${WORKING_POM_PROPERTIES}"
+    else
+        echo "${artifact}: pom.properties not found"
+        if [[ -n ${WORKING_POM} ]]; then
+            if ! getPomAttributes "${WORKING_POM}" artifactId groupId version ; then
+                echo "${WORKING_POM}: cannot extract maven coordinates"
+                rc=1
+            fi
+        else
+            echo "${artifact}: cannot extract maven coordinates"
+            rc=1
+        fi
+    fi
+
+    if [[ -z ${version} ]] || [[ -z ${groupId} ]] || [[ -z ${artifactId} ]]; then
+        echo "${artifact}: some coordinates cannot be extracted"
+        rc=1
+    fi
+
+    echo "${artifact}: coordinates ${groupId}:${artifactId}:${version}"
+    popd
+
+    return ${rc}
+}
+
+##############################################################################
+# Usage: cleanup
+#
+# Clean up temporary resources.
+##############################################################################
+
+function cleanup
+{
+    if [[ ${DEBUG} == y ]]; then
+        echo "-- ${FUNCNAME[0]} $* --"
+        set -x
+    fi
+
+    if [[ -n ${WORKING_DIR} ]]; then
+        rm -rf "${WORKING_DIR}"
+    fi
+}
+
+##############################################################################
 # Usage: getPomAttributes <pom-file> <attribute> ...
 #
 # This function performs simplistic parsing of a 'pom.xml' file, extracting
@@ -54,7 +154,7 @@
 
     local file="$1"
     if [[ ! -f "${file}" ]]; then
-        echo "{1}: file does not exist"
+        echo "${file}: file does not exist"
         return 1
     fi
 
@@ -92,7 +192,7 @@
                 <"${file}")
 
             if [[ "${value}" == "" ]] ; then
-                echo "${file}: Can't determine ${attr}" >&2
+                echo "${file}: Can't determine ${attr}"
                 rval=1
             fi
         fi
@@ -104,8 +204,6 @@
     return ${rval}
 }
 
-
-
 ##############################################################################
 # Usage: deployJar <jar-file>
 #
@@ -120,65 +218,40 @@
         set -x
     fi
 
-    local artifact="${1}"
-    if [[ ! -f "${artifact}" ]]; then
-        echo "{artifact}: does not exist"
+    local file="${1}"
+
+    if [[ ! -f ${file} ]]; then
         return 1
     fi
 
-    local dir=$(mktemp -d)
-    local jar="${artifact##*/}"
+    local repoId repoUrl
+    if [[ "${version}" =~ SNAPSHOT ]] ; then
+        repoId=${SNAPSHOT_REPOSITORY_ID}
+        repoUrl=${SNAPSHOT_REPOSITORY_URL}
+    else
+        repoId=${RELEASE_REPOSITORY_ID}
+        repoUrl=${RELEASE_REPOSITORY_URL}
+    fi
 
-    cp -p "${artifact}" "${dir}/${jar}"
+    if [[ -z ${repoUrl} ]] || [[ -z ${repoId} ]]; then
+        echo "{file}: no repository id/url to deploy jar"
+        return 1
+    fi
 
-    (
-        local rval=0
-        cd "${dir}"
+    echo "${file}: deploying jar artifact to repository ${repoId}: ${repoUrl}"
+    echo "${file}: coordinates ${groupId} ${artifactId} ${version}"
 
-        # determine name of 'pom' file within JAR
-        local pom=$(jar tf "${jar}" META-INF | grep '/pom\.xml$' | head -1)
-        if [[ -z ${pom} ]] ; then
-            echo "${jar}: Can't find 'pom.xml'" >&2
-            return 1
-        fi
-        jar xf "${jar}" "${pom}"
+    mvn ${CUSTOM_SETTINGS} deploy:deploy-file \
+        -Dfile="${file}" \
+        -Dversion="${version}" \
+        -Dpackaging=jar \
+        -DgeneratePom=false \
+        -DpomFile="${WORKING_POM}" \
+        -DrepositoryId="${repoId}" \
+        -Durl="${repoUrl}" \
+        -DupdateReleaseInfo=true
 
-        local pomProperties=$(jar tf "${jar}" META-INF | grep '/pom\.properties$' | head -1)
-        if [[ -n ${pomProperties} ]] ; then
-            # extract pom file
-            jar xf "${jar}" "${pomProperties}"
-            source "${pomProperties}"
-        fi
-
-        if [[ -z ${version} ]]; then
-            if ! getPomAttributes "${pom}" version ; then
-                echo "${pom}: Can't extract 'version' from pom" >&2
-                return 2
-            fi
-        fi
-
-        local repoId repoUrl
-        if [[ "${version}" =~ SNAPSHOT ]] ; then
-            repoId=${SNAPSHOT_REPOSITORY_ID}
-            repoUrl=${SNAPSHOT_REPOSITORY_URL}
-        else
-            repoId=${RELEASE_REPOSITORY_ID}
-            repoUrl=${RELEASE_REPOSITORY_URL}
-        fi
-
-        echo "${artifact}: Deploying JAR artifact to repository ${repoUrl} (${repoId})"
-        mvn deploy:deploy-file \
-            -Dfile="${jar}" \
-            -Dversion="${version}" \
-            -Dpackaging=jar -DgeneratePom=false -DpomFile="${pom}" \
-            -DrepositoryId="${repoId}" -Durl="${repoUrl}" \
-            -DupdateReleaseInfo=true
-
-        retval=${?}
-        rm -rf "${dir}"
-
-        return ${retval}
-    )
+    return ${?}
 }
 
 ##############################################################################
@@ -196,39 +269,45 @@
 
     local file="${1}"
 
-    if [[ -f ${file} ]]; then
+    if [[ ! -f ${file} ]]; then
         return 1
     fi
 
-    # need to extract attributes from POM file
-    if getPomAttributes "${1}" artifactId groupId version ; then
-        local repoId repoUrl
-        if [[ "${version}" =~ SNAPSHOT ]] ; then
-            repoId=${SNAPSHOT_REPOSITORY_ID}
-            repoUrl=${SNAPSHOT_REPOSITORY_URL}
-        else
-            repoId=${RELEASE_REPOSITORY_ID}
-            repoUrl=${RELEASE_REPOSITORY_URL}
-        fi
+    if ! getPomAttributes "${file}" artifactId groupId version ; then
+        echo "${file}: cannot deploy pom due to missing attributes"
+        return 1
+    fi
 
-        echo "${file}: Deploying POM artifact to remote repository"
-        mvn deploy:deploy-file -Dfile="${file}" \
-            -Dpackaging=pom -DgeneratePom=false \
-            -DgroupId="${groupId}" \
-            -DartifactId="${artifactId}" \
-            -Dversion="${version}" \
-            -DrepositoryId="${repoId}" -Durl="${repoUrl}" \
-            -DupdateReleaseInfo=true
+    local repoId repoUrl
+    if [[ "${version}" =~ SNAPSHOT ]] ; then
+        repoId=${SNAPSHOT_REPOSITORY_ID}
+        repoUrl=${SNAPSHOT_REPOSITORY_URL}
     else
-        echo "${file}: Can't install pom due to missing attributes" >&2
-        return 1
+        repoId=${RELEASE_REPOSITORY_ID}
+        repoUrl=${RELEASE_REPOSITORY_URL}
     fi
+
+    echo "${file}: deploying pom artifact to repository ${repoId}: ${repoUrl}"
+    echo "${file}: coordinates ${groupId} ${artifactId} ${version}"
+
+    mvn ${CUSTOM_SETTINGS} deploy:deploy-file \
+        -Dfile="${file}" \
+        -Dpackaging=pom \
+        -DgeneratePom=false \
+        -DgroupId="${groupId}" \
+        -DartifactId="${artifactId}" \
+        -Dversion="${version}" \
+        -DrepositoryId="${repoId}" \
+        -Durl="${repoUrl}" \
+        -DupdateReleaseInfo=true
+
+    return ${?}
 }
 
 ##############################################################################
 # Usage: deployArtifact
 #
-# This function deploys a maven artifacts in a repository
+# This function deploys a maven artifact in a repository
 ##############################################################################
 
 function deployArtifact
@@ -252,14 +331,142 @@
     case "${file}" in
         *pom.xml|*.pom)
             deployPom "${file}"
+            return ${?}
             ;;
         *.jar)
             deployJar "${file}"
+            return ${?}
             ;;
-        *)  echo "${file}: Don't know how to install artifact" >&2
-            return 2
+        *)  echo "${file}: Don't know how to deploy artifact"
+            return 1
             ;;
     esac
+}
+
+##############################################################################
+# Usage: installJar <artifact-file>
+#
+# This function installs a jar packaged artifact in the local repository
+##############################################################################
+
+function installJar
+{
+    if [[ ${DEBUG} == y ]]; then
+        echo "-- ${FUNCNAME[0]} $* --"
+        set -x
+    fi
+
+    local file="${1}"
+
+    if [[ ! -f ${file} ]]; then
+        return 1
+    fi
+
+    mvn ${CUSTOM_SETTINGS} org.apache.maven.plugins:maven-install-plugin:3.0.0-M1:install-file \
+        -Dfile="${file}"
+
+    return $?
+}
+
+##############################################################################
+# Usage: installPom <pom-file>
+#
+# This function installs a pom file in the local repository
+##############################################################################
+
+function installPom
+{
+    if [[ ${DEBUG} == y ]]; then
+        echo "-- ${FUNCNAME[0]} $* --"
+        set -x
+    fi
+
+    local file="${1}"
+
+    if [[ ! -f ${file} ]]; then
+        return 1
+    fi
+
+    mvn ${CUSTOM_SETTINGS} org.apache.maven.plugins:maven-install-plugin:3.0.0-M1:install-file \
+        -Dpackaging=pom \
+        -Dfile="${file}" \
+        -DpomFile="${file}"
+
+    return $?
+}
+
+##############################################################################
+# Usage: installArtifact
+#
+# This function installs a maven artifacts in the local repository
+##############################################################################
+
+function installArtifact
+{
+    if [[ ${DEBUG} == y ]]; then
+        echo "-- ${FUNCNAME[0]} $* --"
+        set -x
+    fi
+
+    local file="${1}"
+    if [[ -z "${file}" ]]; then
+        echo "${file}: artifact file not provided"
+        return 1
+    fi
+
+    if [[ ! -f "${file}" ]]; then
+        echo "${file}: artifact file does not exist"
+        return 1
+    fi
+
+    case "${file}" in
+        *pom.xml|*.pom)
+            installPom "${file}"
+            return ${?}
+            ;;
+        *.jar)
+            installJar "${file}"
+            return ${?}
+            ;;
+        *)  echo "${file}: Don't know how to install the artifact"
+            return 1
+            ;;
+    esac
+}
+
+##############################################################################
+# Usage: installDependencies <pom-file>
+#
+# This function installs the dependencies of an artifact in the file or
+# local repository
+##############################################################################
+
+function installDependencies
+{
+    if [[ ${DEBUG} == y ]]; then
+        echo "-- ${FUNCNAME[0]} $* --"
+        set -x
+    fi
+
+    local file="${1}"
+
+    if [[ ! -f ${file} ]]; then
+        return 1
+    fi
+
+    if [[ -z ${DEPENDENCY_REPO_URL} ]]; then
+        echo "${file}: no repo url to install dependencies"
+        return 1
+    fi
+
+    echo "${file}: deploying dependencies from repository ${DEPENDENCY_REPO_URL}"
+    echo "${file}: coordinates ${groupId} ${artifactId} ${version}"
+
+    mvn ${CUSTOM_SETTINGS} org.apache.maven.plugins:maven-dependency-plugin:3.1.1:get \
+        -DartifactId="${artifactId}" \
+        -DgroupId="${groupId}" \
+        -Dversion="${version}" \
+        -DremoteRepositories="${DEPENDENCY_REPO_URL}"
 
     return ${?}
 }
@@ -273,46 +480,114 @@
     set -x
 fi
 
-retval=0
+# reset globals
+
+unset ARTIFACT_FILE
+unset LOCAL_INSTALL
+unset INSTALL_DEPS
+unset FILE_REPO_INSTALL
+unset WORKING_DIR
+unset WORKING_POM
+unset WORKING_POM_PROPERTIES
+unset DEPENDENCY_REPO_URL
+unset SETTINGS_FILE
+unset CUSTOM_SETTINGS
+
+# process input
 
 until [[ -z "$1" ]]; do
     case $1 in
-        -a|--artifact)  shift
-                        ARTIFACT=$1
-                        ;;
-        -f|--file-repo) FILE_REPO_ID="file-repository"
-                        FILE_REPO_URL="file:${HOME}/.m2/file-repository"
-                        ;;
-        *)              usage
-                        exit 1
-                        ;;
+        -a|--artifact)     shift
+                           ARTIFACT_FILE=$1
+                           ;;
+        -s|--settings)     shift
+                           SETTINGS_FILE=$1
+                           ;;
+        -l|--local-repo)   LOCAL_INSTALL="true"
+                           ;;
+        -d|--dependencies) INSTALL_DEPS="true"
+                           ;;
+        -f|--file-repo)    FILE_REPO_INSTALL="true"
+                           ;;
+        *)                 usage
+                           exit 1
+                           ;;
     esac
     shift
 done
 
-if [[ -z ${ARTIFACT} ]]; then
+if [[ -z ${ARTIFACT_FILE} ]]; then
     echo "No artifact file provided: $*"
     usage
     exit 1
 fi
 
-if [[ -n ${SNAPSHOT_REPOSITORY_URL} ]] && [[ -n ${RELEASE_REPOSITORY_URL} ]]; then
-    deployArtifact "${ARTIFACT}"
-    retval=${?}
-else
-    FILE_REPO_ID="file-repository"
-    FILE_REPO_URL="file:${HOME}/.m2/file-repository"
+if [[ -n ${SETTINGS_FILE} ]]; then
+    CUSTOM_SETTINGS="--settings=${SETTINGS_FILE}"
 fi
 
-if [[ -n ${FILE_REPO_ID} ]]; then
+# retval has the count of failed operations
+
+retval=0
+
+# initialize
+
+init "${ARTIFACT_FILE}"
+retval=$?
+if [[ ${retval} != 0 ]]; then
+    cleanup
+    exit ${retval}
+fi
+
+# remote repo deploy operation
+#
+# SNAPSHOT_REPOSITORY_URL and RELEASE_REPOSITORY_URL
+# are pre-existing environmental variables (base.conf)
+
+if [[ -n ${SNAPSHOT_REPOSITORY_URL} ]] || [[ -n ${RELEASE_REPOSITORY_URL} ]]; then
+    deployArtifact "${ARTIFACT_FILE}"
+    retval=$(( retval + ${?} ))
+fi
+
+# deploy in file repository
+
+if [[ -n ${FILE_REPO_INSTALL} ]]; then
+    FILE_REPO_ID="file-repository"
+    FILE_REPO_URL="file:${HOME}/.m2/file-repository"
+
     SNAPSHOT_REPOSITORY_ID="${FILE_REPO_ID}"
     SNAPSHOT_REPOSITORY_URL="${FILE_REPO_URL}"
     RELEASE_REPOSITORY_ID="${FILE_REPO_ID}"
     RELEASE_REPOSITORY_URL="${FILE_REPO_URL}"
 
     mkdir -p "${FILE_REPO_URL#file:}" 2> /dev/null
-    deployArtifact "${ARTIFACT}"
-    retval=${?}
+    deployArtifact "${ARTIFACT_FILE}"
+    retval=$(( retval + ${?} ))
 fi
 
+# install in local repository
+
+if [[ -n ${LOCAL_INSTALL} ]]; then
+    installArtifact "${ARTIFACT_FILE}"
+    retval=$(( retval + ${?} ))
+fi
+
+# install dependencies in local and/or file repositories
+
+if [[ -n ${INSTALL_DEPS} ]]; then
+    if [[ -n ${FILE_REPO_INSTALL} ]]; then
+        DEPENDENCY_REPO_URL="${FILE_REPO_URL}"
+        installDependencies "${ARTIFACT_FILE}"
+        retval=$(( retval + ${?} ))
+    fi
+
+    if [[ -n ${LOCAL_INSTALL} ]]; then
+        DEPENDENCY_REPO_URL="file:${HOME}/.m2/repository"
+        installDependencies "${ARTIFACT_FILE}"
+        retval=$(( retval + ${?} ))
+    fi
+fi
+
+cleanup
+
 exit ${retval}
diff --git a/policy-management/src/main/server-gen/bin/features b/policy-management/src/main/server-gen/bin/features
index 8aa863c..2646c04 100644
--- a/policy-management/src/main/server-gen/bin/features
+++ b/policy-management/src/main/server-gen/bin/features
@@ -612,7 +612,7 @@
 
 	artifacts=$(ls "${FEATURES}"/"${featureName}"/"${FEATURE_ARTIFACTS}"/* 2> /dev/null)
 	for artifactPath in ${artifacts}; do
-	    deploy-artifact -f -a "${artifactPath}"
+	    deploy-artifact -l -a "${artifactPath}"
 	done
 }
 
diff --git a/policy-management/src/main/server/config/engine-system.properties b/policy-management/src/main/server/config/engine-system.properties
index a61df28..cded4f2 100644
--- a/policy-management/src/main/server/config/engine-system.properties
+++ b/policy-management/src/main/server/config/engine-system.properties
@@ -36,6 +36,10 @@
 javax.net.ssl.keyStore=${envd:POLICY_HOME:/opt/app/policy}/etc/ssl/policy-keystore
 javax.net.ssl.keyStorePassword=${envd:KEYSTORE_PASSWD}
 
+# kie
+
+kie.maven.offline.force=${envd:REPOSITORY_OFFLINE:false}
+
 # symmetric key for sensitive configuration data
 
-engine.symm.key=${envd:SYMM_KEY}
\ No newline at end of file
+engine.symm.key=${envd:SYMM_KEY}