aboutsummaryrefslogtreecommitdiffstats
path: root/aai-traversal/src/main/java/org/onap/aai/rest/search/GremlinServerSingleton.java
blob: e4ac815320fc1f1ef3a81b142a03ba6923d1a8b8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/**
 * ============LICENSE_START=======================================================
 * org.onap.aai
 * ================================================================================
 * Copyright © 2017 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.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * ============LICENSE_END=========================================================
 *
 * ECOMP is a trademark and service mark of AT&T Intellectual Property.
 */
package org.onap.aai.rest.search;

import org.onap.aai.util.AAIConstants;
import org.onap.aai.util.FileWatcher;
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
import org.apache.tinkerpop.gremlin.driver.Cluster;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Date;
import java.util.Properties;
import java.util.Timer;
import java.util.TimerTask;

public class GremlinServerSingleton {

    private static EELFLogger logger = EELFManager.getInstance().getLogger(GremlinServerSingleton.class);

    private Cluster cluster;
    private boolean timerSet;
    private Timer timer;
    private Properties properties;

    private static class Helper {
        private static final GremlinServerSingleton INSTANCE = new GremlinServerSingleton();
    }

    public static GremlinServerSingleton getInstance() {
        return Helper.INSTANCE;
    }

    private GremlinServerSingleton(){
        init();
    }

    /**
     * Initializes the gremlin server singleton
     * Loads the configuration of the gremlin server and creates a cluster
     * Loads the gremlin query file into the properties object
     * Then creates a file watcher to watch the file every ten seconds
     * and if there is a change in the file, then reloads the file into
     * the properties object
     *
     */
    private void init() {

        properties = new Properties();

        try {
            cluster = Cluster.build(new File(AAIConstants.AAI_HOME_ETC_APP_PROPERTIES + "gremlin-server-config.yaml"))
                    .maxContentLength(6537920)
                    .create();
        } catch (FileNotFoundException e) {
            logger.error("Unable to find the file: " + e);
        }

        File queryFile = new File(AAIConstants.AAI_HOME_ETC_QUERY);

        try (FileInputStream fis = new FileInputStream(queryFile)){
            properties.load(fis);
        } catch (IOException e) {
            logger.error("Error occurred during the processing of query file: " + e);
        }


        TimerTask task = new FileWatcher(new File(AAIConstants.AAI_HOME_ETC_QUERY)) {
            @Override
            protected void onChange(File file) {
                File queryFile = new File(AAIConstants.AAI_HOME_ETC_QUERY);
                try (FileInputStream fis = new FileInputStream(queryFile)){
                    properties.load(fis);
                    logger.debug("File: " + file + " was changed so the cluster is rebuild for gremlin server");
                } catch (FileNotFoundException e) {
                    logger.error("Unable to find the file: " + e);
                } catch (IOException e) {
                    logger.error("Error occurred during the processing of query file: " + e);
                }
            }
        };

        if (!timerSet) {
            timerSet = true;
            timer = new Timer();
            timer.schedule( task , new Date(), 10000 );
        }

    }

    public Cluster getCluster(){
        return cluster;
    }

    /**
     * Gets the key if the properties contains that key
     *
     * Purposely not checking if the property exists due
     * to if you check for the property and then get the property
     * Then you are going to have to synchronize the method
     *
     * @param key the query to check if it exists in the file
     * @return string if the key exists or null if it doesn't
     */
    public String getStoredQuery(String key){
        return (String) properties.get(key);
    }

}