1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 package org.modeshape.search.lucene;
25
26 import java.util.UUID;
27 import java.util.concurrent.locks.Lock;
28 import java.util.concurrent.locks.ReentrantLock;
29 import net.jcip.annotations.Immutable;
30 import org.apache.lucene.analysis.Analyzer;
31 import org.apache.lucene.analysis.standard.StandardAnalyzer;
32 import org.apache.lucene.store.Directory;
33 import org.apache.lucene.util.Version;
34 import org.modeshape.graph.ExecutionContext;
35 import org.modeshape.graph.search.SearchEngineWorkspace;
36
37
38
39
40 @Immutable
41 public class LuceneSearchWorkspace implements SearchEngineWorkspace {
42
43
44
45
46 protected static final int CHANGES_BEFORE_OPTIMIZATION = 1;
47
48 protected static final String INDEX_NAME = "content";
49
50
51
52
53
54
55
56 protected static final String FULL_TEXT_PREFIX = ":ft:";
57
58
59
60
61
62 static class ContentIndex {
63 public static final String PATH = "::pth";
64 public static final String NODE_NAME = "::nam";
65 public static final String LOCAL_NAME = "::loc";
66 public static final String SNS_INDEX = "::sns";
67 public static final String LOCATION_ID_PROPERTIES = "::idp";
68 public static final String DEPTH = "::dep";
69 public static final String FULL_TEXT = "::fts";
70 public static final String REFERENCES = "::ref";
71 }
72
73 private final String workspaceName;
74 private final String workspaceDirectoryName;
75 protected final IndexRules rules;
76 private final LuceneConfiguration configuration;
77 protected final Directory contentDirectory;
78 protected final Analyzer analyzer;
79 private final Lock changesLock = new ReentrantLock();
80 private int changes = 0;
81
82 protected LuceneSearchWorkspace( String workspaceName,
83 LuceneConfiguration configuration,
84 IndexRules rules,
85 Analyzer analyzer ) {
86 assert workspaceName != null;
87 assert configuration != null;
88 this.workspaceName = workspaceName;
89 this.workspaceDirectoryName = workspaceName.trim().length() != 0 ? workspaceName : UUID.randomUUID().toString();
90 this.analyzer = analyzer != null ? analyzer : new StandardAnalyzer(Version.LUCENE_30);
91 this.rules = rules != null ? rules : LuceneSearchEngine.DEFAULT_RULES;
92 this.configuration = configuration;
93 this.contentDirectory = this.configuration.getDirectory(workspaceDirectoryName, INDEX_NAME);
94 }
95
96
97
98
99
100
101 public String getWorkspaceName() {
102 return workspaceName;
103 }
104
105
106
107
108
109
110 public void destroy( ExecutionContext context ) {
111 configuration.destroyDirectory(workspaceDirectoryName, INDEX_NAME);
112 }
113
114
115
116
117 public IndexRules getRules() {
118 return rules;
119 }
120
121
122
123
124
125
126
127
128 protected boolean isOptimizationRequired( int changesInSession ) {
129 if (changesInSession == 0) return false;
130 assert changesInSession > 0;
131 try {
132 changesLock.lock();
133 changes += changesInSession;
134 if (changes >= CHANGES_BEFORE_OPTIMIZATION) {
135 changes = 0;
136 return true;
137 }
138 return false;
139 } finally {
140 changesLock.unlock();
141 }
142 }
143 }