View Javadoc

1   package org.kuali.ole.docstore.discovery.util;
2   
3   import java.io.File;
4   import java.io.IOException;
5   import java.util.ArrayList;
6   import java.util.List;
7   
8   import org.apache.commons.io.FileUtils;
9   import org.apache.commons.lang.StringUtils;
10  import org.kuali.ole.utility.Constants;
11  import org.kuali.ole.utility.ResourceItem;
12  import org.kuali.ole.utility.ResourceUtil;
13  import org.slf4j.Logger;
14  import org.slf4j.LoggerFactory;
15  
16  /**
17   * Created by IntelliJ IDEA. User: Sreekanth Date: 6/6/12 Time: 2:41 PM To change this template use File | Settings | File Templates.
18   */
19  public class DiscoveryEnvUtil {
20      private static final Logger LOG = LoggerFactory.getLogger(DiscoveryEnvUtil.class);
21      public static final String DISCOVERY_ROOT_DIR = "discovery";
22      public static final String DISCOVERY_ROOT_DEFAULT = "/opt/docstore/" + DISCOVERY_ROOT_DIR;
23      public static final String DISCOVERY_ROOT_TEST_DEFAULT = System.getProperty("user.home")+"/kuali/main/local/docstore-test/discovery-test";
24      public static final String SOLR_CONFIG_FOLDER = "solr-config";
25      public static final String SOLR_DATA_FOLDER = "solr-indexes";
26      public static final String DISCOVERY_PROPERTIES_FOLDER = "properties";
27      public static final String DISCOVERY_PROPERTIES_FILE = "ole-discovery.properties";
28      public static final String UTF8 = "UTF-8";
29  
30      protected String rootFolderPath;
31      protected String solrConfigFolderPath;
32      protected String solrDataFolderPath;
33      protected String discoveryPropertyFolderPath;
34      protected String discoveryPropertiesFilePath;
35      private boolean testEnv = false;
36      ResourceUtil resourceUtil = new ResourceUtil();
37  
38      /**
39       * Initializes environment for normal use of discovery. This should be called during web app initialization.
40       */
41      public void initEnvironment() {
42          initEnv(DISCOVERY_ROOT_DEFAULT);
43      }
44  
45      /**
46       * Initializes environment for testing. This should be called in all test cases.
47       */
48      public void initTestEnvironment() {
49          testEnv = true;
50          initEnv(DISCOVERY_ROOT_TEST_DEFAULT);
51      }
52  
53      /**
54       * Configure the home directory for discovery. When this method return, the system property <code>ole.discover.home</code> is guaranteed to be set.
55       */
56      protected void initEnv(String defaultDiscoveryHome) {
57          String discoveryHome = getDiscoveryHome(defaultDiscoveryHome);
58          LOG.info(Constants.OLE_DISCOVERY_HOME_SYSTEM_PROPERTY + "=" + discoveryHome);
59          System.setProperty(Constants.OLE_DISCOVERY_HOME_SYSTEM_PROPERTY, discoveryHome);
60          initEnvironmentCommon(discoveryHome);
61      }
62  
63      /**
64       * Logic for determining the correct home directory for discovery. The directory to use can be configured by system property settings. If no system property is set, discovery
65       * home becomes a path relative to docstore home. If docstore home is not set, it falls through to the default value.
66       */
67      public String getDiscoveryHome(String defaultDiscoveryHome) {
68          String direct = System.getProperty(Constants.OLE_DISCOVERY_HOME_SYSTEM_PROPERTY);
69          if (!StringUtils.isBlank(direct)) {
70              return direct;
71          }
72          String docstoreHome = System.getProperty(Constants.OLE_DOCSTORE_HOME_SYSTEM_PROPERTY);
73          if (StringUtils.isBlank(docstoreHome)) {
74              return defaultDiscoveryHome;
75          } else {
76              return docstoreHome + "/" + DISCOVERY_ROOT_DIR;
77          }
78      }
79  
80      public void initPathValues(String discoveryRoot) {
81          rootFolderPath = discoveryRoot;
82          solrConfigFolderPath = discoveryRoot.concat("/").concat(SOLR_CONFIG_FOLDER);
83          solrDataFolderPath = discoveryRoot.concat("/").concat(SOLR_DATA_FOLDER);
84          discoveryPropertyFolderPath = discoveryRoot.concat("/").concat(DISCOVERY_PROPERTIES_FOLDER);
85          discoveryPropertiesFilePath = discoveryPropertyFolderPath.concat("/").concat(DISCOVERY_PROPERTIES_FILE);
86      }
87  
88      /**
89       * Initializes an environment for discovery at the given root folder. Looks for necessary folders and files under the root folder. Any resources that already exist are left
90       * untouched. Any that are missing are created using default values.
91       */
92      public void initEnvironmentCommon(String docStoreRoot) {
93          initPathValues(docStoreRoot);
94          handleSolrConfig();
95          List<ResourceItem> resourceItems = getResourceItems();
96          for (ResourceItem item : resourceItems) {
97              resourceUtil.validate(item);
98          }
99      }
100 
101     protected void handleSolrConfig() {
102         String srcLoc = "";
103         try {
104             File solrConfigDir = new File(solrConfigFolderPath);
105             // The directory already exists, leave it alone
106             if (solrConfigDir.isDirectory()) {
107                 return;
108             }
109             if (testEnv) {
110                 String path = getClass().getClassLoader().getResource(".").getPath();
111                 srcLoc = "File:" + path + "/../../../ole-docstore-webapp/src/main/resources/solrconfig";
112             } else {
113                 srcLoc = "classpath:solrconfig";
114             }
115             File srcDir = resourceUtil.getFile(srcLoc);
116             LOG.info("***** Begin Solr Config *****");
117             LOG.info("Source Loc: " + srcLoc);
118             LOG.info("Source Dir: " + srcDir);
119             LOG.info("Dest Dir: " + solrConfigDir);
120             LOG.info("Copying source dir to dest dir...");
121 
122             resourceUtil.copyDirectory(srcLoc, solrConfigDir);
123             File solrConfigXmlFile = new File(solrConfigFolderPath + "/bib/conf/solrconfig.xml");
124             LOG.info("Updating " + solrConfigXmlFile);
125             String oldContent = FileUtils.readFileToString(solrConfigXmlFile, UTF8);
126             int beginIndex = oldContent.indexOf("<dataDir>");
127             int endIndex = oldContent.indexOf("</dataDir>");
128             String oldValue = oldContent.substring(beginIndex, endIndex).concat("</dataDir>");
129             String newValue = "<dataDir>" + solrDataFolderPath + "</dataDir>";
130             LOG.info("Setting datadir=" + solrDataFolderPath);
131             String newContent = oldContent.replace(oldValue, newValue);
132             FileUtils.writeStringToFile(solrConfigXmlFile, newContent, UTF8);
133             LOG.info("***** End Solr Config *****");
134         } catch (IOException e) {
135             throw new IllegalArgumentException(e);
136         }
137 
138     }
139 
140     /**
141      * Return a list of <code>ResourceItem</code> objects representing resources required by discovery
142      */
143     protected List<ResourceItem> getResourceItems() {
144         ResourceItem solrConfigFolder = new ResourceItem();
145         solrConfigFolder.setDestination(new File(solrConfigFolderPath));
146         solrConfigFolder.setSystemProperty("solr.solr.home");
147         solrConfigFolder.setLocalDirectory(true);
148 
149         // ResourceItem discoveryPropertiesFile = new ResourceItem();
150         // discoveryPropertiesFile.setDestination(new File(discoveryPropertiesFilePath));
151         // discoveryPropertiesFile.setSystemProperty("discovery.properties.file");
152         // discoveryPropertiesFile.setSourceLocation("classpath:ole-discovery.properties");
153 
154         List<ResourceItem> items = new ArrayList<ResourceItem>();
155         items.add(solrConfigFolder);
156         // items.add(discoveryPropertiesFile);
157         return items;
158     }
159 
160     public void printEnvironment() {
161 
162         // initEnvironmentCommon(SOLR_CONFIG_FOLDER);
163         System.out.println("**********{{ Discovery Environment **********");
164         System.out.println(Constants.OLE_DISCOVERY_HOME_SYSTEM_PROPERTY + "=" + rootFolderPath);
165         System.out.println("solrConfigFolderPath=" + solrConfigFolderPath);
166         System.out.println("solrDataFolderPath=" + solrDataFolderPath);
167         System.out.println("discoveryPropertyFolderPath=" + discoveryPropertyFolderPath);
168         System.out.println("discoveryPropertiesFilePath=" + discoveryPropertiesFilePath);
169         System.out.println("**********}} Discovery Environment **********");
170     }
171 
172     public void logEnvironment() {
173         LOG.info("**********{{ Discovery Environment **********");
174         LOG.info(Constants.OLE_DISCOVERY_HOME_SYSTEM_PROPERTY + "=" + rootFolderPath);
175         LOG.info("solrConfigFolderPath=" + solrConfigFolderPath);
176         LOG.info("solrDataFolderPath=" + solrDataFolderPath);
177         LOG.info("discoveryPropertyFolderPath=" + discoveryPropertyFolderPath);
178         LOG.info("discoveryPropertiesFilePath=" + discoveryPropertiesFilePath);
179         LOG.info("**********}} Discovery Environment **********");
180 
181     }
182 
183     public String getRootFolderPath() {
184         return rootFolderPath;
185     }
186 
187     public void setRootFolderPath(String rootFolderPath) {
188         this.rootFolderPath = rootFolderPath;
189     }
190 
191     public String getSolrConfigFolderPath() {
192         return solrConfigFolderPath;
193     }
194 
195     public void setSolrConfigFolderPath(String solrConfigFolderPath) {
196         this.solrConfigFolderPath = solrConfigFolderPath;
197     }
198 
199     public String getSolrDataFolderPath() {
200         return solrDataFolderPath;
201     }
202 
203     public void setSolrDataFolderPath(String solrDataFolderPath) {
204         this.solrDataFolderPath = solrDataFolderPath;
205     }
206 
207     public String getDiscoveryPropertyFolderPath() {
208         return discoveryPropertyFolderPath;
209     }
210 
211     public void setDiscoveryPropertyFolderPath(String discoveryPropertyFolderPath) {
212         this.discoveryPropertyFolderPath = discoveryPropertyFolderPath;
213     }
214 
215     public String getDiscoveryPropertiesFilePath() {
216         return discoveryPropertiesFilePath;
217     }
218 
219     public void setDiscoveryPropertiesFilePath(String discoveryPropertiesFilePath) {
220         this.discoveryPropertiesFilePath = discoveryPropertiesFilePath;
221     }
222 }