mirror of
https://github.com/Alfresco/SearchServices.git
synced 2026-09-16 18:12:56 +00:00
Merge branch 'fix/SEARCH-960' into 'master'
Fix/search 960 See merge request search_discovery/insightengine!140
This commit is contained in:
+64
-25
@@ -64,6 +64,8 @@ public class SolrCoreLoadRegistration {
|
||||
public static void registerForCore(AlfrescoCoreAdminHandler adminHandler, CoreContainer coreContainer, SolrCore core,
|
||||
String coreName)
|
||||
{
|
||||
|
||||
|
||||
TrackerRegistry trackerRegistry = adminHandler.getTrackerRegistry();
|
||||
Properties props = new CoreDescriptorDecorator(core.getCoreDescriptor()).getProperties();
|
||||
//Prepare cores
|
||||
@@ -79,10 +81,23 @@ public class SolrCoreLoadRegistration {
|
||||
props.putAll(srv.getProps());
|
||||
adminHandler.getInformationServers().put(coreName, srv);
|
||||
|
||||
SolrTrackerScheduler scheduler = adminHandler.getScheduler();
|
||||
|
||||
// Prevents other threads from registering the ModelTracker at the same time
|
||||
// Create model tracker and load all the persisted models
|
||||
createModelTracker(coreName,
|
||||
trackerRegistry,
|
||||
props,
|
||||
coreContainer.getSolrHome(),
|
||||
repositoryClient,
|
||||
srv,
|
||||
scheduler);
|
||||
|
||||
|
||||
log.info("Starting to track " + coreName);
|
||||
if (Boolean.parseBoolean(props.getProperty("enable.alfresco.tracking", "false")))
|
||||
{
|
||||
SolrTrackerScheduler scheduler = adminHandler.getScheduler();
|
||||
|
||||
if (trackerRegistry.hasTrackersForCore(coreName))
|
||||
{
|
||||
log.info("Trackers for " + coreName+ " is already registered, shutting them down.");
|
||||
@@ -91,28 +106,7 @@ public class SolrCoreLoadRegistration {
|
||||
adminHandler.getInformationServers().remove(coreName);
|
||||
}
|
||||
|
||||
// Prevents other threads from registering the ModelTracker at the same time
|
||||
synchronized (SolrCoreLoadRegistration.class)
|
||||
{
|
||||
ModelTracker mTracker = trackerRegistry.getModelTracker();
|
||||
if (mTracker == null)
|
||||
{
|
||||
log.debug("Creating ModelTracker when registering trackers for core " + coreName);
|
||||
mTracker = new ModelTracker(coreContainer.getSolrHome(), props, repositoryClient,
|
||||
coreName, srv);
|
||||
|
||||
trackerRegistry.setModelTracker(mTracker);
|
||||
|
||||
log.info("Ensuring first model sync.");
|
||||
mTracker.ensureFirstModelSync();
|
||||
log.info("Done ensuring first model sync.");
|
||||
|
||||
//Scheduling the ModelTracker.
|
||||
scheduler.schedule(mTracker, coreName, props);
|
||||
}
|
||||
}
|
||||
|
||||
List<Tracker> trackers = createTrackers(coreName, trackerRegistry, props, scheduler, repositoryClient, srv);
|
||||
List<Tracker> trackers = createCoreTrackers(coreName, trackerRegistry, props, scheduler, repositoryClient, srv);
|
||||
|
||||
CommitTracker commitTracker = new CommitTracker(props, repositoryClient, coreName, srv, trackers);
|
||||
trackerRegistry.register(coreName, commitTracker);
|
||||
@@ -120,7 +114,8 @@ public class SolrCoreLoadRegistration {
|
||||
log.info("The Trackers are now scheduled to run");
|
||||
trackers.add(commitTracker); //Add the commitTracker to the list of scheduled trackers that can be shutdown
|
||||
|
||||
core.addCloseHook(new CloseHook() {
|
||||
core.addCloseHook(new CloseHook()
|
||||
{
|
||||
@Override
|
||||
public void preClose(SolrCore core)
|
||||
{
|
||||
@@ -148,7 +143,12 @@ public class SolrCoreLoadRegistration {
|
||||
* @param srv
|
||||
* @return A list of trackers
|
||||
*/
|
||||
private static List<Tracker> createTrackers(String coreName, TrackerRegistry trackerRegistry, Properties props, SolrTrackerScheduler scheduler, SOLRAPIClient repositoryClient, SolrInformationServer srv) {
|
||||
private static List<Tracker> createCoreTrackers(String coreName,
|
||||
TrackerRegistry trackerRegistry,
|
||||
Properties props,
|
||||
SolrTrackerScheduler scheduler,
|
||||
SOLRAPIClient repositoryClient,
|
||||
SolrInformationServer srv) {
|
||||
List<Tracker> trackers = new ArrayList<Tracker>();
|
||||
|
||||
AclTracker aclTracker = new AclTracker(props, repositoryClient, coreName, srv);
|
||||
@@ -178,6 +178,45 @@ public class SolrCoreLoadRegistration {
|
||||
return trackers;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create model tracker and load persisted models.
|
||||
*
|
||||
* @param coreName
|
||||
* @param trackerRegistry
|
||||
* @param props
|
||||
* @param solrHome
|
||||
* @param repositoryClient
|
||||
* @param srv
|
||||
* @param scheduler
|
||||
* @return true if model tracker has been created, false if it already exists.
|
||||
*/
|
||||
private synchronized static void createModelTracker(String coreName,
|
||||
TrackerRegistry trackerRegistry,
|
||||
Properties props,
|
||||
String solrHome,
|
||||
SOLRAPIClient repositoryClient,
|
||||
SolrInformationServer srv,
|
||||
SolrTrackerScheduler scheduler)
|
||||
{
|
||||
ModelTracker mTracker = trackerRegistry.getModelTracker();
|
||||
if (mTracker == null)
|
||||
{
|
||||
log.debug("Creating ModelTracker");
|
||||
mTracker = new ModelTracker(solrHome, props, repositoryClient,
|
||||
coreName, srv);
|
||||
|
||||
trackerRegistry.setModelTracker(mTracker);
|
||||
log.info("Ensuring first model sync.");
|
||||
mTracker.ensureFirstModelSync();
|
||||
log.info("Done ensuring first model sync.");
|
||||
|
||||
//Scheduling the ModelTracker.
|
||||
scheduler.schedule(mTracker, coreName, props);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Shuts down the trackers for a core.
|
||||
*
|
||||
|
||||
+39
-64
@@ -83,18 +83,18 @@ import org.json.JSONException;
|
||||
public class ModelTracker extends AbstractTracker implements Tracker
|
||||
{
|
||||
|
||||
private Set<StoreRef> indexedStores = new HashSet<StoreRef>();
|
||||
private Set<StoreRef> ignoredStores = new HashSet<StoreRef>();
|
||||
private Set<String> indexedTenants = new HashSet<String>();
|
||||
private Set<String> ignoredTenants = new HashSet<String>();
|
||||
private Set<QName> indexedDataTypes = new HashSet<QName>();
|
||||
private Set<QName> ignoredDataTypes = new HashSet<QName>();
|
||||
private Set<QName> indexedTypes = new HashSet<QName>();
|
||||
private Set<QName> ignoredTypes = new HashSet<QName>();
|
||||
private Set<QName> indexedAspects = new HashSet<QName>();
|
||||
private Set<QName> ignoredAspects = new HashSet<QName>();
|
||||
private Set<String> indexedFields = new HashSet<String>();
|
||||
private Set<String> ignoredFields = new HashSet<String>();
|
||||
private final Set<StoreRef> indexedStores = new HashSet<>();
|
||||
private final Set<StoreRef> ignoredStores = new HashSet<>();
|
||||
private final Set<String> indexedTenants = new HashSet<>();
|
||||
private final Set<String> ignoredTenants = new HashSet<>();
|
||||
private final Set<QName> indexedDataTypes = new HashSet<>();
|
||||
private final Set<QName> ignoredDataTypes = new HashSet<>();
|
||||
private final Set<QName> indexedTypes = new HashSet<>();
|
||||
private final Set<QName> ignoredTypes = new HashSet<>();
|
||||
private final Set<QName> indexedAspects = new HashSet<>();
|
||||
private final Set<QName> ignoredAspects = new HashSet<>();
|
||||
private final Set<String> indexedFields = new HashSet<>();
|
||||
private final Set<String> ignoredFields = new HashSet<>();
|
||||
|
||||
private ReentrantReadWriteLock modelLock = new ReentrantReadWriteLock();
|
||||
private volatile boolean hasModels = false;
|
||||
@@ -111,7 +111,7 @@ public class ModelTracker extends AbstractTracker implements Tracker
|
||||
{
|
||||
alfrescoModelDir.mkdir();
|
||||
}
|
||||
|
||||
|
||||
loadPersistedModels();
|
||||
}
|
||||
|
||||
@@ -124,23 +124,15 @@ public class ModelTracker extends AbstractTracker implements Tracker
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
*/
|
||||
private void loadPersistedModels()
|
||||
{
|
||||
HashMap<String, M2Model> modelMap = new HashMap<String, M2Model>();
|
||||
HashMap<String, M2Model> modelMap = new HashMap<>();
|
||||
if (alfrescoModelDir.exists() && alfrescoModelDir.isDirectory())
|
||||
{
|
||||
// A filter for XML files
|
||||
FileFilter filter = new FileFilter()
|
||||
{
|
||||
@Override
|
||||
public boolean accept(File pathname)
|
||||
{
|
||||
return pathname.isFile() && pathname.getName().endsWith(".xml");
|
||||
}
|
||||
|
||||
};
|
||||
FileFilter filter = pathname -> pathname.isFile() && pathname.getName().endsWith(".xml");
|
||||
// List XML files
|
||||
File[] files = alfrescoModelDir.listFiles(filter);
|
||||
if (files != null)
|
||||
@@ -289,24 +281,18 @@ public class ModelTracker extends AbstractTracker implements Tracker
|
||||
long start = System.nanoTime();
|
||||
|
||||
List<AlfrescoModelDiff> modelDiffs = client.getModelsDiff(coreName, this.infoSrv.getAlfrescoModels());
|
||||
HashMap<String, M2Model> modelMap = new HashMap<String, M2Model>();
|
||||
Map<String, M2Model> modelMap = new HashMap<>();
|
||||
|
||||
for (AlfrescoModelDiff modelDiff : modelDiffs)
|
||||
{
|
||||
switch (modelDiff.getType())
|
||||
{
|
||||
case CHANGED:
|
||||
AlfrescoModel changedModel = client.getModel(coreName, modelDiff.getModelName());
|
||||
for (M2Namespace namespace : changedModel.getModel().getNamespaces())
|
||||
{
|
||||
modelMap.put(namespace.getUri(), changedModel.getModel());
|
||||
}
|
||||
break;
|
||||
case NEW:
|
||||
AlfrescoModel newModel = client.getModel(coreName, modelDiff.getModelName());
|
||||
for (M2Namespace namespace : newModel.getModel().getNamespaces())
|
||||
AlfrescoModel model = client.getModel(coreName, modelDiff.getModelName());
|
||||
for (M2Namespace namespace : model.getModel().getNamespaces())
|
||||
{
|
||||
modelMap.put(namespace.getUri(), newModel.getModel());
|
||||
modelMap.put(namespace.getUri(), model.getModel());
|
||||
}
|
||||
break;
|
||||
case REMOVED:
|
||||
@@ -317,7 +303,7 @@ public class ModelTracker extends AbstractTracker implements Tracker
|
||||
}
|
||||
}
|
||||
|
||||
HashSet<String> loadedModels = new HashSet<String>();
|
||||
HashSet<String> loadedModels = new HashSet<>();
|
||||
for (M2Model model : modelMap.values())
|
||||
{
|
||||
loadModel(modelMap, loadedModels, model);
|
||||
@@ -367,7 +353,7 @@ public class ModelTracker extends AbstractTracker implements Tracker
|
||||
|
||||
trackerStats.addModelTime(end - start);
|
||||
|
||||
if (true == runPostModelLoadInit)
|
||||
if (runPostModelLoadInit)
|
||||
{
|
||||
for (Object key : props.keySet())
|
||||
{
|
||||
@@ -450,10 +436,7 @@ public class ModelTracker extends AbstractTracker implements Tracker
|
||||
{
|
||||
expandedQName = expandQNameImpl(qName);
|
||||
}
|
||||
// else if (AlfrescoSolrDataModel.nonDictionaryFields.get(qName) == null)
|
||||
// {
|
||||
// expandedQName = expandQNameImpl(qName);
|
||||
// }
|
||||
|
||||
return QName.createQName(expandedQName);
|
||||
|
||||
}
|
||||
@@ -495,10 +478,7 @@ public class ModelTracker extends AbstractTracker implements Tracker
|
||||
{
|
||||
expandedQName = expandQNameImpl(qName);
|
||||
}
|
||||
// else if (AlfrescoSolrDataModel.nonDictionaryFields.get(qName) == null)
|
||||
// {
|
||||
// expandedQName = expandQNameImpl(qName);
|
||||
// }
|
||||
|
||||
return expandedQName;
|
||||
|
||||
}
|
||||
@@ -513,26 +493,21 @@ public class ModelTracker extends AbstractTracker implements Tracker
|
||||
final String prefix = modelName.toPrefixString(this.infoSrv.getNamespaceDAO()).replace(":", ".") + ".";
|
||||
final String postFix = ".xml";
|
||||
|
||||
File[] toDelete = alfrescoModelDir.listFiles(new FileFilter()
|
||||
{
|
||||
@Override
|
||||
public boolean accept(File pathname)
|
||||
File[] toDelete = alfrescoModelDir.listFiles(pathname -> {
|
||||
if (pathname.isDirectory()) { return false; }
|
||||
String name = pathname.getName();
|
||||
if (!name.endsWith(postFix)) { return false; }
|
||||
if (!name.startsWith(prefix)) { return false; }
|
||||
// check is number between
|
||||
String checksum = name.substring(prefix.length(), name.length() - postFix.length());
|
||||
try
|
||||
{
|
||||
if (pathname.isDirectory()) { return false; }
|
||||
String name = pathname.getName();
|
||||
if (false == name.endsWith(postFix)) { return false; }
|
||||
if (false == name.startsWith(prefix)) { return false; }
|
||||
// check is number between
|
||||
String checksum = name.substring(prefix.length(), name.length() - postFix.length());
|
||||
try
|
||||
{
|
||||
Long.parseLong(checksum);
|
||||
return true;
|
||||
}
|
||||
catch (NumberFormatException nfe)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
Long.parseLong(checksum);
|
||||
return true;
|
||||
}
|
||||
catch (NumberFormatException nfe)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
@@ -548,7 +523,7 @@ public class ModelTracker extends AbstractTracker implements Tracker
|
||||
private void loadModel(Map<String, M2Model> modelMap, HashSet<String> loadedModels, M2Model model)
|
||||
{
|
||||
String modelName = model.getName();
|
||||
if (loadedModels.contains(modelName) == false)
|
||||
if (!loadedModels.contains(modelName))
|
||||
{
|
||||
for (M2Namespace importNamespace : model.getImports())
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user