Wikitty-commits
Threads by month
- ----- 2026 -----
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
December 2010
- 6 participants
- 128 discussions
Author: bpoussin
Date: 2010-12-02 19:01:00 +0100 (Thu, 02 Dec 2010)
New Revision: 554
Url: http://nuiton.org/repositories/revision/wikitty/554
Log:
suppression picocontainer dependency
Modified:
trunk/pom.xml
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2010-12-02 18:00:04 UTC (rev 553)
+++ trunk/pom.xml 2010-12-02 18:01:00 UTC (rev 554)
@@ -36,13 +36,6 @@
<dependencyManagement>
<dependencies>
<dependency>
- <groupId>org.picocontainer</groupId>
- <artifactId>picocontainer</artifactId>
- <version>2.11.2</version>
- <scope>compile</scope>
- </dependency>
-
- <dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>${jettyVersion}</version>
1
0
02 Dec '10
Author: bpoussin
Date: 2010-12-02 19:00:04 +0100 (Thu, 02 Dec 2010)
New Revision: 553
Url: http://nuiton.org/repositories/revision/wikitty/553
Log:
Evolution #1130: Add call time in proxy to trace long method execution
- refactore some method to suppress return in middle of method
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfig.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyProxy.java
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfig.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfig.java 2010-12-02 15:44:03 UTC (rev 552)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfig.java 2010-12-02 18:00:04 UTC (rev 553)
@@ -287,8 +287,17 @@
"wikitty.service.slave.master.xmpp.room",
_("Room to use for synchronization with master,"
+ " this room must have history activated"),
- "test(a)conference.im.codelutin.com", String.class, false, false);
+ "test(a)conference.im.codelutin.com", String.class, false, false),
+ WIKITTY_PROXY_TIME_TO_LOG_INFO(
+ "wikitty.proxy.timeToLog.info",
+ _("maximum time before send log info with time consumed"),
+ "5000", Integer.class, false, false),
+ WIKITTY_PROXY_TIME_TO_LOG_WARN(
+ "wikitty.proxy.timeToLog.warn",
+ _("maximum time before send log warn with time consumed"),
+ "1000", Integer.class, false, false);
+
public String key;
public String description;
public String defaultValue;
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyProxy.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyProxy.java 2010-12-02 15:44:03 UTC (rev 552)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyProxy.java 2010-12-02 18:00:04 UTC (rev 553)
@@ -43,6 +43,10 @@
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
+import org.apache.commons.lang.mutable.MutableLong;
+import org.apache.commons.lang.time.DurationFormatUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.nuiton.wikitty.entities.WikittyTreeNode;
import org.nuiton.wikitty.search.operators.Element;
@@ -62,6 +66,33 @@
*/
public class WikittyProxy {
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(WikittyProxy.class);
+
+ static public class CallStat {
+ long callNumber = 0;
+ long callTime = 0;
+
+ @Override
+ public String toString() {
+ String callTimeString =
+ DurationFormatUtils.formatDuration(callTime, "s'.'S");
+ String avgTimeString =
+ DurationFormatUtils.formatDuration((callTime/ callNumber), "s'.'S");
+ return String.format("total call %s, total time %s, avg time %s",
+ callNumber, callTimeString, avgTimeString);
+ }
+
+ }
+
+ /** time to trigger log time in info level */
+ protected long timeToLogInfo = 1000;
+ /** time to trigger log time in warn level */
+ protected long timeToLogWarn = 3000;
+
+ /** for each method of all proxies, keep number of call */
+ static protected Map<String, CallStat> callCount = new HashMap<String, CallStat>();
+
/** Delegated wikitty service. */
protected WikittyServiceEnhanced wikittyService;
@@ -76,9 +107,17 @@
* Empty constructor (uninitialized wikittyService).
*/
public WikittyProxy() {
-
}
+ public WikittyProxy(WikittyConfig config) {
+ if (config != null) {
+ timeToLogInfo = config.getOptionAsInt(WikittyConfig.WikittyOption.
+ WIKITTY_PROXY_TIME_TO_LOG_INFO.getKey());
+ timeToLogWarn = config.getOptionAsInt(WikittyConfig.WikittyOption.
+ WIKITTY_PROXY_TIME_TO_LOG_WARN.getKey());
+ }
+ }
+
/**
* Constructor with wikittyService.
*
@@ -89,14 +128,57 @@
setWikittyService(wikittyService);
}
+ public WikittyProxy(WikittyConfig config, WikittyService wikittyService) {
+ this(config);
+ setWikittyService(wikittyService);
+ }
+
+ static public Map<String, CallStat> getCallCount() {
+ return callCount;
+ }
+
+ protected void traceTime(long start, long stop, String methodName) {
+ long time = stop - start;
+
+ // incremente le nombre d'appel pour cette methode
+ CallStat calls = callCount.get(methodName);
+ if (calls == null) {
+ // is not thread safe, but if we lose one or two call, is not importante
+ calls = new CallStat();
+ callCount.put(methodName, calls);
+ }
+ calls.callNumber++;
+ calls.callTime += time;
+
+ // affiche le temps de l'appel si necessaire
+ String timeString = DurationFormatUtils.formatDuration(time, "s'.'S");
+ String msg = String.format("[%s] for method %s (%s)",
+ timeString, methodName, calls);
+
+ if (time > timeToLogWarn && log.isWarnEnabled()) {
+ log.warn(msg);
+ } else if (time > timeToLogInfo && log.isInfoEnabled()) {
+ log.info(msg);
+ } else if (log.isDebugEnabled()) {
+ log.debug(msg);
+ }
+
+ }
+
public String login(String login, String password) {
+ long start = System.currentTimeMillis();
String result = wikittyService.login(login, password);
setSecurityToken(result);
+ long stop = System.currentTimeMillis();
+ traceTime(start, stop, "login");
return result;
}
public void logout() {
+ long start = System.currentTimeMillis();
wikittyService.logout(securityToken);
+ long stop = System.currentTimeMillis();
+ traceTime(start, stop, "logout");
}
public String getSecurityToken() {
@@ -124,22 +206,26 @@
* @return new instance of object wanted
*/
public <E extends BusinessEntity> E cast(BusinessEntity source, Class<E> target) {
+ long start = System.currentTimeMillis();
E result = WikittyUtil.newInstance(
securityToken, wikittyService, target, ((BusinessEntityImpl)source).getWikitty());
+ long stop = System.currentTimeMillis();
+ traceTime(start, stop, "cast");
return result;
}
public <E extends BusinessEntity> E store(E e) {
Wikitty w = ((BusinessEntityImpl)e).getWikitty();
- WikittyEvent resp = wikittyService.store(securityToken, w);
- // update object
- resp.update(w);
+ w = store(w);
return e;
}
public Wikitty store(Wikitty w) {
+ long start = System.currentTimeMillis();
WikittyEvent resp = wikittyService.store(securityToken, w);
// update object
resp.update(w);
+ long stop = System.currentTimeMillis();
+ traceTime(start, stop, "store");
return w;
}
@@ -152,6 +238,7 @@
* @return updated objects list
*/
public <E extends BusinessEntity> List<E> store(List<E> objets) {
+ long start = System.currentTimeMillis();
// prepare data to send to service
List<Wikitty> wikitties = new ArrayList<Wikitty>(objets.size());
for (E e : objets) {
@@ -166,6 +253,8 @@
for (Wikitty w : wikitties) {
resp.update(w);
}
+ long stop = System.currentTimeMillis();
+ traceTime(start, stop, "store<list>");
return objets;
}
@@ -180,42 +269,45 @@
* @return wikitty entity with specified id or {@code null} if entity can't be found
*/
public <E extends BusinessEntity> E restore(Class<E> clazz, String id, boolean checkExtension) {
- if (id == null) {
- return null;
- }
- E result = null;
- HashSet<String> extNames = null;
try {
- Wikitty wikitty = wikittyService.restore(securityToken, id);
- if(wikitty == null) {
- return null;
+ long start = System.currentTimeMillis();
+ E result = null;
+ if (id != null) {
+ HashSet<String> extNames = null;
+
+ Wikitty wikitty = wikittyService.restore(securityToken, id);
+ if (wikitty != null) {
+ if (checkExtension) {
+ extNames = new HashSet<String>(wikitty.getExtensionNames());
+ }
+ result = WikittyUtil.newInstance(
+ securityToken, wikittyService, clazz, wikitty);
+
+ if (checkExtension) {
+ // WikittyUtil.newInstance instanciate only BusinessEntityWikittyImpl
+ BusinessEntityImpl b = (BusinessEntityImpl) result;
+ Collection<WikittyExtension> BusinessEntityStaticExtensions = b.getStaticExtensions();
+ for (WikittyExtension ext : BusinessEntityStaticExtensions) {
+ String extensionName = ext.getName();
+ if (!extNames.contains(extensionName)) {
+ // extension wanted by BusinessEntity (clazz)
+ // is not in wikitty, then wikitty is not good type
+ // for business
+ result = null;
+ break;
+ }
+ }
+ }
+ }
}
-
- if (checkExtension) {
- extNames = new HashSet<String>(wikitty.getExtensionNames());
- }
- result = WikittyUtil.newInstance(
- securityToken, wikittyService, clazz, wikitty);
+ long stop = System.currentTimeMillis();
+ traceTime(start, stop, "restore<Business>");
+ return result;
} catch (SecurityException eee) {
throw eee;
} catch (Exception eee) {
throw new WikittyException("Can't restore wikitty", eee);
}
- if (checkExtension) {
- // WikittyUtil.newInstance instanciate only BusinessEntityWikittyImpl
- BusinessEntityImpl b = (BusinessEntityImpl)result;
- Collection<WikittyExtension> BusinessEntityStaticExtensions = b.getStaticExtensions();
- for (WikittyExtension ext : BusinessEntityStaticExtensions) {
- String extensionName = ext.getName();
- if (!extNames.contains(extensionName)) {
- // extension wanted by BusinessEntity (clazz)
- // is not in wikitty, then wikitty is not good type
- // for business
- return null;
- }
- }
- }
- return result;
}
/**
@@ -225,12 +317,14 @@
* @return wikitty entity with specified id or {@code null} if entity can't be found
*/
public Wikitty restore(String id) {
- if (id == null) {
- return null;
+ long start = System.currentTimeMillis();
+ Wikitty result = null;
+ if (id != null) {
+ result = wikittyService.restore(securityToken, id);
}
-
- Wikitty wikitty = wikittyService.restore(securityToken, id);
- return wikitty;
+ long stop = System.currentTimeMillis();
+ traceTime(start, stop, "restore");
+ return result;
}
/**
@@ -257,6 +351,7 @@
*/
public <E extends BusinessEntity> List<E> restore(
Class<E> clazz, List<String> id, boolean checkExtension) {
+ long start = System.currentTimeMillis();
List<Wikitty> wikitties = wikittyService.restore(securityToken, id);
List<E> result = new ArrayList<E>();
@@ -276,12 +371,21 @@
// extension wanted by BusinessEntity (clazz)
// is not in wikitty, then wikitty is not good type
// for business
- return null;
+ result = null;
+ break;
}
}
+ // le break au dessus permet de soritr d'une boucle
+ // met si result est null il faut sortir de la methode et donc
+ // sortir de la deuxieme boucle
+ if (result == null) {
+ break;
+ }
}
result.add(dto);
}
+ long stop = System.currentTimeMillis();
+ traceTime(start, stop, "restore<list>");
return result;
}
@@ -291,11 +395,17 @@
}
public void delete(String id) {
+ long start = System.currentTimeMillis();
wikittyService.delete(securityToken, id);
+ long stop = System.currentTimeMillis();
+ traceTime(start, stop, "delete");
}
public void delete(Collection<String> ids) {
+ long start = System.currentTimeMillis();
wikittyService.delete(securityToken, ids);
+ long stop = System.currentTimeMillis();
+ traceTime(start, stop, "delete<list>");
}
/**
@@ -309,6 +419,7 @@
*/
public <E extends BusinessEntityImpl> PagedResult<E> findAllByExample(E e,
int firstIndex, int endIndex, String ... fieldFacet ) {
+ long start = System.currentTimeMillis();
Criteria criteria = Search.query(e.getWikitty()).criteria()
.setFirstIndex(firstIndex).setEndIndex(endIndex)
@@ -320,6 +431,8 @@
// restriction on extension
PagedResult<E> result = (PagedResult<E>)pagedResult.cast(
this, e.getClass(), true);
+ long stop = System.currentTimeMillis();
+ traceTime(start, stop, "findAllByExample<limit>");
return result;
}
@@ -330,6 +443,7 @@
* @return
*/
public <E extends BusinessEntityImpl> E findByExample(E e) {
+ long start = System.currentTimeMillis();
Criteria criteria = Search.query(e.getWikitty()).criteria();
Wikitty w = wikittyService.findByCriteria(securityToken, criteria);
@@ -338,6 +452,8 @@
result = (E) WikittyUtil.newInstance(
securityToken, wikittyService, e.getClass(), w);
}
+ long stop = System.currentTimeMillis();
+ traceTime(start, stop, "findByExample");
return result;
}
@@ -353,6 +469,7 @@
*/
public <E extends BusinessEntity> PagedResult<E> findAllByCriteria(
Class<E> clazz, Criteria criteria) {
+ long start = System.currentTimeMillis();
// newInstance only return BusinessEntityWikittyImpl
BusinessEntityImpl sample =
@@ -407,16 +524,22 @@
// on extension
PagedResult<E> result = (PagedResult<E>)pagedResult.cast(
this, sample.getClass(), true);
+ long stop = System.currentTimeMillis();
+ traceTime(start, stop, "findAllByCriteria<Business>");
return result;
}
public PagedResult<Wikitty> findAllByCriteria(Criteria criteria) {
+ long start = System.currentTimeMillis();
PagedResult<String> resultId = wikittyService.findAllByCriteria(securityToken, criteria);
PagedResult<Wikitty> result = resultId.cast(securityToken, wikittyService);
+ long stop = System.currentTimeMillis();
+ traceTime(start, stop, "findAllByCriteria");
return result;
}
public <E extends BusinessEntity> E findByCriteria(Class<E> clazz, Criteria criteria) {
+ long start = System.currentTimeMillis();
BusinessEntityImpl sample =
(BusinessEntityImpl)WikittyUtil.newInstance(clazz);
@@ -430,16 +553,24 @@
Wikitty w = wikittyService.findByCriteria(securityToken, criteria);
E result = WikittyUtil.newInstance(
securityToken, wikittyService, clazz, w);
+ long stop = System.currentTimeMillis();
+ traceTime(start, stop, "findByCriteria<Business>");
return result;
}
public Wikitty findByCriteria(Criteria criteria) {
+ long start = System.currentTimeMillis();
Wikitty wikitty = wikittyService.findByCriteria(securityToken, criteria);
+ long stop = System.currentTimeMillis();
+ traceTime(start, stop, "findByCriteria");
return wikitty;
}
public WikittyTree restoreTree(String wikittyId) {
+ long start = System.currentTimeMillis();
WikittyTree result = wikittyService.restoreTree(securityToken, wikittyId);
+ long stop = System.currentTimeMillis();
+ traceTime(start, stop, "restoreTree");
return result;
}
@@ -450,7 +581,10 @@
* @return {@true} if at least one node has been deleted
*/
public WikittyEvent deleteTree(String treeNodeId) {
+ long start = System.currentTimeMillis();
WikittyEvent result = wikittyService.deleteTree(securityToken,treeNodeId);
+ long stop = System.currentTimeMillis();
+ traceTime(start, stop, "deleteTree");
return result;
}
@@ -462,19 +596,19 @@
public <E extends BusinessEntity> Map.Entry<E, Integer> restoreNode(
Class<E> clazz, String wikittyId, Criteria filter, boolean checkExtension) {
+ long start = System.currentTimeMillis();
+ Map.Entry<E, Integer> result = null;
+
Map.Entry<WikittyTreeNode, Integer> node = wikittyService.restoreNode(
securityToken, wikittyId, filter);
- if(node == null) {
- return null;
+ if (node != null) {
+ E bean = restore(clazz, wikittyId, checkExtension);
+ if (bean != null) {
+ result = new HashMap.SimpleEntry<E, Integer>(bean, node.getValue());
+ }
}
-
- E bean = restore(clazz, wikittyId, checkExtension);
- if(bean == null) {
- return null;
- }
-
- Map.Entry<E, Integer> result =
- new HashMap.SimpleEntry<E, Integer>(bean, node.getValue());
+ long stop = System.currentTimeMillis();
+ traceTime(start, stop, "restoreNode");
return result;
}
@@ -486,99 +620,114 @@
public <E extends BusinessEntity> Map<E, Integer> restoreChildren(
Class<E> clazz, String wikittyId, Criteria filter, boolean checkExtension) {
+ long start = System.currentTimeMillis();
+
+ Map<E, Integer> convertedResult = null;
Map<WikittyTreeNode, Integer> result = wikittyService.restoreChildren(
securityToken, wikittyId, filter);
- if(result == null) {
- return null;
- }
- Map<E, Integer> convertedResult = new LinkedHashMap<E, Integer>();
- Set<Entry<WikittyTreeNode, Integer>> entries = result.entrySet();
- for (Entry<WikittyTreeNode, Integer> entry : entries) {
+ if(result != null) {
+ convertedResult = new LinkedHashMap<E, Integer>();
+ Set<Entry<WikittyTreeNode, Integer>> entries = result.entrySet();
+ for (Entry<WikittyTreeNode, Integer> entry : entries) {
- WikittyTreeNode node = entry.getKey();
-
- //TODO EC-20100420 was : String nodeId = node.getId();
- String nodeId = node.getWikittyId();
+ WikittyTreeNode node = entry.getKey();
- E businessEntity = null;
- HashSet<String> extNames = null;
- try {
- Wikitty wikitty = wikittyService.restore(securityToken, nodeId);
- if(checkExtension) {
- extNames = new HashSet<String>(wikitty.getExtensionNames());
+ //TODO EC-20100420 was : String nodeId = node.getId();
+ String nodeId = node.getWikittyId();
+
+ E businessEntity = null;
+ HashSet<String> extNames = null;
+ try {
+ Wikitty wikitty = wikittyService.restore(securityToken, nodeId);
+ if (checkExtension) {
+ extNames = new HashSet<String>(wikitty.getExtensionNames());
+ }
+ businessEntity = WikittyUtil.newInstance(
+ securityToken, wikittyService, clazz, wikitty);
+ } catch (SecurityException eee) {
+ throw eee;
+ } catch (Exception eee) {
+ throw new WikittyException("Can't restore children", eee);
}
- businessEntity = WikittyUtil.newInstance(
- securityToken, wikittyService, clazz, wikitty);
- } catch (SecurityException eee) {
- throw eee;
- } catch (Exception eee) {
- throw new WikittyException("Can't restore children", eee);
- }
- boolean goodType = true;
- if(checkExtension) {
- // WikittyUtil.newInstance instanciate only BusinessEntityWikittyImpl
- BusinessEntityImpl businessEntityImpl =
- (BusinessEntityImpl) businessEntity;
- Collection<WikittyExtension> staticExtensions =
- businessEntityImpl.getStaticExtensions();
+ boolean goodType = true;
+ if (checkExtension) {
+ // WikittyUtil.newInstance instanciate only BusinessEntityWikittyImpl
+ BusinessEntityImpl businessEntityImpl =
+ (BusinessEntityImpl) businessEntity;
+ Collection<WikittyExtension> staticExtensions =
+ businessEntityImpl.getStaticExtensions();
- for (Iterator<WikittyExtension> iterator =
- staticExtensions.iterator(); iterator.hasNext() && goodType;) {
- WikittyExtension ext = iterator.next();
- if (!extNames.contains(ext.getName())) {
- // extension wanted by BusinessEntity (clazz)
- // is not in wikitty, then wikitty is not good type
- // for business
- goodType = false;
+ for (Iterator<WikittyExtension> iterator =
+ staticExtensions.iterator(); iterator.hasNext() && goodType;) {
+ WikittyExtension ext = iterator.next();
+ if (!extNames.contains(ext.getName())) {
+ // extension wanted by BusinessEntity (clazz)
+ // is not in wikitty, then wikitty is not good type
+ // for business
+ goodType = false;
+ }
}
}
- }
- if(goodType) {
- Integer nodeCount = entry.getValue();
- convertedResult.put(businessEntity, nodeCount);
+ if (goodType) {
+ Integer nodeCount = entry.getValue();
+ convertedResult.put(businessEntity, nodeCount);
+ }
}
}
+ long stop = System.currentTimeMillis();
+ traceTime(start, stop, "restoreChildren");
return convertedResult;
}
public Wikitty restoreVersion(String wikittyId, String version) {
+ long start = System.currentTimeMillis();
Wikitty result = wikittyService.restoreVersion(
securityToken, wikittyId, version);
+ long stop = System.currentTimeMillis();
+ traceTime(start, stop, "restoreVersion");
return result;
}
public <E extends BusinessEntity> boolean hasType(Class<E> clazz, String wikittyId) {
- E result = null;
- HashSet<String> extNames = null;
try {
+ long start = System.currentTimeMillis();
+
+ boolean result = true;
+
+ E businessObject = null;
+ HashSet<String> extNames = null;
Wikitty wikitty = wikittyService.restore(securityToken, wikittyId);
if (wikitty == null) {
- return false;
+ result = false;
+ } else {
+ extNames = new HashSet<String>(wikitty.getExtensionNames());
+ businessObject = WikittyUtil.newInstance(
+ securityToken, wikittyService, clazz, wikitty);
+ // WikittyUtil.newInstance instanciate only BusinessEntityWikittyImpl
+ BusinessEntityImpl b = (BusinessEntityImpl) businessObject;
+ for (WikittyExtension ext : b.getStaticExtensions()) {
+ if (!extNames.contains(ext.getName())) {
+ // extension wanted by BusinessEntity (clazz)
+ // is not in wikitty, then wikitty is not good type
+ // for business
+ result = false;
+ break;
+ }
+ }
}
- extNames = new HashSet<String>(wikitty.getExtensionNames());
- result = WikittyUtil.newInstance(
- securityToken, wikittyService, clazz, wikitty);
+ long stop = System.currentTimeMillis();
+ traceTime(start, stop, "hasType");
+ return result;
} catch (SecurityException eee) {
throw eee;
} catch (Exception eee) {
throw new WikittyException(
"Can't retrieve wikitty needed for hasType test", eee);
}
- // WikittyUtil.newInstance instanciate only BusinessEntityWikittyImpl
- BusinessEntityImpl b = (BusinessEntityImpl)result;
- for (WikittyExtension ext : b.getStaticExtensions()) {
- if (!extNames.contains(ext.getName())) {
- // extension wanted by BusinessEntity (clazz)
- // is not in wikitty, then wikitty is not good type
- // for business
- return false;
- }
- }
- return true;
}
/**
@@ -588,8 +737,11 @@
* @return update response
*/
public WikittyEvent storeExtension(WikittyExtension ext) {
+ long start = System.currentTimeMillis();
WikittyEvent response =
wikittyService.storeExtension(securityToken, ext);
+ long stop = System.currentTimeMillis();
+ traceTime(start, stop, "storeExtension");
return response;
}
@@ -600,8 +752,11 @@
* @return update response
*/
public WikittyEvent storeExtension(Collection<WikittyExtension> exts) {
+ long start = System.currentTimeMillis();
WikittyEvent response =
wikittyService.storeExtension(securityToken, exts);
+ long stop = System.currentTimeMillis();
+ traceTime(start, stop, "storeExtension<list>");
return response;
}
@@ -612,7 +767,10 @@
* @return the corresponding object, exception if no such object found.
*/
public WikittyExtension restoreExtension(String extensionId) {
+ long start = System.currentTimeMillis();
WikittyExtension extension = wikittyService.restoreExtension(securityToken, extensionId);
+ long stop = System.currentTimeMillis();
+ traceTime(start, stop, "restoreExtension");
return extension;
}
@@ -623,7 +781,10 @@
* @return the corresponding object, exception if no such object found.
*/
public WikittyExtension restoreExtensionLastVersion(String extensionName) {
+ long start = System.currentTimeMillis();
WikittyExtension extension = wikittyService.restoreExtensionLastVersion(securityToken, extensionName);
+ long stop = System.currentTimeMillis();
+ traceTime(start, stop, "restoreExtensionLastVersion");
return extension;
}
@@ -633,7 +794,10 @@
* @return extension id list
*/
public List<String> getAllExtensionIds() {
+ long start = System.currentTimeMillis();
List<String> result = wikittyService.getAllExtensionIds(securityToken);
+ long stop = System.currentTimeMillis();
+ traceTime(start, stop, "getAllExtensionIds");
return result;
}
@@ -645,7 +809,10 @@
* @return extensions
*/
public List<String> getAllExtensionsRequires(String extensionName) {
+ long start = System.currentTimeMillis();
List<String> result = wikittyService.getAllExtensionsRequires(securityToken, extensionName);
+ long stop = System.currentTimeMillis();
+ traceTime(start, stop, "getAllExtensionsRequires");
return result;
}
@@ -654,7 +821,10 @@
* This operation should be disabled in production environment.
*/
public WikittyEvent clear() {
+ long start = System.currentTimeMillis();
WikittyEvent result = wikittyService.clear(securityToken);
+ long stop = System.currentTimeMillis();
+ traceTime(start, stop, "clear");
return result;
}
@@ -665,7 +835,10 @@
* @return update response
*/
public void syncSearchEngine() {
+ long start = System.currentTimeMillis();
wikittyService.syncSearchEngine(securityToken);
+ long stop = System.currentTimeMillis();
+ traceTime(start, stop, "syncSearchEngine");
}
/**
@@ -674,7 +847,10 @@
* @return the wikitty encapsulated
*/
public Wikitty getWikitty(BusinessEntity entity){
+ long start = System.currentTimeMillis();
Wikitty result = WikittyUtil.getWikitty(wikittyService, securityToken, entity);
+ long stop = System.currentTimeMillis();
+ traceTime(start, stop, "getWikitty");
return result;
}
1
0
r552 - trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities
by jcouteau@users.nuiton.org 02 Dec '10
by jcouteau@users.nuiton.org 02 Dec '10
02 Dec '10
Author: jcouteau
Date: 2010-12-02 16:44:03 +0100 (Thu, 02 Dec 2010)
New Revision: 552
Url: http://nuiton.org/repositories/revision/wikitty/552
Log:
Use force parameter for recursive call in replaceWith method
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyImpl.java
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyImpl.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyImpl.java 2010-12-02 01:29:28 UTC (rev 551)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyImpl.java 2010-12-02 15:44:03 UTC (rev 552)
@@ -141,7 +141,7 @@
}
// all time search for WikittyImpl to do copy (prevent error)
if (w instanceof WikittyCopyOnWrite) {
- replaceWith(((WikittyCopyOnWrite)w).getTarget());
+ replaceWith(((WikittyCopyOnWrite)w).getTarget(), force);
}
if (force || this.getId().equals(w.getId())) {
this.extensions.clear();
1
0
Author: bpoussin
Date: 2010-12-02 02:29:28 +0100 (Thu, 02 Dec 2010)
New Revision: 551
Url: http://nuiton.org/repositories/revision/wikitty/551
Log:
- rename all engin to engine
- rename syncEngin to syncSearchEngine
- sample configuration update for that
Added:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngine.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemory.java
trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/solr/WikittySearchEngineSolr.java
Removed:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngin.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEnginInMemory.java
trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/solr/WikittySearchEnginSolr.java
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfig.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyProxy.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyService.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceCached.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceDelegator.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceInMemory.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceNotifier.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceSecurity.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceStorage.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceTransaction.java
trunk/wikitty-api/src/main/resources/wikitty-config-sample-inmemory.properties
trunk/wikitty-api/src/main/resources/wikitty-config-sample-server-slave.properties
trunk/wikitty-api/src/main/resources/wikitty-config-sample-server.properties
trunk/wikitty-api/src/test/java/org/nuiton/wikitty/services/WikittyServiceHelperTest.java
trunk/wikitty-jdbc-impl/src/main/java/org/nuiton/wikitty/jdbc/WikittyServiceJDBC.java
trunk/wikitty-jdbc-impl/src/main/java/org/nuiton/wikitty/services/WikittyServiceInMemoryJdbcSolr.java
trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/solr/Restriction2Solr.java
trunk/wikitty-solr-impl/src/test/java/org/nuiton/wikitty/solr/test/SolrSearchTest.java
trunk/wikitty-solr-impl/src/test/java/org/nuiton/wikitty/solr/test/WikittyServiceSolr.java
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfig.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfig.java 2010-12-02 01:13:56 UTC (rev 550)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfig.java 2010-12-02 01:29:28 UTC (rev 551)
@@ -200,7 +200,7 @@
_("WikittyServiceStorage component to use (ExtensionStorage, WikittyStorage, SearchEngine)"),
"org.nuiton.wikitty.jdbc.WikittyExtensionStorageJDBC,"
+ "org.nuiton.wikitty.jdbc.WikittyStorageJDBC,"
- + "org.nuiton.wikitty.solr.WikittySearchEnginSolr", String.class, false, false),
+ + "org.nuiton.wikitty.solr.WikittySearchEngineSolr", String.class, false, false),
WIKITTY_WIKITTYSERVICENOTIFIER_COMPONENTS(
"wikitty.WikittyServiceNotifier.components",
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyProxy.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyProxy.java 2010-12-02 01:13:56 UTC (rev 550)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyProxy.java 2010-12-02 01:29:28 UTC (rev 551)
@@ -664,8 +664,8 @@
*
* @return update response
*/
- public void syncEngin() {
- wikittyService.syncEngin(securityToken);
+ public void syncSearchEngine() {
+ wikittyService.syncSearchEngine(securityToken);
}
/**
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyService.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyService.java 2010-12-02 01:13:56 UTC (rev 550)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyService.java 2010-12-02 01:29:28 UTC (rev 551)
@@ -382,6 +382,6 @@
*
* @param securityToken security token
*/
- public void syncEngin(String securityToken);
+ public void syncSearchEngine(String securityToken);
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceCached.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceCached.java 2010-12-02 01:13:56 UTC (rev 550)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceCached.java 2010-12-02 01:29:28 UTC (rev 551)
@@ -396,8 +396,8 @@
}
@Override
- public void syncEngin(String securityToken) {
- ws.syncEngin(securityToken);
+ public void syncSearchEngine(String securityToken) {
+ ws.syncSearchEngine(securityToken);
}
@Override
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceDelegator.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceDelegator.java 2010-12-02 01:13:56 UTC (rev 550)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceDelegator.java 2010-12-02 01:29:28 UTC (rev 551)
@@ -198,8 +198,8 @@
}
@Override
- public void syncEngin(String securityToken) {
- delegate.syncEngin(securityToken);
+ public void syncSearchEngine(String securityToken) {
+ delegate.syncSearchEngine(securityToken);
}
@Override
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceInMemory.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceInMemory.java 2010-12-02 01:13:56 UTC (rev 550)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceInMemory.java 2010-12-02 01:29:28 UTC (rev 551)
@@ -25,7 +25,7 @@
package org.nuiton.wikitty.services;
-import org.nuiton.wikitty.storage.WikittySearchEnginInMemory;
+import org.nuiton.wikitty.storage.WikittySearchEngineInMemory;
import org.nuiton.wikitty.storage.WikittyExtensionStorageInMemory;
import org.nuiton.wikitty.storage.WikittyStorageInMemory;
import java.io.File;
@@ -71,7 +71,7 @@
super(new WikittyExtensionStorageInMemory(),
new WikittyStorageInMemory(),
null);
- searchEngin = new WikittySearchEnginInMemory(
+ searchEngine = new WikittySearchEngineInMemory(
(WikittyStorageInMemory) wikittyStorage);
if (config != null) {
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceNotifier.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceNotifier.java 2010-12-02 01:13:56 UTC (rev 550)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceNotifier.java 2010-12-02 01:29:28 UTC (rev 551)
@@ -330,9 +330,9 @@
}
@Override
- public void syncEngin(String securityToken) {
+ public void syncSearchEngine(String securityToken) {
// no notification
- ws.syncEngin(securityToken);
+ ws.syncSearchEngine(securityToken);
}
/**
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceSecurity.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceSecurity.java 2010-12-02 01:13:56 UTC (rev 550)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceSecurity.java 2010-12-02 01:29:28 UTC (rev 551)
@@ -596,11 +596,11 @@
}
@Override
- public void syncEngin(String securityToken) {
+ public void syncSearchEngine(String securityToken) {
String userId = getUserId(securityToken);
if (isAppAdmin(securityToken, userId)) {
// seul les AppAdmin on le droit a cette method
- ws.syncEngin(securityToken);
+ ws.syncSearchEngine(securityToken);
} else {
throw new SecurityException(_("user %s can't sync search engine",
getUserId(securityToken)));
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceStorage.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceStorage.java 2010-12-02 01:13:56 UTC (rev 550)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceStorage.java 2010-12-02 01:29:28 UTC (rev 551)
@@ -26,7 +26,7 @@
package org.nuiton.wikitty.services;
import org.nuiton.wikitty.storage.WikittyExtensionStorage;
-import org.nuiton.wikitty.storage.WikittySearchEngin;
+import org.nuiton.wikitty.storage.WikittySearchEngine;
import org.nuiton.wikitty.storage.WikittyStorage;
import java.util.ArrayList;
import java.util.Collection;
@@ -76,7 +76,7 @@
protected WikittyExtensionMigration defaultExtensionMigration =
new WikittyExtensionMigrationRename();
- protected WikittySearchEngin searchEngin;
+ protected WikittySearchEngine searchEngine;
protected WikittyExtensionStorage extensionStorage;
protected WikittyStorage wikittyStorage;
@@ -93,14 +93,14 @@
public WikittyServiceStorage(WikittyExtensionStorage extensionStorage,
WikittyStorage wikittyStorage,
- WikittySearchEngin searchEngin) {
+ WikittySearchEngine searchEngine) {
this.extensionStorage = extensionStorage;
this.wikittyStorage = wikittyStorage;
- this.searchEngin = searchEngin;
+ this.searchEngine = searchEngine;
}
- protected WikittySearchEngin getSearchEngin() {
- return searchEngin;
+ protected WikittySearchEngine getSearchEngine() {
+ return searchEngine;
}
protected WikittyExtensionStorage getExtensionStorage() {
@@ -198,7 +198,7 @@
getExtensionStorage().store(tx, allExtensions);
WikittyEvent wikUpdate =
getWikittyStorage().store(tx, wikitties, force);
- getSearchEngin().store(tx, wikitties);
+ getSearchEngine().store(tx, wikitties);
WikittyEvent result = new WikittyEvent(this);
// prepare update client response
@@ -650,7 +650,7 @@
WikittyEvent eventDelete =
getWikittyStorage().delete(tx, idSet);
- getSearchEngin().delete(tx, idSet);
+ getSearchEngine().delete(tx, idSet);
WikittyEvent eventStore = store(securityToken, storedWikitties, false);
@@ -689,7 +689,7 @@
txBeginHere = true;
}
- getSearchEngin().clear(tx);
+ getSearchEngine().clear(tx);
WikittyEvent eventWik = getWikittyStorage().clear(tx);
WikittyEvent eventExt = getExtensionStorage().clear(tx);
@@ -730,7 +730,7 @@
}
PagedResult<String> result =
- getSearchEngin().findAllByCriteria(tx, criteria);
+ getSearchEngine().findAllByCriteria(tx, criteria);
if (txBeginHere) {
tx.commit();
}
@@ -920,7 +920,7 @@
}
WikittyTreeNode node = new WikittyTreeNodeImpl(w);
- Integer count = getSearchEngin().findNodeCount(tx, w, filter);
+ Integer count = getSearchEngine().findNodeCount(tx, w, filter);
HashMap.SimpleEntry<WikittyTreeNode, Integer> result =
new SimpleEntry<WikittyTreeNode, Integer>(node, count);
@@ -969,7 +969,7 @@
Map<WikittyTreeNode, Integer> result = new LinkedHashMap<WikittyTreeNode, Integer>();
- Map<String, Integer> search = getSearchEngin().findAllChildrenCount(
+ Map<String, Integer> search = getSearchEngine().findAllChildrenCount(
tx, w, filter);
Set<Entry<String, Integer>> children = search.entrySet();
for (Entry<String, Integer> child : children) {
@@ -1011,23 +1011,23 @@
* @param securityToken
*/
@Override
- public void syncEngin(final String securityToken) {
+ public void syncSearchEngine(final String securityToken) {
final WikittyTransaction tx = WikittyTransaction.get();
if (tx.isStarted()) {
- throw new WikittyException("Transaction must be not started for syncEngin method");
+ throw new WikittyException("Transaction must be not started for syncSearchEngine method");
}
boolean txBeginHere = false;
try {
final int numberForCommit = 1000;
- final WikittySearchEngin searchEngin = getSearchEngin();
+ final WikittySearchEngine searchEngine = getSearchEngine();
final List<Wikitty> wikitties = new ArrayList<Wikitty>(numberForCommit);
if (!tx.isStarted()) {
tx.begin();
txBeginHere = true;
}
- searchEngin.clear(tx);
+ searchEngine.clear(tx);
if (txBeginHere) {
tx.commit();
}
@@ -1048,7 +1048,7 @@
if(count == numberForCommit) {
// Reindex
- searchEngin.store(tx, wikitties);
+ searchEngine.store(tx, wikitties);
tx.commit();
// Reinit
count = 0;
@@ -1060,7 +1060,7 @@
});
// Last wikitties
- searchEngin.store(tx, wikitties);
+ searchEngine.store(tx, wikitties);
if (txBeginHere) {
tx.commit();
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceTransaction.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceTransaction.java 2010-12-02 01:13:56 UTC (rev 550)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceTransaction.java 2010-12-02 01:29:28 UTC (rev 551)
@@ -349,7 +349,7 @@
}
@Override
- public void syncEngin(String securityToken) {
+ public void syncSearchEngine(String securityToken) {
throw new UnsupportedOperationException("Not supported yet.");
}
Deleted: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngin.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngin.java 2010-12-02 01:13:56 UTC (rev 550)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngin.java 2010-12-02 01:29:28 UTC (rev 551)
@@ -1,96 +0,0 @@
-/*
- * #%L
- * Wikitty :: api
- *
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2009 - 2010 CodeLutin, Benjamin Poussin
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Lesser Public License for more details.
- *
- * You should have received a copy of the GNU General Lesser Public
- * License along with this program. If not, see
- * <http://www.gnu.org/licenses/lgpl-3.0.html>.
- * #L%
- */
-
-package org.nuiton.wikitty.storage;
-
-import java.util.Collection;
-import java.util.Map;
-import org.nuiton.wikitty.search.Criteria;
-import org.nuiton.wikitty.search.PagedResult;
-import org.nuiton.wikitty.entities.Wikitty;
-import org.nuiton.wikitty.WikittyException;
-import org.nuiton.wikitty.services.WikittyTransaction;
-
-/**
- * WikittySearchEngin is used to abstract search engine used in WikittyService.
- *
- *
- * @author poussin
- * @version $Revision$
- *
- * Last update: $Date$
- * by : $Author$
- */
-public interface WikittySearchEngin {
-
- /**
- * Remove all data in index
- */
- public void clear(WikittyTransaction transaction);
-
- /**
- * Store wikitty in storage
- * @return information usefull for client side update data
- */
- public void store(WikittyTransaction transaction,
- Collection<Wikitty> wikitties);
-
- /**
- * Delete all object with idList argument. If id is not valid or don't exist.
- *
- * @param idList list of ids to delete
- * @return <code>UpdateResponse</code>>
- * @throws WikittyException
- */
- public void delete(WikittyTransaction transaction,
- Collection<String> idList) throws WikittyException;
-
- /**
- * Delete all object with idList argument. idList is directly passed to search engine
- * and is processed without any other kind of treatment.
- *
- * @param idList list of ids to delete
- * @return <code>UpdateResponse</code>
- * @throws WikittyException
- */
- public void delete(Collection<String> idList) throws WikittyException;
-
- public PagedResult<String> findAllByCriteria(WikittyTransaction transaction, Criteria criteria);
-
- /**
- * Find count of child for a node
- * @param w
- * @return
- */
- public Integer findNodeCount(WikittyTransaction transaction, Wikitty w, Criteria filter);
-
- /**
- * Find all children ids with count for a node wikitty.
- * @param w
- * @return
- */
- public Map<String, Integer> findAllChildrenCount(WikittyTransaction transaction, Wikitty w, Criteria filter);
-
-}
Deleted: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEnginInMemory.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEnginInMemory.java 2010-12-02 01:13:56 UTC (rev 550)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEnginInMemory.java 2010-12-02 01:29:28 UTC (rev 551)
@@ -1,170 +0,0 @@
-/*
- * #%L
- * Wikitty :: api
- *
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2009 - 2010 CodeLutin, Benjamin Poussin
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Lesser Public License for more details.
- *
- * You should have received a copy of the GNU General Lesser Public
- * License along with this program. If not, see
- * <http://www.gnu.org/licenses/lgpl-3.0.html>.
- * #L%
- */
-package org.nuiton.wikitty.storage;
-
-import java.util.Collection;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import org.nuiton.wikitty.WikittyException;
-import org.nuiton.wikitty.entities.FieldType;
-import org.nuiton.wikitty.entities.FieldType.TYPE;
-import org.nuiton.wikitty.entities.Wikitty;
-import org.nuiton.wikitty.search.Criteria;
-import org.nuiton.wikitty.search.PagedResult;
-import org.nuiton.wikitty.search.operators.And;
-import org.nuiton.wikitty.search.operators.BinaryOperator;
-import org.nuiton.wikitty.search.operators.Element;
-import org.nuiton.wikitty.search.operators.Restriction;
-import org.nuiton.wikitty.services.WikittyTransaction;
-
-public class WikittySearchEnginInMemory implements WikittySearchEngin {
-
- WikittyStorageInMemory wikittyStorage;
-
- public WikittySearchEnginInMemory(WikittyStorageInMemory wikittyStorage) {
- this.wikittyStorage = wikittyStorage;
- }
-
- @Override
- public void clear(WikittyTransaction transaction) {
- // do nothing
- }
-
- @Override
- public void store(WikittyTransaction transaction, Collection<Wikitty> wikitties) {
- }
-
- @Override
- public void delete(WikittyTransaction transaction, Collection<String> idList) throws WikittyException {
- }
-
- @Override
- public void delete(Collection<String> idList) throws WikittyException {
- }
-
- public boolean checkRestriction(Restriction restriction, Wikitty w) {
- if (restriction instanceof BinaryOperator) {
- BinaryOperator binOp = (BinaryOperator) restriction;
- if (binOp.getElement().getName().equals(Element.ELT_EXTENSION)) {
- return w.hasExtension(binOp.getValue());
- }
- String fqfieldName = binOp.getElement().getName();
- if (Element.ELT_EXTENSION.equals(fqfieldName)) {
- return true;
- } else if (Element.ELT_ID.equals(fqfieldName)) {
- return w.getId().equals(binOp.getValue());
- } // si les wikitty n'ont meme pas l'extension concerné
- // Le check restriction, ne doit pas tester les champs
- // si les wikitty n'ont meme pas l'extension concerné
- String[] extName = fqfieldName.split("\\.");
- if (!w.hasField(extName[0], extName[1])) {
- return false;
- }
- Object o = w.getFqField(fqfieldName);
- FieldType t = w.getFieldType(fqfieldName);
- Object value = t.getValidValue(binOp.getValue());
- boolean checked = false;
- switch (restriction.getName()) {
- case EQUALS:
- checked = value.equals(o);
- break;
- case LESS:
- checked = ((Comparable) o).compareTo(value) < 0;
- break;
- case LESS_OR_EQUAL:
- checked = ((Comparable) o).compareTo(value) <= 0;
- break;
- case GREATER:
- checked = ((Comparable) o).compareTo(value) > 0;
- break;
- case GREATER_OR_EQUAL:
- checked = ((Comparable) o).compareTo(value) >= 0;
- break;
- case NOT_EQUALS:
- checked = !value.equals(o);
- break;
- case ENDS_WITH:
- if (t.getType() != TYPE.STRING) {
- throw new WikittyException("Can't search for contents that 'ends with' on attribute type different of String. " + "Attribute " + fqfieldName + " is " + t.getType().name());
- }
- checked = ((String) o).endsWith((String) value);
- break;
- case STARTS_WITH:
- if (t.getType() != TYPE.STRING) {
- throw new WikittyException("Can't search for contents that 'starts with' on attribute type different of String. " + "Attribute " + fqfieldName + " is " + t.getType().name());
- }
- checked = ((String) o).startsWith((String) value);
- break;
- }
- return checked;
- } else if (restriction instanceof And) {
- And and = (And) restriction;
- for (Restriction sub : and.getRestrictions()) {
- if (!checkRestriction(sub, w)) {
- return false;
- }
- }
- return true;
- } else {
- throw new UnsupportedOperationException(restriction.getName() + " Search Not yet implemented");
- }
- }
-
- @Override
- public PagedResult<String> findAllByCriteria(WikittyTransaction transaction, Criteria criteria) {
- // throw new UnsupportedOperationException("Not supported yet.");
- int firstIndex = criteria.getFirstIndex();
- int endIndex = criteria.getEndIndex();
- List<String> ids = new LinkedList<String>();
- int currentIndex = 0;
- for (Entry<String, Wikitty> entry : wikittyStorage.getWikitties().entrySet()) {
- Wikitty w = entry.getValue();
- String id = entry.getKey();
- Restriction dto = criteria.getRestriction();
- if (!w.isDeleted() && checkRestriction(dto, w)) {
- currentIndex++;
- if (currentIndex > firstIndex) {
- ids.add(id);
- }
- if (endIndex >= 0 && currentIndex >= endIndex) {
- break;
- }
- }
- }
- return new PagedResult<String>(firstIndex, ids.size(), criteria.getRestriction().toString(), null, ids);
- }
-
- @Override
- public Integer findNodeCount(WikittyTransaction transaction, Wikitty w, Criteria filter) {
- throw new UnsupportedOperationException("Not supported yet.");
- }
-
- @Override
- public Map<String, Integer> findAllChildrenCount(WikittyTransaction transaction, Wikitty w, Criteria filter) {
- throw new UnsupportedOperationException("Not supported yet.");
- }
-}
Copied: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngine.java (from rev 549, trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngin.java)
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngine.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngine.java 2010-12-02 01:29:28 UTC (rev 551)
@@ -0,0 +1,96 @@
+/*
+ * #%L
+ * Wikitty :: api
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2009 - 2010 CodeLutin, Benjamin Poussin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Lesser Public License for more details.
+ *
+ * You should have received a copy of the GNU General Lesser Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/lgpl-3.0.html>.
+ * #L%
+ */
+
+package org.nuiton.wikitty.storage;
+
+import java.util.Collection;
+import java.util.Map;
+import org.nuiton.wikitty.search.Criteria;
+import org.nuiton.wikitty.search.PagedResult;
+import org.nuiton.wikitty.entities.Wikitty;
+import org.nuiton.wikitty.WikittyException;
+import org.nuiton.wikitty.services.WikittyTransaction;
+
+/**
+ * WikittySearchEngine is used to abstract search engine used in WikittyService.
+ *
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public interface WikittySearchEngine {
+
+ /**
+ * Remove all data in index
+ */
+ public void clear(WikittyTransaction transaction);
+
+ /**
+ * Store wikitty in storage
+ * @return information usefull for client side update data
+ */
+ public void store(WikittyTransaction transaction,
+ Collection<Wikitty> wikitties);
+
+ /**
+ * Delete all object with idList argument. If id is not valid or don't exist.
+ *
+ * @param idList list of ids to delete
+ * @return <code>UpdateResponse</code>>
+ * @throws WikittyException
+ */
+ public void delete(WikittyTransaction transaction,
+ Collection<String> idList) throws WikittyException;
+
+ /**
+ * Delete all object with idList argument. idList is directly passed to search engine
+ * and is processed without any other kind of treatment.
+ *
+ * @param idList list of ids to delete
+ * @return <code>UpdateResponse</code>
+ * @throws WikittyException
+ */
+ public void delete(Collection<String> idList) throws WikittyException;
+
+ public PagedResult<String> findAllByCriteria(WikittyTransaction transaction, Criteria criteria);
+
+ /**
+ * Find count of child for a node
+ * @param w
+ * @return
+ */
+ public Integer findNodeCount(WikittyTransaction transaction, Wikitty w, Criteria filter);
+
+ /**
+ * Find all children ids with count for a node wikitty.
+ * @param w
+ * @return
+ */
+ public Map<String, Integer> findAllChildrenCount(WikittyTransaction transaction, Wikitty w, Criteria filter);
+
+}
Copied: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemory.java (from rev 549, trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEnginInMemory.java)
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemory.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemory.java 2010-12-02 01:29:28 UTC (rev 551)
@@ -0,0 +1,170 @@
+/*
+ * #%L
+ * Wikitty :: api
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2009 - 2010 CodeLutin, Benjamin Poussin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Lesser Public License for more details.
+ *
+ * You should have received a copy of the GNU General Lesser Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/lgpl-3.0.html>.
+ * #L%
+ */
+package org.nuiton.wikitty.storage;
+
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import org.nuiton.wikitty.WikittyException;
+import org.nuiton.wikitty.entities.FieldType;
+import org.nuiton.wikitty.entities.FieldType.TYPE;
+import org.nuiton.wikitty.entities.Wikitty;
+import org.nuiton.wikitty.search.Criteria;
+import org.nuiton.wikitty.search.PagedResult;
+import org.nuiton.wikitty.search.operators.And;
+import org.nuiton.wikitty.search.operators.BinaryOperator;
+import org.nuiton.wikitty.search.operators.Element;
+import org.nuiton.wikitty.search.operators.Restriction;
+import org.nuiton.wikitty.services.WikittyTransaction;
+
+public class WikittySearchEngineInMemory implements WikittySearchEngine {
+
+ WikittyStorageInMemory wikittyStorage;
+
+ public WikittySearchEngineInMemory(WikittyStorageInMemory wikittyStorage) {
+ this.wikittyStorage = wikittyStorage;
+ }
+
+ @Override
+ public void clear(WikittyTransaction transaction) {
+ // do nothing
+ }
+
+ @Override
+ public void store(WikittyTransaction transaction, Collection<Wikitty> wikitties) {
+ }
+
+ @Override
+ public void delete(WikittyTransaction transaction, Collection<String> idList) throws WikittyException {
+ }
+
+ @Override
+ public void delete(Collection<String> idList) throws WikittyException {
+ }
+
+ public boolean checkRestriction(Restriction restriction, Wikitty w) {
+ if (restriction instanceof BinaryOperator) {
+ BinaryOperator binOp = (BinaryOperator) restriction;
+ if (binOp.getElement().getName().equals(Element.ELT_EXTENSION)) {
+ return w.hasExtension(binOp.getValue());
+ }
+ String fqfieldName = binOp.getElement().getName();
+ if (Element.ELT_EXTENSION.equals(fqfieldName)) {
+ return true;
+ } else if (Element.ELT_ID.equals(fqfieldName)) {
+ return w.getId().equals(binOp.getValue());
+ } // si les wikitty n'ont meme pas l'extension concerné
+ // Le check restriction, ne doit pas tester les champs
+ // si les wikitty n'ont meme pas l'extension concerné
+ String[] extName = fqfieldName.split("\\.");
+ if (!w.hasField(extName[0], extName[1])) {
+ return false;
+ }
+ Object o = w.getFqField(fqfieldName);
+ FieldType t = w.getFieldType(fqfieldName);
+ Object value = t.getValidValue(binOp.getValue());
+ boolean checked = false;
+ switch (restriction.getName()) {
+ case EQUALS:
+ checked = value.equals(o);
+ break;
+ case LESS:
+ checked = ((Comparable) o).compareTo(value) < 0;
+ break;
+ case LESS_OR_EQUAL:
+ checked = ((Comparable) o).compareTo(value) <= 0;
+ break;
+ case GREATER:
+ checked = ((Comparable) o).compareTo(value) > 0;
+ break;
+ case GREATER_OR_EQUAL:
+ checked = ((Comparable) o).compareTo(value) >= 0;
+ break;
+ case NOT_EQUALS:
+ checked = !value.equals(o);
+ break;
+ case ENDS_WITH:
+ if (t.getType() != TYPE.STRING) {
+ throw new WikittyException("Can't search for contents that 'ends with' on attribute type different of String. " + "Attribute " + fqfieldName + " is " + t.getType().name());
+ }
+ checked = ((String) o).endsWith((String) value);
+ break;
+ case STARTS_WITH:
+ if (t.getType() != TYPE.STRING) {
+ throw new WikittyException("Can't search for contents that 'starts with' on attribute type different of String. " + "Attribute " + fqfieldName + " is " + t.getType().name());
+ }
+ checked = ((String) o).startsWith((String) value);
+ break;
+ }
+ return checked;
+ } else if (restriction instanceof And) {
+ And and = (And) restriction;
+ for (Restriction sub : and.getRestrictions()) {
+ if (!checkRestriction(sub, w)) {
+ return false;
+ }
+ }
+ return true;
+ } else {
+ throw new UnsupportedOperationException(restriction.getName() + " Search Not yet implemented");
+ }
+ }
+
+ @Override
+ public PagedResult<String> findAllByCriteria(WikittyTransaction transaction, Criteria criteria) {
+ // throw new UnsupportedOperationException("Not supported yet.");
+ int firstIndex = criteria.getFirstIndex();
+ int endIndex = criteria.getEndIndex();
+ List<String> ids = new LinkedList<String>();
+ int currentIndex = 0;
+ for (Entry<String, Wikitty> entry : wikittyStorage.getWikitties().entrySet()) {
+ Wikitty w = entry.getValue();
+ String id = entry.getKey();
+ Restriction dto = criteria.getRestriction();
+ if (!w.isDeleted() && checkRestriction(dto, w)) {
+ currentIndex++;
+ if (currentIndex > firstIndex) {
+ ids.add(id);
+ }
+ if (endIndex >= 0 && currentIndex >= endIndex) {
+ break;
+ }
+ }
+ }
+ return new PagedResult<String>(firstIndex, ids.size(), criteria.getRestriction().toString(), null, ids);
+ }
+
+ @Override
+ public Integer findNodeCount(WikittyTransaction transaction, Wikitty w, Criteria filter) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public Map<String, Integer> findAllChildrenCount(WikittyTransaction transaction, Wikitty w, Criteria filter) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+}
Modified: trunk/wikitty-api/src/main/resources/wikitty-config-sample-inmemory.properties
===================================================================
--- trunk/wikitty-api/src/main/resources/wikitty-config-sample-inmemory.properties 2010-12-02 01:13:56 UTC (rev 550)
+++ trunk/wikitty-api/src/main/resources/wikitty-config-sample-inmemory.properties 2010-12-02 01:29:28 UTC (rev 551)
@@ -37,7 +37,7 @@
org.nuiton.wikitty.services.WikittyServiceSecurity
wikitty.WikittyServiceStorage.components=org.nuiton.wikitty.jdbc.WikittyExtensionStorageJDBC,\
org.nuiton.wikitty.jdbc.WikittyStorageJDBC,\
-org.nuiton.wikitty.solr.WikittySearchEnginSolr
+org.nuiton.wikitty.solr.WikittySearchEngineSolr
wikitty.searchengine.solr.directory.factory=org.nuiton.wikitty.solr.RAMDirectoryFactory
wikitty.service.cache.allwaysRestoreCopies=false
wikitty.service.event.propagate=false
Modified: trunk/wikitty-api/src/main/resources/wikitty-config-sample-server-slave.properties
===================================================================
--- trunk/wikitty-api/src/main/resources/wikitty-config-sample-server-slave.properties 2010-12-02 01:13:56 UTC (rev 550)
+++ trunk/wikitty-api/src/main/resources/wikitty-config-sample-server-slave.properties 2010-12-02 01:29:28 UTC (rev 551)
@@ -41,7 +41,7 @@
org.nuiton.wikitty.services.WikittyServiceHessianServer
wikitty.WikittyServiceStorage.components=org.nuiton.wikitty.jdbc.WikittyExtensionStorageJDBC,\
org.nuiton.wikitty.jdbc.WikittyStorageJDBC,\
-org.nuiton.wikitty.solr.WikittySearchEnginSolr
+org.nuiton.wikitty.solr.WikittySearchEngineSolr
wikitty.WikittyServiceNotifier.components=org.nuiton.wikitty.services.XMPPNotifierTransporter
wikitty.service.server.url=http://services-slave.codelutin.com/wikitty
wikitty.service.cache.allwaysRestoreCopies=false
Modified: trunk/wikitty-api/src/main/resources/wikitty-config-sample-server.properties
===================================================================
--- trunk/wikitty-api/src/main/resources/wikitty-config-sample-server.properties 2010-12-02 01:13:56 UTC (rev 550)
+++ trunk/wikitty-api/src/main/resources/wikitty-config-sample-server.properties 2010-12-02 01:29:28 UTC (rev 551)
@@ -40,7 +40,7 @@
org.nuiton.wikitty.services.WikittyServiceHessianServer
wikitty.WikittyServiceStorage.components=org.nuiton.wikitty.jdbc.WikittyExtensionStorageJDBC,\
org.nuiton.wikitty.jdbc.WikittyStorageJDBC,\
-org.nuiton.wikitty.solr.WikittySearchEnginSolr
+org.nuiton.wikitty.solr.WikittySearchEngineSolr
wikitty.WikittyServiceNotifier.components=org.nuiton.wikitty.services.XMPPNotifierTransporter
wikitty.service.server.url=http://services.codelutin.com/wikitty
wikitty.service.cache.listenevents=false
Modified: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/services/WikittyServiceHelperTest.java
===================================================================
--- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/services/WikittyServiceHelperTest.java 2010-12-02 01:13:56 UTC (rev 550)
+++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/services/WikittyServiceHelperTest.java 2010-12-02 01:29:28 UTC (rev 551)
@@ -33,7 +33,7 @@
import org.nuiton.wikitty.WikittyService;
import org.nuiton.wikitty.WikittyServiceFactory;
import org.nuiton.wikitty.storage.WikittyExtensionStorageInMemory;
-import org.nuiton.wikitty.storage.WikittySearchEnginInMemory;
+import org.nuiton.wikitty.storage.WikittySearchEngineInMemory;
import org.nuiton.wikitty.storage.WikittyStorageInMemory;
/**
@@ -74,7 +74,7 @@
config.setOption(WikittyConfig.WikittyOption.WIKITTY_WIKITTYSERVICESTORAGE_COMPONENTS.getKey(),
WikittyStorageInMemory.class.getName()
+ "," + WikittyExtensionStorageInMemory.class.getName()
- + "," + WikittySearchEnginInMemory.class.getName());
+ + "," + WikittySearchEngineInMemory.class.getName());
WikittyService ws = WikittyServiceFactory.buildWikittyService(config);
Assert.assertEquals(WikittyServiceSecurity.class, ws.getClass());
Modified: trunk/wikitty-jdbc-impl/src/main/java/org/nuiton/wikitty/jdbc/WikittyServiceJDBC.java
===================================================================
--- trunk/wikitty-jdbc-impl/src/main/java/org/nuiton/wikitty/jdbc/WikittyServiceJDBC.java 2010-12-02 01:13:56 UTC (rev 550)
+++ trunk/wikitty-jdbc-impl/src/main/java/org/nuiton/wikitty/jdbc/WikittyServiceJDBC.java 2010-12-02 01:29:28 UTC (rev 551)
@@ -29,7 +29,7 @@
import org.apache.commons.logging.LogFactory;
import org.nuiton.util.ApplicationConfig;
import org.nuiton.wikitty.services.WikittyServiceStorage;
-import org.nuiton.wikitty.solr.WikittySearchEnginSolr;
+import org.nuiton.wikitty.solr.WikittySearchEngineSolr;
/**
* @author poussin
@@ -46,7 +46,7 @@
public WikittyServiceJDBC(ApplicationConfig config) {
extensionStorage = new WikittyExtensionStorageJDBC(config);
wikittyStorage = new WikittyStorageJDBC(config, extensionStorage);
- searchEngin = new WikittySearchEnginSolr(config, extensionStorage);
+ searchEngine = new WikittySearchEngineSolr(config, extensionStorage);
}
}
Modified: trunk/wikitty-jdbc-impl/src/main/java/org/nuiton/wikitty/services/WikittyServiceInMemoryJdbcSolr.java
===================================================================
--- trunk/wikitty-jdbc-impl/src/main/java/org/nuiton/wikitty/services/WikittyServiceInMemoryJdbcSolr.java 2010-12-02 01:13:56 UTC (rev 550)
+++ trunk/wikitty-jdbc-impl/src/main/java/org/nuiton/wikitty/services/WikittyServiceInMemoryJdbcSolr.java 2010-12-02 01:29:28 UTC (rev 551)
@@ -32,7 +32,7 @@
import org.nuiton.wikitty.WikittyConfig;
import org.nuiton.wikitty.jdbc.WikittyExtensionStorageJDBC;
import org.nuiton.wikitty.jdbc.WikittyStorageJDBC;
-import org.nuiton.wikitty.solr.WikittySearchEnginSolr;
+import org.nuiton.wikitty.solr.WikittySearchEngineSolr;
/**
* In memory implementation that use in memory h2 and in memory solr
@@ -67,7 +67,7 @@
extensionStorage = new WikittyExtensionStorageJDBC(config);
wikittyStorage = new WikittyStorageJDBC(config, extensionStorage);
- searchEngin = new WikittySearchEnginSolr(config, extensionStorage);
+ searchEngine = new WikittySearchEngineSolr(config, extensionStorage);
}
}
Modified: trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/solr/Restriction2Solr.java
===================================================================
--- trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/solr/Restriction2Solr.java 2010-12-02 01:13:56 UTC (rev 550)
+++ trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/solr/Restriction2Solr.java 2010-12-02 01:29:28 UTC (rev 551)
@@ -72,7 +72,7 @@
private static final int MAX_SUBQUERY_RESULT = 100;
- final static protected WikittySearchEnginSolr.FieldModifier dummyFieldModifier = new WikittySearchEnginSolr.FieldModifier() {
+ final static protected WikittySearchEngineSolr.FieldModifier dummyFieldModifier = new WikittySearchEngineSolr.FieldModifier() {
public String convertToSolr(WikittyTransaction transaction, String fieldname) {
return fieldname;
}
@@ -81,7 +81,7 @@
}
};
- protected WikittySearchEnginSolr.FieldModifier fieldModifer;
+ protected WikittySearchEngineSolr.FieldModifier fieldModifer;
protected WikittyTransaction transaction;
public Restriction2Solr() {
@@ -89,7 +89,7 @@
}
// TODO 20101201 jru improve manage transaction and fieldModifeir in helper
- public Restriction2Solr(WikittyTransaction transaction, WikittySearchEnginSolr.FieldModifier fieldModifer) {
+ public Restriction2Solr(WikittyTransaction transaction, WikittySearchEngineSolr.FieldModifier fieldModifer) {
this.transaction = transaction;
this.fieldModifer = fieldModifer;
}
@@ -185,7 +185,7 @@
private String associated2solr(AssociatedRestriction associated, SolrServer solr) throws WikittyException {
String subQuery = toSolr( associated.getRestriction() );
- SolrQuery query = new SolrQuery(WikittySearchEnginSolr.SOLR_QUERY_PARSER + subQuery);
+ SolrQuery query = new SolrQuery(WikittySearchEngineSolr.SOLR_QUERY_PARSER + subQuery);
query.setRows(MAX_SUBQUERY_RESULT);
QueryResponse resp = null;
try {
@@ -201,11 +201,11 @@
throw new WikittyException("Associated " + associated.getElement().getName() + " do not retrieved any result");
}
if ( size == 1 ) {
- generatedRestriction = RestrictionHelper.eq( associated.getElement(), (String) solrResults.get(0).getFieldValue(WikittySearchEnginSolr.SOLR_ID) );
+ generatedRestriction = RestrictionHelper.eq( associated.getElement(), (String) solrResults.get(0).getFieldValue(WikittySearchEngineSolr.SOLR_ID) );
} else {
List<String> ids = new ArrayList<String>(solrResults.size());
for (SolrDocument doc : solrResults) {
- String id = (String) doc.getFieldValue(WikittySearchEnginSolr.SOLR_ID);
+ String id = (String) doc.getFieldValue(WikittySearchEngineSolr.SOLR_ID);
ids.add(id);
}
generatedRestriction = new In(associated.getElement(), ids);
@@ -415,11 +415,11 @@
}
private String isNull2solr(Null isNull) {
- return "( *:* - " + WikittySearchEnginSolr.SOLR_NOT_NULL_FIELDS + ":" + isNull.getFieldName() + ")";
+ return "( *:* - " + WikittySearchEngineSolr.SOLR_NOT_NULL_FIELDS + ":" + isNull.getFieldName() + ")";
}
private String isNotNull2solr(Null isNotNull) {
- return WikittySearchEnginSolr.SOLR_NOT_NULL_FIELDS + ":" + isNotNull.getFieldName();
+ return WikittySearchEngineSolr.SOLR_NOT_NULL_FIELDS + ":" + isNotNull.getFieldName();
}
private String element2solr(Element element) throws WikittyException {
Deleted: trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/solr/WikittySearchEnginSolr.java
===================================================================
--- trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/solr/WikittySearchEnginSolr.java 2010-12-02 01:13:56 UTC (rev 550)
+++ trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/solr/WikittySearchEnginSolr.java 2010-12-02 01:29:28 UTC (rev 551)
@@ -1,925 +0,0 @@
-/*
- * #%L
- * Wikitty :: wikitty-solr-impl
- *
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2009 - 2010 CodeLutin, Benjamin POUSSIN
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Lesser Public License for more details.
- *
- * You should have received a copy of the GNU General Lesser Public
- * License along with this program. If not, see
- * <http://www.gnu.org/licenses/lgpl-3.0.html>.
- * #L%
- */
-
-package org.nuiton.wikitty.solr;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.solr.client.solrj.SolrQuery;
-import org.apache.solr.client.solrj.SolrServer;
-import org.apache.solr.client.solrj.SolrServerException;
-import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer;
-import org.apache.solr.client.solrj.response.FacetField;
-import org.apache.solr.client.solrj.response.QueryResponse;
-import org.apache.solr.common.SolrDocument;
-import org.apache.solr.common.SolrDocumentList;
-import org.apache.solr.common.SolrInputDocument;
-import org.apache.solr.core.CoreContainer;
-import org.nuiton.wikitty.search.Criteria;
-import org.nuiton.wikitty.search.FacetTopic;
-import org.nuiton.wikitty.entities.FieldType;
-import org.nuiton.wikitty.entities.FieldType.TYPE;
-import org.nuiton.wikitty.search.PagedResult;
-import org.nuiton.wikitty.entities.WikittyTreeNode;
-import org.nuiton.wikitty.entities.Wikitty;
-import org.nuiton.wikitty.WikittyException;
-import org.nuiton.wikitty.entities.WikittyExtension;
-import org.nuiton.wikitty.storage.WikittyExtensionStorage;
-import org.nuiton.wikitty.storage.WikittySearchEngin;
-import org.nuiton.wikitty.services.WikittyTransaction;
-import org.nuiton.wikitty.search.operators.Element;
-import org.nuiton.wikitty.search.Search;
-
-import com.arjuna.ats.arjuna.coordinator.BasicAction;
-import com.arjuna.ats.arjuna.coordinator.OnePhaseResource;
-import com.arjuna.ats.arjuna.coordinator.TwoPhaseOutcome;
-import com.arjuna.ats.arjuna.state.InputObjectState;
-import com.arjuna.ats.arjuna.state.OutputObjectState;
-import com.arjuna.ats.internal.arjuna.abstractrecords.LastResourceRecord;
-import java.io.File;
-import org.nuiton.util.ApplicationConfig;
-import org.nuiton.wikitty.WikittyConfig;
-
-/**
- *
- * @author poussin
- * @version $Revision$
- *
- * Last update: $Date$
- * by : $Author$
- */
-public class WikittySearchEnginSolr implements WikittySearchEngin {
-
- /** to use log facility, just put in your code: log.info(\"...\"); */
- static private Log log = LogFactory.getLog(WikittySearchEnginSolr.class);
-
- /** id field in solr */
- static final protected String SOLR_ID = "id";
-
- /** extensions field name in solr */
- static final public String SOLR_EXTENSIONS = "extensions";
-
- /** group all fields is not null */
- static final public String SOLR_NOT_NULL_FIELDS = "not_null_fields";
-
- /** extension use to store field without extension to search on all extesnion */
- static final public String SOLR_ALL_EXTENSIONS = "all";
-
- /** Precise the query parser to use, is allow leading wildcard */
- static final public String SOLR_QUERY_PARSER = "{!wikitty}";
-
- // Use for indexation tree node
- static final public String TREENODE_PREFIX = WikittyTreeNode.EXT_WIKITTYTREENODE + ".";
- static final public String TREENODE_EMPTY = TREENODE_PREFIX + "empty";
- static final public String TREENODE_ROOT = TREENODE_PREFIX + "root";
- static final public String TREENODE_PATH = TREENODE_PREFIX + "path";
-
- /** use to permit client to modify fieldname during query generation */
- static public interface FieldModifier {
- public String convertToSolr(WikittyTransaction transaction, String fieldname);
- public String convertToField(WikittyTransaction transaction, String solrName);
- }
-
- static protected class TypeFieldModifer implements FieldModifier {
- protected WikittyExtensionStorage extensionStorage;
- public TypeFieldModifer(WikittyExtensionStorage extensionStorage) {
- this.extensionStorage = extensionStorage;
- }
-
- @Override
- public String convertToSolr(WikittyTransaction transaction, String fqfieldname) {
- String result = fqfieldname;
- String[] searchField = fqfieldname.split("\\.");
-
- if (Element.ELT_EXTENSION.equals(fqfieldname)) {
- result = SOLR_EXTENSIONS;
-
- } else if (Element.ELT_ID.equals(fqfieldname)) {
- result = SOLR_ID;
-
- } else if (searchField.length >= 2) {
- String extName = searchField[0];
- String fieldName = searchField[1];
-
- if (Criteria.ALL_EXTENSIONS.equals(extName)) {
- fqfieldname = SOLR_ALL_EXTENSIONS + "." + fieldName;
- }
-
- if (searchField.length >= 3) {
- String fieldNameType = searchField[2];
- TYPE type = FieldType.TYPE.valueOf(fieldNameType);
- result = WikittySearchEnginSolr.getSolrFieldName(fqfieldname, type);
- return result;
- }
-
- // Search type of field in extension
- String version = extensionStorage.getLastVersion(transaction, extName);
- if (version != null) { // not valid extension is version == null
- WikittyExtension ext = extensionStorage.restore(transaction, extName, version);
- FieldType fieldType = ext.getFieldType(fieldName);
- log.debug(ext.toDefinition() + " for " + fieldName);
- if (fieldType != null) { // type can be null if extension version differ
- TYPE type = fieldType.getType();
- result = WikittySearchEnginSolr.getSolrFieldName(fqfieldname, type);
- return result;
- }
- }
- }
-
- return result;
- }
-
- @Override
- public String convertToField(WikittyTransaction transaction, String solrName) {
- String fieldName = solrName.replaceAll("(_b$)|(_dt$)|(_s$)|(_d$)", "");
- if(SOLR_EXTENSIONS.equals(fieldName)) {
- fieldName = Element.ELT_EXTENSION;
- }
- return fieldName;
- }
- }
-
- /**
- * Helper to get information nodes and elements for reindexation.
- */
- static protected class ReindexChildTreeNode {
-
- protected SolrResource solrResource;
- protected SolrServer solrServer;
-
- protected Map<String, Collection<String>> includedNodeIds;
- protected Map<String, Collection<String>> excludedNodeIds;
- protected Map<String, String> parents;
-
- public ReindexChildTreeNode(SolrServer solrServer, SolrResource solrResource) {
- this.solrServer = solrServer;
- this.solrResource = solrResource;
- includedNodeIds = new HashMap<String, Collection<String>>();
- excludedNodeIds = new HashMap<String, Collection<String>>();
- parents = new HashMap<String, String>();
- }
-
- public void putIncludedAttachments(String nodeId, Collection<String> attchmentIds) {
- putAttachements(includedNodeIds, nodeId, attchmentIds);
- }
-
- public void putExcludedAttachments(String nodeId, Collection<String> attachmentIds) {
- putAttachements(excludedNodeIds, nodeId, attachmentIds);
- }
-
- public void putIncludedAttachment(String nodeId, String attachmentId) {
- putAttachment(includedNodeIds, nodeId, attachmentId);
- }
-
- public void putExcludedAttachment(String nodeId, String attachmentId) {
- putAttachment(excludedNodeIds, nodeId, attachmentId);
- }
-
- public Collection<String> getExcludedNodeIds(String attachmentId) {
- Collection<String> result = excludedNodeIds.get(attachmentId);
- if (result == null) {
- result = new HashSet<String>();
- }
- return result;
- }
-
- public Collection<String> getIncludedNodeIds(String attachmentId) {
- Collection<String> result = includedNodeIds.get(attachmentId);
- if (result == null) {
- result = new HashSet<String>();
- }
- return result;
- }
-
- protected void putAttachements(Map<String, Collection<String>> map, String nodeId, Collection<String> attachmentIds) {
- if (attachmentIds != null) {
- for (String attachmentId : attachmentIds) {
- putAttachment(map, nodeId, attachmentId);
- }
- }
- }
-
- protected void putAttachment(Map<String, Collection<String>> map, String nodeId, String attachmentId) {
- Collection<String> values = map.get(attachmentId);
- if(values == null) {
- values = new HashSet<String>();
- map.put(attachmentId, values);
- }
- values.add(nodeId);
- }
-
- public void putParent(String nodeId, String parentId) {
- parents.put(nodeId, parentId);
- }
-
- public String getParent(String nodeId) {
- String parentId = parents.get(nodeId);
-
- // If not found in map, search in index
- if(parentId == null) {
- SolrDocument doc = findById(solrServer, nodeId);
- if(doc == null) {
- // is root
- return null;
- }
- parentId = (String) doc.getFieldValue(WikittyTreeNode.FQ_FIELD_WIKITTYTREENODE_PARENT);
- parents.put(nodeId, parentId);
- }
-
- Collection<String> deletedDocIds = solrResource.getDeletedDocs();
- if(deletedDocIds.contains(parentId)) {
- return null;
- }
- return parentId;
- }
-
- public Collection<String> getReindexIds() {
- Collection<String> result = new HashSet<String>();
- result.addAll(includedNodeIds.keySet());
- result.addAll(excludedNodeIds.keySet());
- result.addAll(solrResource.getAddedDocIds());
- return result;
- }
-
- /**
- * Add in doc fields on association between nodes.
- *
- * For example if you have a element in node with parent, like this
- * A -> B -> C => element, the method add field in document solr :
- * TreeNode.root : A
- * TreeNode.A : B
- * TreeNode.B : C
- * TreeNode.C : TreeNode.empty
- *
- * @throws SolrServerException
- */
- public void reindex() throws SolrServerException {
- for (String id : getReindexIds()) {
-
- // Get documents
- SolrInputDocument doc = solrResource.getAddedDoc(id);
- if(doc == null) {
- doc = new SolrInputDocument();
-
- // Copy old field value
- SolrDocument found = findById(solrServer, id);
- if (found != null) {
- Collection<String> fieldNames = found.getFieldNames();
- for (String fieldName : fieldNames) {
- Collection<Object> fieldValues = found.getFieldValues(fieldName);
-
- if(!fieldName.startsWith(TREENODE_PREFIX)) {
- for (Object fieldValue : fieldValues) {
- doc.addField(fieldName, fieldValue);
- }
- }
- }
-
- solrResource.addDoc(id, doc);
- } else {
- if (log.isWarnEnabled()) {
- log.warn("Can't find wikitty id '" + id + "' in index. Skip this wikitty.");
- }
- }
- }
-
- // Add tree node fields
- Collection<String> includedChildNodeIds = getIncludedNodeIds(id);
- Collection<String> excludedChildNodeIds = getExcludedNodeIds(id);
-
- // Find all node contain child
- SolrQuery query = new SolrQuery(SOLR_QUERY_PARSER + WikittyTreeNode.FQ_FIELD_WIKITTYTREENODE_ATTACHMENT + ":" + id);
- QueryResponse response = solrServer.query(query);
- SolrDocumentList updateDocs = response.getResults();
-
- for (Iterator<SolrDocument> iterator = updateDocs.iterator();
- iterator.hasNext();) {
- SolrDocument solrDocument = iterator.next();
-
- String nodeId = (String) solrDocument.getFieldValue(SOLR_ID);
- includedChildNodeIds.add(nodeId);
- }
-
- // Excluded nodes
- includedChildNodeIds.removeAll(excludedChildNodeIds);
- includedChildNodeIds.removeAll(solrResource.getDeletedDocs());
-
- // Add paths in doc
- Map<String, String> paths = new HashMap<String, String>();
- for (String nodeId : includedChildNodeIds) {
- doc.addField(TREENODE_PREFIX + nodeId, TREENODE_EMPTY);
-
- // Add path
- String childParent = nodeId;
- String parent = getParent(childParent);
- while (parent != null) {
- String parentPath = paths.get(childParent);
- if(parentPath == null) {
- doc.addField(TREENODE_PREFIX + parent, childParent);
- paths.put(childParent, parent);
- }
-
- childParent = parent;
- parent = getParent(childParent);
- }
-
- String parentPath = paths.get(childParent);
- if(parentPath == null) {
- doc.addField(TREENODE_ROOT, childParent);
- paths.put(childParent, TREENODE_ROOT);
- }
- }
- }
- }
- }
-
- /**
- * Use to plug solr indexation in JTA transaction.
- */
- static protected class SolrResource implements OnePhaseResource {
-
- protected SolrServer solrServer;
- protected ThreadLocal<Map<String, SolrInputDocument>> addedDocs;
- protected ThreadLocal<List<String>> deletedDocs;
-
- public SolrResource(SolrServer solrServer) {
- this.solrServer = solrServer;
- addedDocs = new ThreadLocal<Map<String, SolrInputDocument>>();
- deletedDocs = new ThreadLocal<List<String>>();
-
- clear();
- }
-
- protected void init() {
- // Add resource on phase in current transaction
- LastResourceRecord lastResourceRecord = new LastResourceRecord(this);
- BasicAction.Current().add(lastResourceRecord);
- }
-
- public Map<String, SolrInputDocument> getAddedDocs() {
- Map<String, SolrInputDocument> result = addedDocs.get();
- if(result == null) {
- result = new HashMap<String, SolrInputDocument>();
- addedDocs.set(result);
- }
- return result;
- }
-
- public List<String> getDeletedDocs() {
- List<String> result = deletedDocs.get();
- if(result == null) {
- result = new ArrayList<String>();
- deletedDocs.set(result);
- }
- return result;
- }
-
- public void clear() {
- addedDocs.set(new HashMap<String, SolrInputDocument>());
- deletedDocs.set(new ArrayList<String>());
- }
-
- public void addDoc(String id, SolrInputDocument doc) {
- getAddedDocs().put(id, doc);
- }
-
- public SolrInputDocument getAddedDoc(String id) {
- SolrInputDocument result = getAddedDocs().get(id);
- return result;
- }
-
- public Collection<String> getAddedDocIds() {
- Collection<String> result = getAddedDocs().keySet();
- return result;
- }
-
- public void deleteDoc(String docId) {
- getDeletedDocs().add(docId);
- }
-
- @Override
- public int commit() {
- try {
- synchronized(this) {
- Collection<SolrInputDocument> docs = getAddedDocs().values();
- if(!docs.isEmpty()) {
- solrServer.add(docs);
- }
- List<String> ids = getDeletedDocs();
- if(!ids.isEmpty()) {
- solrServer.deleteById(ids);
- }
- solrServer.commit();
- }
- clear();
- return TwoPhaseOutcome.FINISH_OK;
- } catch (Exception eee) {
- log.error("Error commit solr", eee);
- return TwoPhaseOutcome.FINISH_ERROR;
- }
- }
-
- @Override
- public int rollback() {
- clear();
- return TwoPhaseOutcome.FINISH_OK;
- }
-
- @Override
- public void pack(OutputObjectState arg0) throws IOException {
- }
-
- @Override
- public void unpack(InputObjectState arg0) throws IOException {
- }
- }
-
- /** solr server */
- protected SolrServer solrServer;
-
- /** Field modifier use to transform to solr format */
- protected TypeFieldModifer fieldModifier;
-
- /** JTA resource */
- protected SolrResource solrResource;
-
- /**
- * Init wikitty search engin on solr embedded server.
- *
- * @param extensionStorage extension storage
- * @param properties properties (can be null)
- */
- public WikittySearchEnginSolr(
- ApplicationConfig config, WikittyExtensionStorage extensionStorage) {
-
- // init system env solr.data.dir
- if (config != null) {
- // choix du storage (file or Ram)
- String solrDirFactoryKey =
- WikittyConfig.WikittyOption.WIKITTY_SEARCHENGINE_SOLR_DIRECTORY_FACTORY.getKey();
- String solrDirFactory = config.getOption(solrDirFactoryKey);
- if (solrDirFactory != null) {
- System.setProperty(solrDirFactoryKey, solrDirFactory);
- }
-
- // on utilise le directory que si on est pas en Ram
- if (solrDirFactory != null && !solrDirFactory.contains("RAMDirectoryFactory")) {
- String solrDataDirKey =
- WikittyConfig.WikittyOption.WIKITTY_SEARCHENGINE_SOLR_DIRECTORY_DATA.getKey();
- String solrDataDir = config.getOption(solrDataDirKey);
- // make sure that dir exists
- if (solrDataDir != null) {
- File file = new File(solrDataDir);
- file.mkdirs();
- System.setProperty(solrDataDirKey, solrDataDir);
- }
- }
- }
-
- try {
- CoreContainer.Initializer initializer = new CoreContainer.Initializer();
- CoreContainer coreContainer = initializer.initialize();
- solrServer = new EmbeddedSolrServer(coreContainer, "");
-
- fieldModifier = new TypeFieldModifer(extensionStorage);
- solrResource = new SolrResource(solrServer);
-
- } catch (Exception eee) {
- throw new WikittyException("SolR initialization error", eee);
- }
- }
-
- @Override
- public void clear(WikittyTransaction transaction) {
- try {
- // FIXME poussin 20100618 pourquoi n'est pas fait dans la transaction ?
- solrResource.init();
- solrServer.deleteByQuery("*:*");
- } catch (Exception eee) {
- throw new WikittyException("Error during clearing SolR data", eee);
- }
- }
-
- @Override
- public void store(WikittyTransaction transaction, Collection<Wikitty> wikitties) {
- try {
- solrResource.init();
- ReindexChildTreeNode reindexChildTreeNode =
- new ReindexChildTreeNode(solrServer, solrResource);
- for (Wikitty w : wikitties) {
- String id = w.getId();
-
- if (w.hasExtension(WikittyTreeNode.EXT_WIKITTYTREENODE)) {
-
- Set<String> attachments = w.getFieldAsSet(WikittyTreeNode.EXT_WIKITTYTREENODE, WikittyTreeNode.FIELD_WIKITTYTREENODE_ATTACHMENT, String.class);
- reindexChildTreeNode.putIncludedAttachments(id, attachments);
-
- // Search deleted children
- SolrDocument treeNodeDoc = findById(solrServer, id);
- if (treeNodeDoc != null) {
- Collection oldAttachments = treeNodeDoc.getFieldValues(WikittyTreeNode.FQ_FIELD_WIKITTYTREENODE_ATTACHMENT);
- if (oldAttachments != null) {
- // if no more children, remove all old children
- if(attachments == null) {
- reindexChildTreeNode.putExcludedAttachments(id, oldAttachments);
- } else {
- // exclude only the removed children
- for (Object oldAttachment : oldAttachments) {
- if(!attachments.contains(oldAttachment)) {
- reindexChildTreeNode.putExcludedAttachment(id,(String) oldAttachment);
- }
- }
- }
- }
- }
-
- // Get new parent id (may be the same old parent)
- String parentId = w.getFieldAsString(WikittyTreeNode.EXT_WIKITTYTREENODE, WikittyTreeNode.FIELD_WIKITTYTREENODE_PARENT);
- reindexChildTreeNode.putParent(id, parentId);
- }
-
- // Index
- SolrInputDocument doc = createIndexDocument(w);
- solrResource.addDoc(id, doc);
- }
-
- // Reindex child in tree node
- reindexChildTreeNode.reindex();
- } catch (Exception eee) {
- throw new WikittyException("Can't store wikitty", eee);
- }
- }
-
- @Override
- public void delete(WikittyTransaction transaction, Collection<String> ids) throws WikittyException {
- try {
- solrResource.init();
- ReindexChildTreeNode reindexChildTreeNode =
- new ReindexChildTreeNode(solrServer, solrResource);
- for (String id : ids) {
-
- // Find child in node id
- SolrQuery query = new SolrQuery(SOLR_QUERY_PARSER + TREENODE_PREFIX + id + ":*");
- QueryResponse response = solrServer.query(query);
- SolrDocumentList updateDocs = response.getResults();
-
- for (Iterator<SolrDocument> iterator = updateDocs.iterator(); iterator.hasNext();) {
- SolrDocument solrDocument = iterator.next();
- String childId = (String) solrDocument.getFieldValue(SOLR_ID);
- reindexChildTreeNode.putExcludedAttachment(id, childId);
- }
-
- solrResource.deleteDoc(id);
- }
-
- // Reindex child in tree node
- reindexChildTreeNode.reindex();
- } catch (Exception eee) {
- throw new WikittyException("Can't delete wikitty in index", eee);
- }
- }
-
- @Override
- public void delete(Collection<String> idList) throws WikittyException {
- try {
- for (String id : idList) {
- solrServer.deleteById(id);
- }
- solrServer.commit();
- } catch (Exception eee) {
- throw new WikittyException("Can't delete wikitty in index", eee);
- }
- }
-
- @Override
- public PagedResult<String> findAllByCriteria(WikittyTransaction transaction, Criteria criteria) {
- try {
- // Create query with restriction
- Restriction2Solr restriction2Solr = new Restriction2Solr(transaction, fieldModifier);
- String queryString = restriction2Solr.toSolr(criteria.getRestriction(), solrServer);
- SolrQuery query = new SolrQuery(SOLR_QUERY_PARSER + queryString);
-
- // Add paged
- int firstIndex = criteria.getFirstIndex();
- int endIndex = criteria.getEndIndex();
-
- query.setStart(firstIndex);
- int nbRows;
- if (endIndex == -1) {
- // WARNING It is necessary to substract 'start' otherwise, there is a capacity overlow in solR
- nbRows = Integer.MAX_VALUE - firstIndex;
- } else {
- nbRows = endIndex - firstIndex + 1;
- }
- query.setRows(nbRows);
-
- // Add sorting
- List<String> sortAscending = criteria.getSortAscending();
- if(sortAscending != null) {
- for (String sort : sortAscending) {
- String tranform = fieldModifier.convertToSolr(transaction, sort);
- query.addSortField(tranform, SolrQuery.ORDER.asc);
- }
- }
-
- List<String> sortDescending = criteria.getSortDescending();
- if(sortDescending != null) {
- for (String sort : sortDescending) {
- String tranform = fieldModifier.convertToSolr(transaction, sort);
- query.addSortField(tranform, SolrQuery.ORDER.desc);
- }
- }
-
- // Add faceting
- List<String> facetField = criteria.getFacetField();
- log.debug("facetField : " + facetField);
- List<Criteria> facetCriteria = criteria.getFacetCriteria();
-
- // use to map query string to criteria facet name
- Map<String, String> facetQueryToName = new HashMap<String, String>();
-
- if ((facetField != null && !facetField.isEmpty())
- || (facetCriteria != null && !facetCriteria.isEmpty())) {
- query.setFacet(true);
- query.setFacetMinCount(1);
- // query.setFacetLimit(8); // no limit actualy
-
- // field facetisation
- if (facetField != null) {
- for (String fqfieldName : facetField) {
- String tranform = fieldModifier.convertToSolr(transaction, fqfieldName);
- query.addFacetField(tranform);
- }
- }
-
- // query facetisation
- if (facetCriteria != null) {
- for (Criteria facet : facetCriteria) {
- String queryFacet =
- restriction2Solr.toSolr(facet.getRestriction());
- facetQueryToName.put(queryFacet, facet.getName());
- query.addFacetQuery(queryFacet);
- }
- }
- }
-
- QueryResponse resp = solrServer.query(query);
- SolrDocumentList solrResults = resp.getResults();
-
- Map<String, List<FacetTopic>> facets = new HashMap<String, List<FacetTopic>>();
- if (facetField != null && !facetField.isEmpty()) {
- for (FacetField facet : resp.getFacetFields()) {
- String facetName = fieldModifier.convertToField(transaction, facet.getName());
- List<FacetTopic> topics = new ArrayList<FacetTopic>();
- if (facet.getValues() != null) {
- for (FacetField.Count value : facet.getValues()) {
- String topicName = value.getName();
- if(!topicName.endsWith(TREENODE_EMPTY)) {
- int topicCount = (int) value.getCount();
- FacetTopic topic = new FacetTopic(facetName, topicName, topicCount);
- topics.add(topic);
- }
- }
- }
- facets.put(facetName, topics);
- }
- }
- if (facetCriteria != null && !facetCriteria.isEmpty()) {
- for (Map.Entry<String, Integer> facet : resp.getFacetQuery().entrySet()) {
- String facetName = facet.getKey();
- // don't use contains because, map can have key with null value
- if (null != facetQueryToName.get(facetName)) {
- facetName = facetQueryToName.get(facetName);
- }
- Integer count = facet.getValue();
- List<FacetTopic> topics = new ArrayList<FacetTopic>();
- FacetTopic topic = new FacetTopic(facetName, facetName, count);
- topics.add(topic);
- facets.put(facetName, topics);
- }
- }
-
- List<String> ids = new ArrayList<String>(solrResults.size());
- for (SolrDocument doc : solrResults) {
- String id = (String) doc.getFieldValue(SOLR_ID);
- ids.add(id);
- }
-
- int numFound = (int)resp.getResults().getNumFound();
- PagedResult<String> result = new PagedResult<String>(
- firstIndex, numFound, queryString, facets, ids);
-
- return result;
- } catch (SolrServerException eee) {
- throw new WikittyException("Error during find", eee);
- }
- }
-
- @Override
- public Integer findNodeCount(WikittyTransaction transaction, Wikitty w, Criteria filter) {
- String wikittyId = w.getId();
-
- String parent = w.getFieldAsWikitty(WikittyTreeNode.EXT_WIKITTYTREENODE, WikittyTreeNode.FIELD_WIKITTYTREENODE_PARENT);
- if(parent == null) {
- parent = TREENODE_ROOT;
- } else {
- parent = TREENODE_PREFIX + parent;
- }
-
- Criteria criteria = Search.query(filter)
- .eq(parent, wikittyId).criteria()
- .setFirstIndex(0).setEndIndex(0);
- PagedResult<String> search = findAllByCriteria(transaction, criteria);
-
- int numFound = search.getNumFound();
- return numFound;
- }
-
-
- @Override
- public Map<String, Integer> findAllChildrenCount(WikittyTransaction transaction, Wikitty w, Criteria filter) {
- String wikittyId = w.getId();
-
- String parent = w.getFieldAsWikitty(WikittyTreeNode.EXT_WIKITTYTREENODE, WikittyTreeNode.FIELD_WIKITTYTREENODE_PARENT);
- if(parent == null) {
- parent = TREENODE_ROOT;
- } else {
- parent = TREENODE_PREFIX + parent;
- }
-
- // Find count with facet, if the node not contain recurcively content,
- // the node not found with facet
- Criteria criteria = Search.query(filter).eq(parent, wikittyId).criteria()
- .setFirstIndex(0).setEndIndex(0)
- .addFacetField(TREENODE_PREFIX + wikittyId);
- PagedResult<String> search = findAllByCriteria(transaction, criteria);
-
- Map<String, Integer> counts = new HashMap<String, Integer>();
- List<FacetTopic> topics = search.getTopic(TREENODE_PREFIX + wikittyId);
- if(topics != null) {
- for (FacetTopic topic : topics) {
- String topicName = topic.getTopicName();
- int topicCount = topic.getCount();
- counts.put(topicName, topicCount);
- }
- }
-
- log.debug("Facet result " + counts);
-
- // Find all children, add the other node not found with facet
- criteria = Search.query().eq(WikittyTreeNode.FQ_FIELD_WIKITTYTREENODE_PARENT, wikittyId).criteria()
- .setFirstIndex(0).setEndIndex(Criteria.ALL_ELEMENTS);
- search = findAllByCriteria(transaction, criteria);
-
- List<String> children = search.getAll();
- for (String child : children) {
- if(!counts.containsKey(child)) {
- counts.put(child, 0);
- }
- }
-
- return counts;
- }
-
- /**
- * Create all index document to used to modify indexation.
- * this method don't modify index.
- *
- * The document looks like :
- * SolrId : wikittyId
- * extensions : extensionNames
- * fieldName : fieldValue
- *
- * @param w all wikitties object to index
- * @return solrInputDocument used to modify index
- */
- protected SolrInputDocument createIndexDocument(Wikitty w) {
- log.debug("index wikitty " + w.getId());
-
- SolrInputDocument doc = new SolrInputDocument();
- String id = w.getId();
- doc.addField(SOLR_ID, id);
-
- for (String name : w.getExtensionNames()) {
- doc.addField(SOLR_EXTENSIONS, name);
- }
-
- for (String fqfieldName : w.fieldNames()) {
- FieldType fieldType = w.getFieldType(fqfieldName);
- TYPE type = fieldType.getType();
- String solrFqFieldName = getSolrFieldName(fqfieldName, type);
-
- String[] solrFieldName = solrFqFieldName.split("\\.");
- String solrAllFieldName = SOLR_ALL_EXTENSIONS + "." + solrFieldName[1];
-
- Object objectValue = w.getFqField(fqfieldName);
- if(objectValue != null) {
- if (fieldType.isCollection()) {
- Collection collectionValue = (Collection) objectValue;
- for (Object itemValue : collectionValue) {
- if (itemValue != null) {
- doc.addField(solrFqFieldName, itemValue);
- doc.addField(solrAllFieldName, itemValue);
-
- // Store string field in differents styles
- if(type == TYPE.STRING) {
- doc.addField(solrFqFieldName + "_t", itemValue);
- doc.addField(solrAllFieldName + "_t", itemValue);
- String itemValueLowerCase = itemValue.toString().toLowerCase();
- doc.addField(solrFqFieldName + "_c", itemValueLowerCase);
- doc.addField(solrAllFieldName + "_c", itemValueLowerCase);
- }
-
- doc.addField(SOLR_NOT_NULL_FIELDS, fqfieldName);
- log.debug("index field " + solrFqFieldName + " with value '" + itemValue + "'");
- }
- }
- } else {
- doc.addField(solrFqFieldName, objectValue);
- doc.addField(solrAllFieldName, objectValue);
-
- // Store string field in differents styles
- if(type == TYPE.STRING) {
- doc.addField(solrFqFieldName + "_t", objectValue);
- doc.addField(solrAllFieldName + "_t", objectValue);
- String objectValueLowerCase = objectValue.toString().toLowerCase();
- doc.addField(solrFqFieldName + "_c", objectValueLowerCase);
- doc.addField(solrAllFieldName + "_c", objectValueLowerCase);
- }
-
- doc.addField(SOLR_NOT_NULL_FIELDS, fqfieldName);
- log.debug("index field " + solrFqFieldName + " with value '" + objectValue + "'");
- }
- }
- }
- return doc;
- }
-
- /**
- * Find solr document by id
- */
- protected static SolrDocument findById(SolrServer solrServer, String id) {
- SolrQuery query = new SolrQuery(SOLR_ID + ":" + id);
- QueryResponse response;
- try {
- response = solrServer.query(query);
- } catch (SolrServerException eee) {
- throw new WikittyException("Error during find", eee);
- }
-
- SolrDocumentList results = response.getResults();
- long numFound = results.getNumFound();
- if(numFound == 1) {
- return results.get(0);
- }
-
- return null;
- }
-
- public static String getSolrFieldName(String fqfieldName, TYPE type) {
- switch (type) {
- case BOOLEAN:
- return fqfieldName + "_b";
- case DATE:
- return fqfieldName + "_dt";
- case STRING:
- return fqfieldName + "_s";
- case NUMERIC:
- return fqfieldName + "_d";
- default:
- return fqfieldName;
- }
- }
-}
Copied: trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/solr/WikittySearchEngineSolr.java (from rev 549, trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/solr/WikittySearchEnginSolr.java)
===================================================================
--- trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/solr/WikittySearchEngineSolr.java (rev 0)
+++ trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/solr/WikittySearchEngineSolr.java 2010-12-02 01:29:28 UTC (rev 551)
@@ -0,0 +1,925 @@
+/*
+ * #%L
+ * Wikitty :: wikitty-solr-impl
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2009 - 2010 CodeLutin, Benjamin POUSSIN
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Lesser Public License for more details.
+ *
+ * You should have received a copy of the GNU General Lesser Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/lgpl-3.0.html>.
+ * #L%
+ */
+
+package org.nuiton.wikitty.solr;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.solr.client.solrj.SolrQuery;
+import org.apache.solr.client.solrj.SolrServer;
+import org.apache.solr.client.solrj.SolrServerException;
+import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer;
+import org.apache.solr.client.solrj.response.FacetField;
+import org.apache.solr.client.solrj.response.QueryResponse;
+import org.apache.solr.common.SolrDocument;
+import org.apache.solr.common.SolrDocumentList;
+import org.apache.solr.common.SolrInputDocument;
+import org.apache.solr.core.CoreContainer;
+import org.nuiton.wikitty.search.Criteria;
+import org.nuiton.wikitty.search.FacetTopic;
+import org.nuiton.wikitty.entities.FieldType;
+import org.nuiton.wikitty.entities.FieldType.TYPE;
+import org.nuiton.wikitty.search.PagedResult;
+import org.nuiton.wikitty.entities.WikittyTreeNode;
+import org.nuiton.wikitty.entities.Wikitty;
+import org.nuiton.wikitty.WikittyException;
+import org.nuiton.wikitty.entities.WikittyExtension;
+import org.nuiton.wikitty.storage.WikittyExtensionStorage;
+import org.nuiton.wikitty.storage.WikittySearchEngine;
+import org.nuiton.wikitty.services.WikittyTransaction;
+import org.nuiton.wikitty.search.operators.Element;
+import org.nuiton.wikitty.search.Search;
+
+import com.arjuna.ats.arjuna.coordinator.BasicAction;
+import com.arjuna.ats.arjuna.coordinator.OnePhaseResource;
+import com.arjuna.ats.arjuna.coordinator.TwoPhaseOutcome;
+import com.arjuna.ats.arjuna.state.InputObjectState;
+import com.arjuna.ats.arjuna.state.OutputObjectState;
+import com.arjuna.ats.internal.arjuna.abstractrecords.LastResourceRecord;
+import java.io.File;
+import org.nuiton.util.ApplicationConfig;
+import org.nuiton.wikitty.WikittyConfig;
+
+/**
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class WikittySearchEngineSolr implements WikittySearchEngine {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(WikittySearchEngineSolr.class);
+
+ /** id field in solr */
+ static final protected String SOLR_ID = "id";
+
+ /** extensions field name in solr */
+ static final public String SOLR_EXTENSIONS = "extensions";
+
+ /** group all fields is not null */
+ static final public String SOLR_NOT_NULL_FIELDS = "not_null_fields";
+
+ /** extension use to store field without extension to search on all extesnion */
+ static final public String SOLR_ALL_EXTENSIONS = "all";
+
+ /** Precise the query parser to use, is allow leading wildcard */
+ static final public String SOLR_QUERY_PARSER = "{!wikitty}";
+
+ // Use for indexation tree node
+ static final public String TREENODE_PREFIX = WikittyTreeNode.EXT_WIKITTYTREENODE + ".";
+ static final public String TREENODE_EMPTY = TREENODE_PREFIX + "empty";
+ static final public String TREENODE_ROOT = TREENODE_PREFIX + "root";
+ static final public String TREENODE_PATH = TREENODE_PREFIX + "path";
+
+ /** use to permit client to modify fieldname during query generation */
+ static public interface FieldModifier {
+ public String convertToSolr(WikittyTransaction transaction, String fieldname);
+ public String convertToField(WikittyTransaction transaction, String solrName);
+ }
+
+ static protected class TypeFieldModifer implements FieldModifier {
+ protected WikittyExtensionStorage extensionStorage;
+ public TypeFieldModifer(WikittyExtensionStorage extensionStorage) {
+ this.extensionStorage = extensionStorage;
+ }
+
+ @Override
+ public String convertToSolr(WikittyTransaction transaction, String fqfieldname) {
+ String result = fqfieldname;
+ String[] searchField = fqfieldname.split("\\.");
+
+ if (Element.ELT_EXTENSION.equals(fqfieldname)) {
+ result = SOLR_EXTENSIONS;
+
+ } else if (Element.ELT_ID.equals(fqfieldname)) {
+ result = SOLR_ID;
+
+ } else if (searchField.length >= 2) {
+ String extName = searchField[0];
+ String fieldName = searchField[1];
+
+ if (Criteria.ALL_EXTENSIONS.equals(extName)) {
+ fqfieldname = SOLR_ALL_EXTENSIONS + "." + fieldName;
+ }
+
+ if (searchField.length >= 3) {
+ String fieldNameType = searchField[2];
+ TYPE type = FieldType.TYPE.valueOf(fieldNameType);
+ result = WikittySearchEngineSolr.getSolrFieldName(fqfieldname, type);
+ return result;
+ }
+
+ // Search type of field in extension
+ String version = extensionStorage.getLastVersion(transaction, extName);
+ if (version != null) { // not valid extension is version == null
+ WikittyExtension ext = extensionStorage.restore(transaction, extName, version);
+ FieldType fieldType = ext.getFieldType(fieldName);
+ log.debug(ext.toDefinition() + " for " + fieldName);
+ if (fieldType != null) { // type can be null if extension version differ
+ TYPE type = fieldType.getType();
+ result = WikittySearchEngineSolr.getSolrFieldName(fqfieldname, type);
+ return result;
+ }
+ }
+ }
+
+ return result;
+ }
+
+ @Override
+ public String convertToField(WikittyTransaction transaction, String solrName) {
+ String fieldName = solrName.replaceAll("(_b$)|(_dt$)|(_s$)|(_d$)", "");
+ if(SOLR_EXTENSIONS.equals(fieldName)) {
+ fieldName = Element.ELT_EXTENSION;
+ }
+ return fieldName;
+ }
+ }
+
+ /**
+ * Helper to get information nodes and elements for reindexation.
+ */
+ static protected class ReindexChildTreeNode {
+
+ protected SolrResource solrResource;
+ protected SolrServer solrServer;
+
+ protected Map<String, Collection<String>> includedNodeIds;
+ protected Map<String, Collection<String>> excludedNodeIds;
+ protected Map<String, String> parents;
+
+ public ReindexChildTreeNode(SolrServer solrServer, SolrResource solrResource) {
+ this.solrServer = solrServer;
+ this.solrResource = solrResource;
+ includedNodeIds = new HashMap<String, Collection<String>>();
+ excludedNodeIds = new HashMap<String, Collection<String>>();
+ parents = new HashMap<String, String>();
+ }
+
+ public void putIncludedAttachments(String nodeId, Collection<String> attchmentIds) {
+ putAttachements(includedNodeIds, nodeId, attchmentIds);
+ }
+
+ public void putExcludedAttachments(String nodeId, Collection<String> attachmentIds) {
+ putAttachements(excludedNodeIds, nodeId, attachmentIds);
+ }
+
+ public void putIncludedAttachment(String nodeId, String attachmentId) {
+ putAttachment(includedNodeIds, nodeId, attachmentId);
+ }
+
+ public void putExcludedAttachment(String nodeId, String attachmentId) {
+ putAttachment(excludedNodeIds, nodeId, attachmentId);
+ }
+
+ public Collection<String> getExcludedNodeIds(String attachmentId) {
+ Collection<String> result = excludedNodeIds.get(attachmentId);
+ if (result == null) {
+ result = new HashSet<String>();
+ }
+ return result;
+ }
+
+ public Collection<String> getIncludedNodeIds(String attachmentId) {
+ Collection<String> result = includedNodeIds.get(attachmentId);
+ if (result == null) {
+ result = new HashSet<String>();
+ }
+ return result;
+ }
+
+ protected void putAttachements(Map<String, Collection<String>> map, String nodeId, Collection<String> attachmentIds) {
+ if (attachmentIds != null) {
+ for (String attachmentId : attachmentIds) {
+ putAttachment(map, nodeId, attachmentId);
+ }
+ }
+ }
+
+ protected void putAttachment(Map<String, Collection<String>> map, String nodeId, String attachmentId) {
+ Collection<String> values = map.get(attachmentId);
+ if(values == null) {
+ values = new HashSet<String>();
+ map.put(attachmentId, values);
+ }
+ values.add(nodeId);
+ }
+
+ public void putParent(String nodeId, String parentId) {
+ parents.put(nodeId, parentId);
+ }
+
+ public String getParent(String nodeId) {
+ String parentId = parents.get(nodeId);
+
+ // If not found in map, search in index
+ if(parentId == null) {
+ SolrDocument doc = findById(solrServer, nodeId);
+ if(doc == null) {
+ // is root
+ return null;
+ }
+ parentId = (String) doc.getFieldValue(WikittyTreeNode.FQ_FIELD_WIKITTYTREENODE_PARENT);
+ parents.put(nodeId, parentId);
+ }
+
+ Collection<String> deletedDocIds = solrResource.getDeletedDocs();
+ if(deletedDocIds.contains(parentId)) {
+ return null;
+ }
+ return parentId;
+ }
+
+ public Collection<String> getReindexIds() {
+ Collection<String> result = new HashSet<String>();
+ result.addAll(includedNodeIds.keySet());
+ result.addAll(excludedNodeIds.keySet());
+ result.addAll(solrResource.getAddedDocIds());
+ return result;
+ }
+
+ /**
+ * Add in doc fields on association between nodes.
+ *
+ * For example if you have a element in node with parent, like this
+ * A -> B -> C => element, the method add field in document solr :
+ * TreeNode.root : A
+ * TreeNode.A : B
+ * TreeNode.B : C
+ * TreeNode.C : TreeNode.empty
+ *
+ * @throws SolrServerException
+ */
+ public void reindex() throws SolrServerException {
+ for (String id : getReindexIds()) {
+
+ // Get documents
+ SolrInputDocument doc = solrResource.getAddedDoc(id);
+ if(doc == null) {
+ doc = new SolrInputDocument();
+
+ // Copy old field value
+ SolrDocument found = findById(solrServer, id);
+ if (found != null) {
+ Collection<String> fieldNames = found.getFieldNames();
+ for (String fieldName : fieldNames) {
+ Collection<Object> fieldValues = found.getFieldValues(fieldName);
+
+ if(!fieldName.startsWith(TREENODE_PREFIX)) {
+ for (Object fieldValue : fieldValues) {
+ doc.addField(fieldName, fieldValue);
+ }
+ }
+ }
+
+ solrResource.addDoc(id, doc);
+ } else {
+ if (log.isWarnEnabled()) {
+ log.warn("Can't find wikitty id '" + id + "' in index. Skip this wikitty.");
+ }
+ }
+ }
+
+ // Add tree node fields
+ Collection<String> includedChildNodeIds = getIncludedNodeIds(id);
+ Collection<String> excludedChildNodeIds = getExcludedNodeIds(id);
+
+ // Find all node contain child
+ SolrQuery query = new SolrQuery(SOLR_QUERY_PARSER + WikittyTreeNode.FQ_FIELD_WIKITTYTREENODE_ATTACHMENT + ":" + id);
+ QueryResponse response = solrServer.query(query);
+ SolrDocumentList updateDocs = response.getResults();
+
+ for (Iterator<SolrDocument> iterator = updateDocs.iterator();
+ iterator.hasNext();) {
+ SolrDocument solrDocument = iterator.next();
+
+ String nodeId = (String) solrDocument.getFieldValue(SOLR_ID);
+ includedChildNodeIds.add(nodeId);
+ }
+
+ // Excluded nodes
+ includedChildNodeIds.removeAll(excludedChildNodeIds);
+ includedChildNodeIds.removeAll(solrResource.getDeletedDocs());
+
+ // Add paths in doc
+ Map<String, String> paths = new HashMap<String, String>();
+ for (String nodeId : includedChildNodeIds) {
+ doc.addField(TREENODE_PREFIX + nodeId, TREENODE_EMPTY);
+
+ // Add path
+ String childParent = nodeId;
+ String parent = getParent(childParent);
+ while (parent != null) {
+ String parentPath = paths.get(childParent);
+ if(parentPath == null) {
+ doc.addField(TREENODE_PREFIX + parent, childParent);
+ paths.put(childParent, parent);
+ }
+
+ childParent = parent;
+ parent = getParent(childParent);
+ }
+
+ String parentPath = paths.get(childParent);
+ if(parentPath == null) {
+ doc.addField(TREENODE_ROOT, childParent);
+ paths.put(childParent, TREENODE_ROOT);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Use to plug solr indexation in JTA transaction.
+ */
+ static protected class SolrResource implements OnePhaseResource {
+
+ protected SolrServer solrServer;
+ protected ThreadLocal<Map<String, SolrInputDocument>> addedDocs;
+ protected ThreadLocal<List<String>> deletedDocs;
+
+ public SolrResource(SolrServer solrServer) {
+ this.solrServer = solrServer;
+ addedDocs = new ThreadLocal<Map<String, SolrInputDocument>>();
+ deletedDocs = new ThreadLocal<List<String>>();
+
+ clear();
+ }
+
+ protected void init() {
+ // Add resource on phase in current transaction
+ LastResourceRecord lastResourceRecord = new LastResourceRecord(this);
+ BasicAction.Current().add(lastResourceRecord);
+ }
+
+ public Map<String, SolrInputDocument> getAddedDocs() {
+ Map<String, SolrInputDocument> result = addedDocs.get();
+ if(result == null) {
+ result = new HashMap<String, SolrInputDocument>();
+ addedDocs.set(result);
+ }
+ return result;
+ }
+
+ public List<String> getDeletedDocs() {
+ List<String> result = deletedDocs.get();
+ if(result == null) {
+ result = new ArrayList<String>();
+ deletedDocs.set(result);
+ }
+ return result;
+ }
+
+ public void clear() {
+ addedDocs.set(new HashMap<String, SolrInputDocument>());
+ deletedDocs.set(new ArrayList<String>());
+ }
+
+ public void addDoc(String id, SolrInputDocument doc) {
+ getAddedDocs().put(id, doc);
+ }
+
+ public SolrInputDocument getAddedDoc(String id) {
+ SolrInputDocument result = getAddedDocs().get(id);
+ return result;
+ }
+
+ public Collection<String> getAddedDocIds() {
+ Collection<String> result = getAddedDocs().keySet();
+ return result;
+ }
+
+ public void deleteDoc(String docId) {
+ getDeletedDocs().add(docId);
+ }
+
+ @Override
+ public int commit() {
+ try {
+ synchronized(this) {
+ Collection<SolrInputDocument> docs = getAddedDocs().values();
+ if(!docs.isEmpty()) {
+ solrServer.add(docs);
+ }
+ List<String> ids = getDeletedDocs();
+ if(!ids.isEmpty()) {
+ solrServer.deleteById(ids);
+ }
+ solrServer.commit();
+ }
+ clear();
+ return TwoPhaseOutcome.FINISH_OK;
+ } catch (Exception eee) {
+ log.error("Error commit solr", eee);
+ return TwoPhaseOutcome.FINISH_ERROR;
+ }
+ }
+
+ @Override
+ public int rollback() {
+ clear();
+ return TwoPhaseOutcome.FINISH_OK;
+ }
+
+ @Override
+ public void pack(OutputObjectState arg0) throws IOException {
+ }
+
+ @Override
+ public void unpack(InputObjectState arg0) throws IOException {
+ }
+ }
+
+ /** solr server */
+ protected SolrServer solrServer;
+
+ /** Field modifier use to transform to solr format */
+ protected TypeFieldModifer fieldModifier;
+
+ /** JTA resource */
+ protected SolrResource solrResource;
+
+ /**
+ * Init wikitty search engine on solr embedded server.
+ *
+ * @param extensionStorage extension storage
+ * @param properties properties (can be null)
+ */
+ public WikittySearchEngineSolr(
+ ApplicationConfig config, WikittyExtensionStorage extensionStorage) {
+
+ // init system env solr.data.dir
+ if (config != null) {
+ // choix du storage (file or Ram)
+ String solrDirFactoryKey =
+ WikittyConfig.WikittyOption.WIKITTY_SEARCHENGINE_SOLR_DIRECTORY_FACTORY.getKey();
+ String solrDirFactory = config.getOption(solrDirFactoryKey);
+ if (solrDirFactory != null) {
+ System.setProperty(solrDirFactoryKey, solrDirFactory);
+ }
+
+ // on utilise le directory que si on est pas en Ram
+ if (solrDirFactory != null && !solrDirFactory.contains("RAMDirectoryFactory")) {
+ String solrDataDirKey =
+ WikittyConfig.WikittyOption.WIKITTY_SEARCHENGINE_SOLR_DIRECTORY_DATA.getKey();
+ String solrDataDir = config.getOption(solrDataDirKey);
+ // make sure that dir exists
+ if (solrDataDir != null) {
+ File file = new File(solrDataDir);
+ file.mkdirs();
+ System.setProperty(solrDataDirKey, solrDataDir);
+ }
+ }
+ }
+
+ try {
+ CoreContainer.Initializer initializer = new CoreContainer.Initializer();
+ CoreContainer coreContainer = initializer.initialize();
+ solrServer = new EmbeddedSolrServer(coreContainer, "");
+
+ fieldModifier = new TypeFieldModifer(extensionStorage);
+ solrResource = new SolrResource(solrServer);
+
+ } catch (Exception eee) {
+ throw new WikittyException("SolR initialization error", eee);
+ }
+ }
+
+ @Override
+ public void clear(WikittyTransaction transaction) {
+ try {
+ // FIXME poussin 20100618 pourquoi n'est pas fait dans la transaction ?
+ solrResource.init();
+ solrServer.deleteByQuery("*:*");
+ } catch (Exception eee) {
+ throw new WikittyException("Error during clearing SolR data", eee);
+ }
+ }
+
+ @Override
+ public void store(WikittyTransaction transaction, Collection<Wikitty> wikitties) {
+ try {
+ solrResource.init();
+ ReindexChildTreeNode reindexChildTreeNode =
+ new ReindexChildTreeNode(solrServer, solrResource);
+ for (Wikitty w : wikitties) {
+ String id = w.getId();
+
+ if (w.hasExtension(WikittyTreeNode.EXT_WIKITTYTREENODE)) {
+
+ Set<String> attachments = w.getFieldAsSet(WikittyTreeNode.EXT_WIKITTYTREENODE, WikittyTreeNode.FIELD_WIKITTYTREENODE_ATTACHMENT, String.class);
+ reindexChildTreeNode.putIncludedAttachments(id, attachments);
+
+ // Search deleted children
+ SolrDocument treeNodeDoc = findById(solrServer, id);
+ if (treeNodeDoc != null) {
+ Collection oldAttachments = treeNodeDoc.getFieldValues(WikittyTreeNode.FQ_FIELD_WIKITTYTREENODE_ATTACHMENT);
+ if (oldAttachments != null) {
+ // if no more children, remove all old children
+ if(attachments == null) {
+ reindexChildTreeNode.putExcludedAttachments(id, oldAttachments);
+ } else {
+ // exclude only the removed children
+ for (Object oldAttachment : oldAttachments) {
+ if(!attachments.contains(oldAttachment)) {
+ reindexChildTreeNode.putExcludedAttachment(id,(String) oldAttachment);
+ }
+ }
+ }
+ }
+ }
+
+ // Get new parent id (may be the same old parent)
+ String parentId = w.getFieldAsString(WikittyTreeNode.EXT_WIKITTYTREENODE, WikittyTreeNode.FIELD_WIKITTYTREENODE_PARENT);
+ reindexChildTreeNode.putParent(id, parentId);
+ }
+
+ // Index
+ SolrInputDocument doc = createIndexDocument(w);
+ solrResource.addDoc(id, doc);
+ }
+
+ // Reindex child in tree node
+ reindexChildTreeNode.reindex();
+ } catch (Exception eee) {
+ throw new WikittyException("Can't store wikitty", eee);
+ }
+ }
+
+ @Override
+ public void delete(WikittyTransaction transaction, Collection<String> ids) throws WikittyException {
+ try {
+ solrResource.init();
+ ReindexChildTreeNode reindexChildTreeNode =
+ new ReindexChildTreeNode(solrServer, solrResource);
+ for (String id : ids) {
+
+ // Find child in node id
+ SolrQuery query = new SolrQuery(SOLR_QUERY_PARSER + TREENODE_PREFIX + id + ":*");
+ QueryResponse response = solrServer.query(query);
+ SolrDocumentList updateDocs = response.getResults();
+
+ for (Iterator<SolrDocument> iterator = updateDocs.iterator(); iterator.hasNext();) {
+ SolrDocument solrDocument = iterator.next();
+ String childId = (String) solrDocument.getFieldValue(SOLR_ID);
+ reindexChildTreeNode.putExcludedAttachment(id, childId);
+ }
+
+ solrResource.deleteDoc(id);
+ }
+
+ // Reindex child in tree node
+ reindexChildTreeNode.reindex();
+ } catch (Exception eee) {
+ throw new WikittyException("Can't delete wikitty in index", eee);
+ }
+ }
+
+ @Override
+ public void delete(Collection<String> idList) throws WikittyException {
+ try {
+ for (String id : idList) {
+ solrServer.deleteById(id);
+ }
+ solrServer.commit();
+ } catch (Exception eee) {
+ throw new WikittyException("Can't delete wikitty in index", eee);
+ }
+ }
+
+ @Override
+ public PagedResult<String> findAllByCriteria(WikittyTransaction transaction, Criteria criteria) {
+ try {
+ // Create query with restriction
+ Restriction2Solr restriction2Solr = new Restriction2Solr(transaction, fieldModifier);
+ String queryString = restriction2Solr.toSolr(criteria.getRestriction(), solrServer);
+ SolrQuery query = new SolrQuery(SOLR_QUERY_PARSER + queryString);
+
+ // Add paged
+ int firstIndex = criteria.getFirstIndex();
+ int endIndex = criteria.getEndIndex();
+
+ query.setStart(firstIndex);
+ int nbRows;
+ if (endIndex == -1) {
+ // WARNING It is necessary to substract 'start' otherwise, there is a capacity overlow in solR
+ nbRows = Integer.MAX_VALUE - firstIndex;
+ } else {
+ nbRows = endIndex - firstIndex + 1;
+ }
+ query.setRows(nbRows);
+
+ // Add sorting
+ List<String> sortAscending = criteria.getSortAscending();
+ if(sortAscending != null) {
+ for (String sort : sortAscending) {
+ String tranform = fieldModifier.convertToSolr(transaction, sort);
+ query.addSortField(tranform, SolrQuery.ORDER.asc);
+ }
+ }
+
+ List<String> sortDescending = criteria.getSortDescending();
+ if(sortDescending != null) {
+ for (String sort : sortDescending) {
+ String tranform = fieldModifier.convertToSolr(transaction, sort);
+ query.addSortField(tranform, SolrQuery.ORDER.desc);
+ }
+ }
+
+ // Add faceting
+ List<String> facetField = criteria.getFacetField();
+ log.debug("facetField : " + facetField);
+ List<Criteria> facetCriteria = criteria.getFacetCriteria();
+
+ // use to map query string to criteria facet name
+ Map<String, String> facetQueryToName = new HashMap<String, String>();
+
+ if ((facetField != null && !facetField.isEmpty())
+ || (facetCriteria != null && !facetCriteria.isEmpty())) {
+ query.setFacet(true);
+ query.setFacetMinCount(1);
+ // query.setFacetLimit(8); // no limit actualy
+
+ // field facetisation
+ if (facetField != null) {
+ for (String fqfieldName : facetField) {
+ String tranform = fieldModifier.convertToSolr(transaction, fqfieldName);
+ query.addFacetField(tranform);
+ }
+ }
+
+ // query facetisation
+ if (facetCriteria != null) {
+ for (Criteria facet : facetCriteria) {
+ String queryFacet =
+ restriction2Solr.toSolr(facet.getRestriction());
+ facetQueryToName.put(queryFacet, facet.getName());
+ query.addFacetQuery(queryFacet);
+ }
+ }
+ }
+
+ QueryResponse resp = solrServer.query(query);
+ SolrDocumentList solrResults = resp.getResults();
+
+ Map<String, List<FacetTopic>> facets = new HashMap<String, List<FacetTopic>>();
+ if (facetField != null && !facetField.isEmpty()) {
+ for (FacetField facet : resp.getFacetFields()) {
+ String facetName = fieldModifier.convertToField(transaction, facet.getName());
+ List<FacetTopic> topics = new ArrayList<FacetTopic>();
+ if (facet.getValues() != null) {
+ for (FacetField.Count value : facet.getValues()) {
+ String topicName = value.getName();
+ if(!topicName.endsWith(TREENODE_EMPTY)) {
+ int topicCount = (int) value.getCount();
+ FacetTopic topic = new FacetTopic(facetName, topicName, topicCount);
+ topics.add(topic);
+ }
+ }
+ }
+ facets.put(facetName, topics);
+ }
+ }
+ if (facetCriteria != null && !facetCriteria.isEmpty()) {
+ for (Map.Entry<String, Integer> facet : resp.getFacetQuery().entrySet()) {
+ String facetName = facet.getKey();
+ // don't use contains because, map can have key with null value
+ if (null != facetQueryToName.get(facetName)) {
+ facetName = facetQueryToName.get(facetName);
+ }
+ Integer count = facet.getValue();
+ List<FacetTopic> topics = new ArrayList<FacetTopic>();
+ FacetTopic topic = new FacetTopic(facetName, facetName, count);
+ topics.add(topic);
+ facets.put(facetName, topics);
+ }
+ }
+
+ List<String> ids = new ArrayList<String>(solrResults.size());
+ for (SolrDocument doc : solrResults) {
+ String id = (String) doc.getFieldValue(SOLR_ID);
+ ids.add(id);
+ }
+
+ int numFound = (int)resp.getResults().getNumFound();
+ PagedResult<String> result = new PagedResult<String>(
+ firstIndex, numFound, queryString, facets, ids);
+
+ return result;
+ } catch (SolrServerException eee) {
+ throw new WikittyException("Error during find", eee);
+ }
+ }
+
+ @Override
+ public Integer findNodeCount(WikittyTransaction transaction, Wikitty w, Criteria filter) {
+ String wikittyId = w.getId();
+
+ String parent = w.getFieldAsWikitty(WikittyTreeNode.EXT_WIKITTYTREENODE, WikittyTreeNode.FIELD_WIKITTYTREENODE_PARENT);
+ if(parent == null) {
+ parent = TREENODE_ROOT;
+ } else {
+ parent = TREENODE_PREFIX + parent;
+ }
+
+ Criteria criteria = Search.query(filter)
+ .eq(parent, wikittyId).criteria()
+ .setFirstIndex(0).setEndIndex(0);
+ PagedResult<String> search = findAllByCriteria(transaction, criteria);
+
+ int numFound = search.getNumFound();
+ return numFound;
+ }
+
+
+ @Override
+ public Map<String, Integer> findAllChildrenCount(WikittyTransaction transaction, Wikitty w, Criteria filter) {
+ String wikittyId = w.getId();
+
+ String parent = w.getFieldAsWikitty(WikittyTreeNode.EXT_WIKITTYTREENODE, WikittyTreeNode.FIELD_WIKITTYTREENODE_PARENT);
+ if(parent == null) {
+ parent = TREENODE_ROOT;
+ } else {
+ parent = TREENODE_PREFIX + parent;
+ }
+
+ // Find count with facet, if the node not contain recurcively content,
+ // the node not found with facet
+ Criteria criteria = Search.query(filter).eq(parent, wikittyId).criteria()
+ .setFirstIndex(0).setEndIndex(0)
+ .addFacetField(TREENODE_PREFIX + wikittyId);
+ PagedResult<String> search = findAllByCriteria(transaction, criteria);
+
+ Map<String, Integer> counts = new HashMap<String, Integer>();
+ List<FacetTopic> topics = search.getTopic(TREENODE_PREFIX + wikittyId);
+ if(topics != null) {
+ for (FacetTopic topic : topics) {
+ String topicName = topic.getTopicName();
+ int topicCount = topic.getCount();
+ counts.put(topicName, topicCount);
+ }
+ }
+
+ log.debug("Facet result " + counts);
+
+ // Find all children, add the other node not found with facet
+ criteria = Search.query().eq(WikittyTreeNode.FQ_FIELD_WIKITTYTREENODE_PARENT, wikittyId).criteria()
+ .setFirstIndex(0).setEndIndex(Criteria.ALL_ELEMENTS);
+ search = findAllByCriteria(transaction, criteria);
+
+ List<String> children = search.getAll();
+ for (String child : children) {
+ if(!counts.containsKey(child)) {
+ counts.put(child, 0);
+ }
+ }
+
+ return counts;
+ }
+
+ /**
+ * Create all index document to used to modify indexation.
+ * this method don't modify index.
+ *
+ * The document looks like :
+ * SolrId : wikittyId
+ * extensions : extensionNames
+ * fieldName : fieldValue
+ *
+ * @param w all wikitties object to index
+ * @return solrInputDocument used to modify index
+ */
+ protected SolrInputDocument createIndexDocument(Wikitty w) {
+ log.debug("index wikitty " + w.getId());
+
+ SolrInputDocument doc = new SolrInputDocument();
+ String id = w.getId();
+ doc.addField(SOLR_ID, id);
+
+ for (String name : w.getExtensionNames()) {
+ doc.addField(SOLR_EXTENSIONS, name);
+ }
+
+ for (String fqfieldName : w.fieldNames()) {
+ FieldType fieldType = w.getFieldType(fqfieldName);
+ TYPE type = fieldType.getType();
+ String solrFqFieldName = getSolrFieldName(fqfieldName, type);
+
+ String[] solrFieldName = solrFqFieldName.split("\\.");
+ String solrAllFieldName = SOLR_ALL_EXTENSIONS + "." + solrFieldName[1];
+
+ Object objectValue = w.getFqField(fqfieldName);
+ if(objectValue != null) {
+ if (fieldType.isCollection()) {
+ Collection collectionValue = (Collection) objectValue;
+ for (Object itemValue : collectionValue) {
+ if (itemValue != null) {
+ doc.addField(solrFqFieldName, itemValue);
+ doc.addField(solrAllFieldName, itemValue);
+
+ // Store string field in differents styles
+ if(type == TYPE.STRING) {
+ doc.addField(solrFqFieldName + "_t", itemValue);
+ doc.addField(solrAllFieldName + "_t", itemValue);
+ String itemValueLowerCase = itemValue.toString().toLowerCase();
+ doc.addField(solrFqFieldName + "_c", itemValueLowerCase);
+ doc.addField(solrAllFieldName + "_c", itemValueLowerCase);
+ }
+
+ doc.addField(SOLR_NOT_NULL_FIELDS, fqfieldName);
+ log.debug("index field " + solrFqFieldName + " with value '" + itemValue + "'");
+ }
+ }
+ } else {
+ doc.addField(solrFqFieldName, objectValue);
+ doc.addField(solrAllFieldName, objectValue);
+
+ // Store string field in differents styles
+ if(type == TYPE.STRING) {
+ doc.addField(solrFqFieldName + "_t", objectValue);
+ doc.addField(solrAllFieldName + "_t", objectValue);
+ String objectValueLowerCase = objectValue.toString().toLowerCase();
+ doc.addField(solrFqFieldName + "_c", objectValueLowerCase);
+ doc.addField(solrAllFieldName + "_c", objectValueLowerCase);
+ }
+
+ doc.addField(SOLR_NOT_NULL_FIELDS, fqfieldName);
+ log.debug("index field " + solrFqFieldName + " with value '" + objectValue + "'");
+ }
+ }
+ }
+ return doc;
+ }
+
+ /**
+ * Find solr document by id
+ */
+ protected static SolrDocument findById(SolrServer solrServer, String id) {
+ SolrQuery query = new SolrQuery(SOLR_ID + ":" + id);
+ QueryResponse response;
+ try {
+ response = solrServer.query(query);
+ } catch (SolrServerException eee) {
+ throw new WikittyException("Error during find", eee);
+ }
+
+ SolrDocumentList results = response.getResults();
+ long numFound = results.getNumFound();
+ if(numFound == 1) {
+ return results.get(0);
+ }
+
+ return null;
+ }
+
+ public static String getSolrFieldName(String fqfieldName, TYPE type) {
+ switch (type) {
+ case BOOLEAN:
+ return fqfieldName + "_b";
+ case DATE:
+ return fqfieldName + "_dt";
+ case STRING:
+ return fqfieldName + "_s";
+ case NUMERIC:
+ return fqfieldName + "_d";
+ default:
+ return fqfieldName;
+ }
+ }
+}
Modified: trunk/wikitty-solr-impl/src/test/java/org/nuiton/wikitty/solr/test/SolrSearchTest.java
===================================================================
--- trunk/wikitty-solr-impl/src/test/java/org/nuiton/wikitty/solr/test/SolrSearchTest.java 2010-12-02 01:13:56 UTC (rev 550)
+++ trunk/wikitty-solr-impl/src/test/java/org/nuiton/wikitty/solr/test/SolrSearchTest.java 2010-12-02 01:29:28 UTC (rev 551)
@@ -373,7 +373,7 @@
* WARNING: as the only solr index is clear, all data in all test is reindexed.
*/
@Test
- public void testSyncEngin() {
+ public void testSyncSearchEngine() {
Criteria criteria = new Criteria();
criteria.setRestriction(RestrictionHelper.rTrue());
criteria.setFirstIndex(0);
@@ -382,7 +382,7 @@
PagedResult<String> result = ws.findAllByCriteria(null, criteria);
assertEquals(13, result.getNumFound());
- ws.syncEngin(null);
+ ws.syncSearchEngine(null);
result = ws.findAllByCriteria(null, criteria);
assertTrue(13 <= result.getNumFound());
Modified: trunk/wikitty-solr-impl/src/test/java/org/nuiton/wikitty/solr/test/WikittyServiceSolr.java
===================================================================
--- trunk/wikitty-solr-impl/src/test/java/org/nuiton/wikitty/solr/test/WikittyServiceSolr.java 2010-12-02 01:13:56 UTC (rev 550)
+++ trunk/wikitty-solr-impl/src/test/java/org/nuiton/wikitty/solr/test/WikittyServiceSolr.java 2010-12-02 01:29:28 UTC (rev 551)
@@ -27,7 +27,7 @@
import org.nuiton.util.ApplicationConfig;
import org.nuiton.wikitty.services.WikittyServiceStorage;
-import org.nuiton.wikitty.solr.WikittySearchEnginSolr;
+import org.nuiton.wikitty.solr.WikittySearchEngineSolr;
import org.nuiton.wikitty.storage.WikittyExtensionStorageInMemory;
import org.nuiton.wikitty.storage.WikittyStorageInMemory;
@@ -44,6 +44,6 @@
public WikittyServiceSolr(ApplicationConfig config) {
extensionStorage = new WikittyExtensionStorageInMemory();
wikittyStorage = new WikittyStorageInMemory();
- searchEngin = new WikittySearchEnginSolr(config, extensionStorage);
+ searchEngine = new WikittySearchEngineSolr(config, extensionStorage);
}
}
1
0
r550 - in trunk/wikitty-api: . src/main/java/org/nuiton/wikitty src/main/java/org/nuiton/wikitty/services src/main/resources src/test/java/org/nuiton/wikitty/notification src/test/java/org/nuiton/wikitty/services
by bpoussin@users.nuiton.org 02 Dec '10
by bpoussin@users.nuiton.org 02 Dec '10
02 Dec '10
Author: bpoussin
Date: 2010-12-02 02:13:56 +0100 (Thu, 02 Dec 2010)
New Revision: 550
Url: http://nuiton.org/repositories/revision/wikitty/550
Log:
- remove picocontainer that don't work, replace it by new nuiton-util method ObjectUtil.newInstance(clazz, Collection, boolean)
- WikittyNotifierService take as new argument the transporter (this suppress non consistance between WikittyService instanciation)
/!\ for user this modifier configuration
- change sample properties for transporter modification
- add test for WikittyServiceFactory
Modified:
trunk/wikitty-api/pom.xml
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfig.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceFactory.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/JGroupsNotifierTransporter.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceNotifier.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/XMPPNotifierTransporter.java
trunk/wikitty-api/src/main/resources/wikitty-config-sample-client.properties
trunk/wikitty-api/src/main/resources/wikitty-config-sample-inmemory.properties
trunk/wikitty-api/src/main/resources/wikitty-config-sample-server-slave.properties
trunk/wikitty-api/src/main/resources/wikitty-config-sample-server.properties
trunk/wikitty-api/src/test/java/org/nuiton/wikitty/notification/WikittyServiceNotificationTest.java
trunk/wikitty-api/src/test/java/org/nuiton/wikitty/notification/XMPPNotificationTest.java
trunk/wikitty-api/src/test/java/org/nuiton/wikitty/services/WikittyServiceHelperTest.java
Modified: trunk/wikitty-api/pom.xml
===================================================================
--- trunk/wikitty-api/pom.xml 2010-12-01 16:41:08 UTC (rev 549)
+++ trunk/wikitty-api/pom.xml 2010-12-02 01:13:56 UTC (rev 550)
@@ -42,12 +42,6 @@
<!-- COMPILE -->
<dependency>
- <groupId>org.picocontainer</groupId>
- <artifactId>picocontainer</artifactId>
- <scope>compile</scope>
- </dependency>
-
- <dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</dependency>
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfig.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfig.java 2010-12-01 16:41:08 UTC (rev 549)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfig.java 2010-12-02 01:13:56 UTC (rev 550)
@@ -90,8 +90,7 @@
* @param configFilename name of wikitty config file
*/
public WikittyConfig(String configFilename) {
- this();
- setDefaultOption(WikittyOption.WIKITTY_CONFIG_FILE.getKey(), configFilename);
+ this(new String[]{"--option", ApplicationConfig.CONFIG_FILE_NAME, configFilename});
}
/**
@@ -203,6 +202,12 @@
+ "org.nuiton.wikitty.jdbc.WikittyStorageJDBC,"
+ "org.nuiton.wikitty.solr.WikittySearchEnginSolr", String.class, false, false),
+ WIKITTY_WIKITTYSERVICENOTIFIER_COMPONENTS(
+ "wikitty.WikittyServiceNotifier.components",
+ _("WikittyServiceNotifier component to use (transporter class"
+ + "to use for propagate or listen remote event)"),
+ XMPPNotifierTransporter.class.getName(), String.class, false, false),
+
WIKITTY_TRANSACTION_WIKITTYSERVICE_COMPONENTS(
"wikitty.transaction.WikittyService.components",
_("WikittyService to use for transaction (must be in memory)"
@@ -246,10 +251,6 @@
"wikitty.service.event.listen",
_("Indique si le service d'event ecoute sur le reseau les evenements"),
"false", Boolean.class, false, false),
- WIKITTY_EVENT_TRANSPORTER(
- "wikitty.service.event.propagate.transporter",
- _("La classe du transporter a utiliser pour la propagation reseau"),
- XMPPNotifierTransporter.class.getName(), Class.class, false, false),
WIKITTY_EVENT_TRANSPORTER_JGROUP_CHANNELNAME(
"wikitty.service.event.transporter.jgroups.channelname",
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceFactory.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceFactory.java 2010-12-01 16:41:08 UTC (rev 549)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceFactory.java 2010-12-02 01:13:56 UTC (rev 550)
@@ -25,15 +25,14 @@
package org.nuiton.wikitty;
-import org.nuiton.wikitty.services.WikittyServiceNotifier;
-import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.HashSet;
import java.util.List;
-import org.apache.commons.lang.ClassUtils;
+import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nuiton.util.ApplicationConfig;
-import org.picocontainer.MutablePicoContainer;
-import org.picocontainer.containers.TransientPicoContainer;
+import org.nuiton.util.ObjectUtil;
/**
* Point d'entre de wikitty, permet de recuperer un WikittyService pour
@@ -69,6 +68,18 @@
return result;
}
+ /**
+ * Construit l'enchainement des differents WikittyService comme decrit
+ * dans le fichier de configuration via la cle:
+ * wikitty.transaction.WikittyService.components
+ * <p>
+ * Chaque composant de l'enchainement peut avoir lui aussi ses propres
+ * composants dans une cle:
+ * wikitty.transaction.[nom simple de la classe].components *
+ *
+ * @param config
+ * @return
+ */
static public WikittyService buildWikittyServiceTransaction(ApplicationConfig config) {
String prefix = "wikitty.transaction.";
WikittyService result = buildWikittyService(config, prefix);
@@ -81,75 +92,22 @@
WikittyService result = null;
List<Class> layers = getComponents(config, prefix, WikittyService.class);
- MutablePicoContainer pico = new TransientPicoContainer();
- pico.addComponent(config);
+ Set comp = new HashSet();
for (Class<WikittyService> clazz : layers) {
- pico.addComponent(WikittyService.class, clazz);
+ comp.clear();
+ comp.add(result);
+ comp.add(config);
+ List<Class> comps = getComponents(config, prefix, clazz);
+ if (comps != null) {
+ comp.addAll(comps);
+ }
- // on cree un container specifique pour l'instanciate de cette objet
- // avec tous les composants dont il a besoin
- MutablePicoContainer childPico = getChildContainer(config, pico, prefix, clazz);
- result = childPico.getComponent(clazz);
-
- pico.removeComponent(WikittyService.class);
- pico.removeComponent("parent");
- pico.addComponent("parent", result);
+ result = ObjectUtil.newInstance(clazz, comp, true);
}
return result;
}
- static public WikittyServiceNotifier.RemoteNotifierTransporter buildTransporter(
- ApplicationConfig config, WikittyServiceNotifier notifier) {
-
- if (notifier == null) {
- throw new IllegalArgumentException("Notifier must be non null");
- }
-
- Class<WikittyServiceNotifier.RemoteNotifierTransporter> transporterClass =
- (Class<WikittyServiceNotifier.RemoteNotifierTransporter>)config.getOptionAsClass(
- WikittyConfig.WikittyOption.WIKITTY_EVENT_TRANSPORTER.getKey());
-
- if (transporterClass == null) {
- String transporteurClassName = config.getOption(
- WikittyConfig.WikittyOption.WIKITTY_EVENT_TRANSPORTER.getKey());
-
- throw new WikittyException("Transporteur class '" + transporteurClassName + "' not found");
- }
-
- if (log.isDebugEnabled()) {
- log.debug("Creating transporteur : " + transporterClass.getName());
- }
-
- MutablePicoContainer pico = new TransientPicoContainer();
- pico.addComponent(config);
- pico.addComponent(notifier);
- pico.addComponent(WikittyServiceNotifier.RemoteNotifierTransporter.class, transporterClass);
- WikittyServiceNotifier.RemoteNotifierTransporter result =
- pico.getComponent(WikittyServiceNotifier.RemoteNotifierTransporter.class);
-
- return result;
- }
-
/**
- * Retourne un nouveau container fils de celui passe en parametre et dans
- * lequel on a injecte tous les composans necessaire a clazz comme decrit
- * dans le fichier de configuration
- *
- * @param config
- * @param parent
- * @param clazz
- * @return
- */
- static protected MutablePicoContainer getChildContainer(
- ApplicationConfig config, MutablePicoContainer parent,
- String prefix, Class clazz) {
-
- List<Class> comps = getComponents(config, prefix, clazz);
- MutablePicoContainer result = makeChildContainer(parent, comps);
- return result;
- }
-
- /**
* Recherche dans la config une key de la forme
* <pre>
* wikitty.[nom simple de la classe].components
@@ -171,25 +129,16 @@
String componentsString = config.getOption(key);
if (componentsString != null) {
String[] componentsList = componentsString.split(",");
- result = (List<Class>) ClassUtils.convertClassNamesToClasses(
- Arrays.asList(componentsList));
- }
- return result;
- }
-
- /**
- * Cree un nouveau container et injecte les classes donnees en parametre
- * @param parent
- * @param comps
- * @return
- */
- static protected MutablePicoContainer makeChildContainer(
- MutablePicoContainer parent, List<Class> comps) {
-
- MutablePicoContainer result = parent.makeChildContainer();
- if (comps != null) {
- for (Class clazz : comps) {
- result.addComponent(clazz);
+ result = new ArrayList<Class>();
+ for(String className : componentsList) {
+ try {
+ Class c = Class.forName(className);
+ result.add(c);
+ } catch (ClassNotFoundException eee) {
+ throw new WikittyException(String.format(
+ "Can't find class %s, check your configuration and"
+ + " your jar file available", className), eee);
+ }
}
}
return result;
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/JGroupsNotifierTransporter.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/JGroupsNotifierTransporter.java 2010-12-01 16:41:08 UTC (rev 549)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/JGroupsNotifierTransporter.java 2010-12-02 01:13:56 UTC (rev 550)
@@ -39,6 +39,9 @@
/**
* JGroups notifier.
+ *
+ * @deprecated not maintened because this implementation doesn't work. You must
+ * use XMPPNotifierTransporter
*
* @author chatellier
* @version $Revision$
@@ -46,6 +49,7 @@
* Last update : $Date$
* By : $Author$
*/
+@Deprecated
public class JGroupsNotifierTransporter extends ReceiverAdapter
implements WikittyServiceNotifier.RemoteNotifierTransporter {
@@ -59,9 +63,7 @@
/** JGroup channel. */
protected JChannel channel;
- public JGroupsNotifierTransporter(ApplicationConfig config, WikittyServiceNotifier ws) {
- this.ws = ws;
-
+ public JGroupsNotifierTransporter(ApplicationConfig config) {
// can be null according to default constructor
if (config != null) {
// add notifier as listener
@@ -74,6 +76,15 @@
}
}
+ public WikittyServiceNotifier getWikittyServiceNotifier() {
+ return ws;
+ }
+
+ @Override
+ public void setWikittyServiceNotifier(WikittyServiceNotifier ws) {
+ this.ws = ws;
+ }
+
/**
* Init jgroup channel.
*
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceNotifier.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceNotifier.java 2010-12-01 16:41:08 UTC (rev 549)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceNotifier.java 2010-12-02 01:13:56 UTC (rev 550)
@@ -42,11 +42,9 @@
import org.nuiton.wikitty.search.Criteria;
import org.nuiton.wikitty.search.PagedResult;
import org.nuiton.wikitty.entities.Wikitty;
-import org.nuiton.wikitty.WikittyConfig;
import org.nuiton.wikitty.WikittyException;
import org.nuiton.wikitty.entities.WikittyExtension;
import org.nuiton.wikitty.WikittyService;
-import org.nuiton.wikitty.WikittyServiceFactory;
import org.nuiton.wikitty.WikittyTree;
import org.nuiton.wikitty.entities.WikittyTreeNode;
@@ -91,11 +89,25 @@
/**
* Constructor with configuration.
- *
+ *
+ * @param config config to use
* @param ws delegate service
- * @param props properties (can be null)
*/
- public WikittyServiceNotifier(ApplicationConfig config, WikittyService ws) {
+// public WikittyServiceNotifier(ApplicationConfig config, WikittyService ws) {
+// this(config, ws, null);
+// }
+
+ /**
+ * Constructor with configuration.
+ *
+ * @param config config to use
+ * @param ws delegate service
+ * @param transporter transporter to use for remote event (listen or propagate).
+ * this transporter can be null if we don't want propagate or listen remote
+ * event
+ */
+ public WikittyServiceNotifier(ApplicationConfig config,
+ WikittyService ws, RemoteNotifierTransporter transporter) {
// service
this.ws = ws;
@@ -110,10 +122,22 @@
allWikittyServiceListeners, localWikittyServiceListeners,
remoteWikittyServiceListeners);
- // can be null according to default constructor
- if (config != null) {
- notifier = new RemoteNotifier(config, this);
+ if (transporter != null) {
+ transporter.setWikittyServiceNotifier(this);
+ notifier = new EventPropagator(config, this, transporter);
+
+ // FIX poussin 201O1126 remplacement du ALL par LOCAL
+ // sinon on renvoie des events qui nous ont ete envoyes :(
+ // ca risque de boucler :(
+ this.addWikittyServiceListener(notifier, WikittyService.ServiceListenerType.LOCAL); // weak reference
}
+ if (log.isInfoEnabled()) {
+ if (transporter == null) {
+ log.info("RemoteNotifier synchronisation not used ");
+ } else {
+ log.info("RemoteNotifier transporter: " + transporter.getClass().getName());
+ }
+ }
}
@Override
@@ -568,6 +592,13 @@
static public interface RemoteNotifierTransporter {
/**
+ * this method must be call before RemoteNotifierTransporter utilisation
+ * to indicate which service use it
+ * @param ws
+ */
+ public void setWikittyServiceNotifier(WikittyServiceNotifier ws);
+
+ /**
* Send a jgroup message to all other channel member.
*
* @param event message to send
@@ -580,37 +611,20 @@
* only if wikitty.notifier.transporter.class configuration is found and
* wikitty.service.event.propagateEvent is true
*/
- static public class RemoteNotifier implements WikittyListener {
+ static public class EventPropagator implements WikittyListener {
/** to use log facility, just put in your code: log.info(\"...\"); */
- static private Log log = LogFactory.getLog(RemoteNotifier.class);
+ static private Log log = LogFactory.getLog(EventPropagator.class);
/** Notifier service reference reference. */
protected WikittyServiceNotifier ws;
protected RemoteNotifierTransporter transporter;
- public RemoteNotifier(ApplicationConfig config, WikittyServiceNotifier ws) {
- // can be null according to default constructor
- if (config != null) {
- this.ws = ws;
- transporter = WikittyServiceFactory.buildTransporter(config, ws);
-
- if (transporter != null) {
- // add this as listener when transporter is created without error
- // FIX poussin 201O1126 remplacement du ALL par LOCAL
- // sinon on renvoie des events qui nous ont ete envoyes :(
- // ca risque de boucler :(
- ws.addWikittyServiceListener(this, WikittyService.ServiceListenerType.LOCAL); // weak reference
- }
- }
- if (log.isInfoEnabled()) {
- if (transporter == null) {
- log.info("RemoteNotifier synchronisation not used ");
- } else {
- log.info("RemoteNotifier transporter: " + transporter.getClass().getName());
- }
- }
+ public EventPropagator(ApplicationConfig config,
+ WikittyServiceNotifier ws, RemoteNotifierTransporter transporter) {
+ this.ws = ws;
+ this.transporter = transporter;
}
/**
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/XMPPNotifierTransporter.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/XMPPNotifierTransporter.java 2010-12-01 16:41:08 UTC (rev 549)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/XMPPNotifierTransporter.java 2010-12-02 01:13:56 UTC (rev 550)
@@ -81,13 +81,12 @@
* @param ws
* @param props
*/
- public XMPPNotifierTransporter(ApplicationConfig config, WikittyServiceNotifier ws) {
+ public XMPPNotifierTransporter(ApplicationConfig config) {
propagateEvent = config.getOptionAsBoolean(WikittyConfig.WikittyOption.
WIKITTY_EVENT_PROPAGATE.getKey());
listenEvent = config.getOptionAsBoolean(WikittyConfig.WikittyOption.
WIKITTY_EVENT_LISTEN.getKey());
- setWikittyServiceNotifier(ws);
initXMPP(config);
}
@@ -95,6 +94,7 @@
return ws;
}
+ @Override
public void setWikittyServiceNotifier(WikittyServiceNotifier ws) {
this.ws = ws;
}
Modified: trunk/wikitty-api/src/main/resources/wikitty-config-sample-client.properties
===================================================================
--- trunk/wikitty-api/src/main/resources/wikitty-config-sample-client.properties 2010-12-01 16:41:08 UTC (rev 549)
+++ trunk/wikitty-api/src/main/resources/wikitty-config-sample-client.properties 2010-12-02 01:13:56 UTC (rev 550)
@@ -26,10 +26,10 @@
org.nuiton.wikitty.services.WikittyServiceNotifier,\
org.nuiton.wikitty.services.WikittyServiceCached,\
org.nuiton.wikitty.services.WikittyServiceSecurity
+wikitty.WikittyServiceNotifier.components=org.nuiton.wikitty.services.XMPPNotifierTransporter
wikitty.service.cache.allwaysRestoreCopies=false
wikitty.service.event.propagate=false
wikitty.service.event.listen=true
-wikitty.service.event.propagate.transporter=org.nuiton.wikitty.services.XMPPNotifierTransporter
wikitty.service.event.transporter.xmpp.server=im.codelutin.com
wikitty.service.event.transporter.xmpp.room=master(a)conference.im.codelutin.com
wikitty.service.server.url=http://services.codelutin.com/wikitty
Modified: trunk/wikitty-api/src/main/resources/wikitty-config-sample-inmemory.properties
===================================================================
--- trunk/wikitty-api/src/main/resources/wikitty-config-sample-inmemory.properties 2010-12-01 16:41:08 UTC (rev 549)
+++ trunk/wikitty-api/src/main/resources/wikitty-config-sample-inmemory.properties 2010-12-02 01:13:56 UTC (rev 550)
@@ -31,7 +31,6 @@
wikitty.storage.jdbc.xadatasource.org.h2.jdbcx.JdbcDataSource.URL=${wikitty.storage.jdbc.host}
wikitty.storage.jdbc.xadatasource.org.h2.jdbcx.JdbcDataSource.user=${wikitty.storage.jdbc.login}
wikitty.storage.jdbc.xadatasource.org.h2.jdbcx.JdbcDataSource.password=${wikitty.storage.jdbc.password}
-wikitty.searchengine.solr.directory.factory=solr.RAMDirectoryFactory
wikitty.WikittyService.components=org.nuiton.wikitty.services.WikittyServiceStorage,\
org.nuiton.wikitty.services.WikittyServiceNotifier,\
org.nuiton.wikitty.services.WikittyServiceCached,\
@@ -39,9 +38,10 @@
wikitty.WikittyServiceStorage.components=org.nuiton.wikitty.jdbc.WikittyExtensionStorageJDBC,\
org.nuiton.wikitty.jdbc.WikittyStorageJDBC,\
org.nuiton.wikitty.solr.WikittySearchEnginSolr
+wikitty.searchengine.solr.directory.factory=org.nuiton.wikitty.solr.RAMDirectoryFactory
+wikitty.service.cache.allwaysRestoreCopies=false
+wikitty.service.event.propagate=false
+wikitty.service.event.listen=false
wikitty.addon.export.threadnumber=1
wikitty.addon.export.directory=/tmp/wikitty
wikitty.addon.export.publicurl=file:///tmp/wikitty/
-wikitty.service.cache.allwaysRestoreCopies=false
-wikitty.service.event.propagate=false
-wikitty.service.event.listen=false
Modified: trunk/wikitty-api/src/main/resources/wikitty-config-sample-server-slave.properties
===================================================================
--- trunk/wikitty-api/src/main/resources/wikitty-config-sample-server-slave.properties 2010-12-01 16:41:08 UTC (rev 549)
+++ trunk/wikitty-api/src/main/resources/wikitty-config-sample-server-slave.properties 2010-12-02 01:13:56 UTC (rev 550)
@@ -42,11 +42,11 @@
wikitty.WikittyServiceStorage.components=org.nuiton.wikitty.jdbc.WikittyExtensionStorageJDBC,\
org.nuiton.wikitty.jdbc.WikittyStorageJDBC,\
org.nuiton.wikitty.solr.WikittySearchEnginSolr
+wikitty.WikittyServiceNotifier.components=org.nuiton.wikitty.services.XMPPNotifierTransporter
wikitty.service.server.url=http://services-slave.codelutin.com/wikitty
wikitty.service.cache.allwaysRestoreCopies=false
wikitty.service.event.propagate=true
wikitty.service.event.listen=false
-wikitty.service.event.propagate.transporter=org.nuiton.wikitty.services.XMPPNotifierTransporter
wikitty.service.event.transporter.xmpp.server=im.codelutin.com
wikitty.service.event.transporter.xmpp.room=slave(a)conference.im.codelutin.com
wikitty.service.slave.async.store=false
Modified: trunk/wikitty-api/src/main/resources/wikitty-config-sample-server.properties
===================================================================
--- trunk/wikitty-api/src/main/resources/wikitty-config-sample-server.properties 2010-12-01 16:41:08 UTC (rev 549)
+++ trunk/wikitty-api/src/main/resources/wikitty-config-sample-server.properties 2010-12-02 01:13:56 UTC (rev 550)
@@ -41,12 +41,12 @@
wikitty.WikittyServiceStorage.components=org.nuiton.wikitty.jdbc.WikittyExtensionStorageJDBC,\
org.nuiton.wikitty.jdbc.WikittyStorageJDBC,\
org.nuiton.wikitty.solr.WikittySearchEnginSolr
+wikitty.WikittyServiceNotifier.components=org.nuiton.wikitty.services.XMPPNotifierTransporter
wikitty.service.server.url=http://services.codelutin.com/wikitty
wikitty.service.cache.listenevents=false
wikitty.service.cache.allwaysRestoreCopies=false
wikitty.service.event.propagate=true
wikitty.service.event.listen=false
-wikitty.service.event.propagate.transporter=org.nuiton.wikitty.services.XMPPNotifierTransporter
wikitty.service.event.transporter.xmpp.server=im.codelutin.com
wikitty.service.event.transporter.xmpp.room=master(a)conference.im.codelutin.com
wikitty.addon.export.threadnumber=1
Modified: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/notification/WikittyServiceNotificationTest.java
===================================================================
--- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/notification/WikittyServiceNotificationTest.java 2010-12-01 16:41:08 UTC (rev 549)
+++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/notification/WikittyServiceNotificationTest.java 2010-12-02 01:13:56 UTC (rev 550)
@@ -59,7 +59,7 @@
*/
@Test
public void testEvent() throws Exception {
- WikittyServiceNotifier wsn = new WikittyServiceNotifier(null, null);
+ WikittyServiceNotifier wsn = new WikittyServiceNotifier(null, null, null);
Listener l = new Listener();
// test d'envoi et de bonne reception
Modified: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/notification/XMPPNotificationTest.java
===================================================================
--- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/notification/XMPPNotificationTest.java 2010-12-01 16:41:08 UTC (rev 549)
+++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/notification/XMPPNotificationTest.java 2010-12-02 01:13:56 UTC (rev 550)
@@ -59,13 +59,13 @@
String server = "im.codelutin.com";
String room = "test(a)conference.im.codelutin.com";
WikittyConfig config = new WikittyConfig();
- config.setOption(WikittyConfig.WikittyOption.WIKITTY_EVENT_TRANSPORTER.getKey(), XMPPNotifierTransporter.class.getName());
config.setOption(WikittyConfig.WikittyOption.WIKITTY_EVENT_TRANSPORTER_XMPP_SERVER.getKey(), server);
config.setOption(WikittyConfig.WikittyOption.WIKITTY_EVENT_TRANSPORTER_XMPP_ROOM.getKey(), room);
// Envoi d'un message avec le transporter normal
- WikittyServiceNotifier wsn = new WikittyServiceNotifier(config, null);
- WikittyServiceNotifier.RemoteNotifierTransporter transporteur = WikittyServiceFactory.buildTransporter(config, wsn);
+ WikittyServiceNotifier.RemoteNotifierTransporter transporteur =
+ new XMPPNotifierTransporter(config);
+ WikittyServiceNotifier wsn = new WikittyServiceNotifier(config, null, transporteur);
WikittyEvent event = new WikittyEvent("test");
event.addRemoveDate("theId", new Date());
Modified: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/services/WikittyServiceHelperTest.java
===================================================================
--- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/services/WikittyServiceHelperTest.java 2010-12-01 16:41:08 UTC (rev 549)
+++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/services/WikittyServiceHelperTest.java 2010-12-02 01:13:56 UTC (rev 550)
@@ -32,6 +32,9 @@
import org.nuiton.wikitty.WikittyConfig;
import org.nuiton.wikitty.WikittyService;
import org.nuiton.wikitty.WikittyServiceFactory;
+import org.nuiton.wikitty.storage.WikittyExtensionStorageInMemory;
+import org.nuiton.wikitty.storage.WikittySearchEnginInMemory;
+import org.nuiton.wikitty.storage.WikittyStorageInMemory;
/**
*
@@ -62,4 +65,26 @@
ws = ((WikittyServiceNotifier)ws).ws;
Assert.assertEquals(WikittyServiceInMemory.class, ws.getClass());
}
+
+ @Test
+ public void testSampleConfig() throws Exception {
+ {
+ WikittyConfig config = new WikittyConfig("wikitty-config-sample-inmemory.properties");
+ // surcharge certain option qui ont besoin d'autre module que api
+ config.setOption(WikittyConfig.WikittyOption.WIKITTY_WIKITTYSERVICESTORAGE_COMPONENTS.getKey(),
+ WikittyStorageInMemory.class.getName()
+ + "," + WikittyExtensionStorageInMemory.class.getName()
+ + "," + WikittySearchEnginInMemory.class.getName());
+ WikittyService ws = WikittyServiceFactory.buildWikittyService(config);
+
+ Assert.assertEquals(WikittyServiceSecurity.class, ws.getClass());
+ ws = ((WikittyServiceEnhanced)((WikittyServiceSecurity) ws).ws).delegate;
+ Assert.assertEquals(WikittyServiceCached.class, ws.getClass());
+ ws = ((WikittyServiceCached) ws).ws;
+ Assert.assertEquals(WikittyServiceNotifier.class, ws.getClass());
+ ws = ((WikittyServiceNotifier) ws).ws;
+ Assert.assertEquals(WikittyServiceStorage.class, ws.getClass());
+ }
+ }
+
}
1
0
r549 - in trunk/wikitty-api/src: main/java/org/nuiton/wikitty main/java/org/nuiton/wikitty/entities test/java/org/nuiton/wikitty/api
by sletellier@users.nuiton.org 01 Dec '10
by sletellier@users.nuiton.org 01 Dec '10
01 Dec '10
Author: sletellier
Date: 2010-12-01 17:41:08 +0100 (Wed, 01 Dec 2010)
New Revision: 549
Url: http://nuiton.org/repositories/revision/wikitty/549
Log:
Modify clone methode to allow create a clone with a new wikittyId
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/Wikitty.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyCopyOnWrite.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyImpl.java
trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/WikittyUtilTest.java
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java 2010-12-01 15:32:39 UTC (rev 548)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java 2010-12-01 16:41:08 UTC (rev 549)
@@ -812,6 +812,23 @@
}
/**
+ * Clone wikitty with new id if {@code genId} is true
+ *
+ * @param wikittyToClone concerned
+ * @param genId true to generate new id
+ * @return cloned wikitty
+ * @throws CloneNotSupportedException if exception is thrown
+ */
+ public static Wikitty clone(Wikitty wikittyToClone, boolean genId) throws CloneNotSupportedException {
+ if (genId) {
+ Wikitty w = new WikittyImpl();
+ w.replaceWith(wikittyToClone, true);
+ return w;
+ }
+ return wikittyToClone.clone();
+ }
+
+ /**
* SecurityToken is used like wikitty id and must begin with UUID_
*
* @return SecurityToken that can be used like wikitty id
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/Wikitty.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/Wikitty.java 2010-12-01 15:32:39 UTC (rev 548)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/Wikitty.java 2010-12-01 16:41:08 UTC (rev 549)
@@ -51,6 +51,13 @@
*/
void replaceWith(Wikitty w);
+ /**
+ * Replace all field of current wikitty with field found in w.
+ * This two wikitty must have same id if force is false
+ * @param w wikitty where we take information
+ */
+ void replaceWith(Wikitty w, boolean force);
+
String getId();
boolean isDeleted();
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyCopyOnWrite.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyCopyOnWrite.java 2010-12-01 15:32:39 UTC (rev 548)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyCopyOnWrite.java 2010-12-01 16:41:08 UTC (rev 549)
@@ -65,11 +65,16 @@
@Override
public void replaceWith(Wikitty w) {
+ replaceWith(w, false);
+ }
+
+ @Override
+ public void replaceWith(Wikitty w, boolean force) {
if (this == w) {
return;
}
substituteTargetWithCopy();
- target.replaceWith(w);
+ target.replaceWith(w, force);
}
public Wikitty getTarget() {
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyImpl.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyImpl.java 2010-12-01 15:32:39 UTC (rev 548)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyImpl.java 2010-12-01 16:41:08 UTC (rev 549)
@@ -121,6 +121,19 @@
*/
@Override
public void replaceWith(Wikitty w) {
+ replaceWith(w, false);
+ }
+
+ /**
+ * Replace all field of current wikitty with field found in w.
+ * This two wikitty must have same id if force is false.
+ *
+ * This method is used to clone Wikitty too
+ *
+ * @param w wikitty where we take information
+ */
+ @Override
+ public void replaceWith(Wikitty w, boolean force) {
// il faut que ce soit le meme objet mais pas la meme instance
// car ca ne sert a rien de copier un objet sur lui meme
if (this == w) {
@@ -130,7 +143,7 @@
if (w instanceof WikittyCopyOnWrite) {
replaceWith(((WikittyCopyOnWrite)w).getTarget());
}
- if (this.getId().equals(w.getId())) {
+ if (force || this.getId().equals(w.getId())) {
this.extensions.clear();
this.fieldValue.clear();
for (WikittyExtension ext : w.getExtensions()) {
@@ -155,10 +168,13 @@
}
}
- // we must change version after field value copy, because
- // copy increment version because it use setField method
- this.version = w.getVersion();
- this.deleteDate = w.getDeleteDate();
+ // Dont keep version if force
+ if (!force) {
+ // we must change version after field value copy, because
+ // copy increment version because it use setField method
+ this.version = w.getVersion();
+ this.deleteDate = w.getDeleteDate();
+ }
clearDirty();
} else {
Modified: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/WikittyUtilTest.java
===================================================================
--- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/WikittyUtilTest.java 2010-12-01 15:32:39 UTC (rev 548)
+++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/WikittyUtilTest.java 2010-12-01 16:41:08 UTC (rev 549)
@@ -25,7 +25,6 @@
package org.nuiton.wikitty.api;
-import org.nuiton.wikitty.entities.BusinessEntityImplTest;
import java.beans.PropertyChangeListener;
import java.math.BigDecimal;
import java.text.ParseException;
@@ -574,8 +573,44 @@
Assert.assertEquals(source.getWikittyVersion(), dest.getWikittyVersion());
Assert.assertEquals(source.getLabels(), dest.getLabels());
}
+ }
+ @Test
+ public void testClone() throws Exception {
+ {
+ WikittyLabel source = new WikittyLabelImpl();
+ source.setWikittyVersion("1.0");
+ source.addLabels("toto");
+ source.addLabels("titi");
+ Wikitty labelWikitty = WikittyUtil.getWikitty(null, null, source);
+ Wikitty cloned = WikittyUtil.clone(labelWikitty, false);
+
+ WikittyLabelImpl labelCloned = new WikittyLabelImpl(cloned);
+
+ Assert.assertTrue(labelWikitty.getId().equals(cloned.getId()));
+ Assert.assertEquals(labelWikitty.getVersion(), cloned.getVersion());
+ Assert.assertTrue(source.getWikittyId().equals(labelCloned.getWikittyId()));
+ Assert.assertEquals(source.getWikittyVersion(), labelCloned.getWikittyVersion());
+ Assert.assertEquals(source.getLabels(), labelCloned.getLabels());
+ }
+ {
+ WikittyLabel source = new WikittyLabelImpl();
+ source.setWikittyVersion("1.0");
+ source.addLabels("toto");
+ source.addLabels("titi");
+
+ Wikitty labelWikitty = WikittyUtil.getWikitty(null, null, source);
+ Wikitty cloned = WikittyUtil.clone(labelWikitty, true);
+
+ WikittyLabelImpl labelCloned = new WikittyLabelImpl(cloned);
+
+ Assert.assertFalse(labelWikitty.getId().equals(cloned.getId()));
+ Assert.assertNotSame(labelWikitty.getVersion(), cloned.getVersion());
+ Assert.assertFalse(source.getWikittyId().equals(labelCloned.getWikittyId()));
+ Assert.assertNotSame(source.getWikittyVersion(), labelCloned.getWikittyVersion());
+ Assert.assertEquals(source.getLabels(), labelCloned.getLabels());
+ }
}
static public class LabelDTO implements WikittyLabel {
1
0
r548 - trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services
by bpoussin@users.nuiton.org 01 Dec '10
by bpoussin@users.nuiton.org 01 Dec '10
01 Dec '10
Author: bpoussin
Date: 2010-12-01 16:32:39 +0100 (Wed, 01 Dec 2010)
New Revision: 548
Url: http://nuiton.org/repositories/revision/wikitty/548
Log:
Anomalie #1122: Wikitty migration open new transaction instead of using current transaction
Refactor all WikittyTransaction usage to put current transaction in ThreadLocal. Each thread has own transaction for reuse
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceStorage.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyTransaction.java
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceStorage.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceStorage.java 2010-12-01 14:37:43 UTC (rev 547)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceStorage.java 2010-12-01 15:32:39 UTC (rev 548)
@@ -169,45 +169,9 @@
}
}
-// @Override
-// public UpdateResponse store(String securityToken, WikittyTransaction transaction,
-// Collection<Wikitty> wikitties, boolean force) {
-// if (!(wikitties instanceof Set)) {
-// // use all time Set to prevent duplicated wikitty in collection
-// wikitties = new LinkedHashSet<Wikitty>(wikitties);
-// }
-// checkConstraint(wikitties);
-//
-// // update/store extension if necessary
-// Set<WikittyExtension> allExtensions = new LinkedHashSet<WikittyExtension>();
-// for (Wikitty w : wikitties) {
-// // collect all extensions used by all wikitties
-// allExtensions.addAll(w.getExtensions());
-// }
-//
-// // try to commit command
-// UpdateResponse extUpdate = getExtensionStorage().store(transaction, allExtensions);
-// UpdateResponse wikUpdate = getWikittyStorage().store(transaction, wikitties, force);
-// UpdateResponse indexUpdate = getSearchEngin().store(transaction, wikitties);
-//
-// UpdateResponse result = new UpdateResponse();
-// // prepare update client response
-// result.add(extUpdate);
-// result.add(wikUpdate);
-// result.add(indexUpdate);
-//
-// return result;
-// }
@Override
public WikittyEvent store(String securityToken,
Collection<Wikitty> wikitties, boolean force) {
- WikittyEvent result = store(securityToken, null, wikitties, force);
- return result;
- }
-
- protected WikittyEvent store(String securityToken,
- WikittyTransaction transaction,
- Collection<Wikitty> wikitties, boolean force) {
if (!(wikitties instanceof Set)) {
// use all time Set to prevent duplicated wikitty in collection
wikitties = new LinkedHashSet<Wikitty>(wikitties);
@@ -221,38 +185,38 @@
allExtensions.addAll(w.getExtensions());
}
- boolean txCreated = false;
+ WikittyTransaction tx = WikittyTransaction.get();
+ boolean txBeginHere = false;
try {
- if (transaction == null) {
- transaction = new WikittyTransaction();
- txCreated = true;
- transaction.begin();
+ if (!tx.isStarted()) {
+ tx.begin();
+ txBeginHere = true;
}
// try to commit command
WikittyEvent extUpdate =
- getExtensionStorage().store(transaction, allExtensions);
+ getExtensionStorage().store(tx, allExtensions);
WikittyEvent wikUpdate =
- getWikittyStorage().store(transaction, wikitties, force);
- getSearchEngin().store(transaction, wikitties);
+ getWikittyStorage().store(tx, wikitties, force);
+ getSearchEngin().store(tx, wikitties);
WikittyEvent result = new WikittyEvent(this);
// prepare update client response
result.add(extUpdate);
result.add(wikUpdate);
- if (txCreated) {
- transaction.commit();
+ if (txBeginHere) {
+ tx.commit();
}
return result;
} catch (WikittyException ex) {
- if (transaction != null) {
- transaction.rollback();
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
}
throw ex;
} catch (Exception eee) {
- if (transaction != null) {
- transaction.rollback();
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
}
throw new WikittyException("Can't store wikitty", eee);
}
@@ -260,16 +224,29 @@
@Override
public List<String> getAllExtensionIds(String securityToken) {
- WikittyTransaction transaction = new WikittyTransaction();
+ WikittyTransaction tx = WikittyTransaction.get();
+ boolean txBeginHere = false;
try {
- transaction.begin();
+ if (!tx.isStarted()) {
+ tx.begin();
+ txBeginHere = true;
+ }
- List<String> result = getExtensionStorage().getAllExtensionIds(transaction);
-
- transaction.commit();
+ List<String> result = getExtensionStorage().getAllExtensionIds(tx);
+
+ if (txBeginHere) {
+ tx.commit();
+ }
return result;
+ } catch (WikittyException ex) {
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
+ }
+ throw ex;
} catch (Exception eee) {
- transaction.rollback();
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
+ }
throw new WikittyException("Can't retrieve all extension's ids", eee);
}
}
@@ -277,74 +254,75 @@
@Override
public List<String> getAllExtensionsRequires(
String securityToken, String extensionName) {
- WikittyTransaction transaction = new WikittyTransaction();
+ WikittyTransaction tx = WikittyTransaction.get();
+ boolean txBeginHere = false;
try {
- transaction.begin();
+ if (!tx.isStarted()) {
+ tx.begin();
+ txBeginHere = true;
+ }
List<String> result = getExtensionStorage()
- .getAllExtensionsRequires(transaction, extensionName);
-
- transaction.commit();
+ .getAllExtensionsRequires(tx, extensionName);
+
+ if (txBeginHere) {
+ tx.commit();
+ }
return result;
+ } catch (WikittyException ex) {
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
+ }
+ throw ex;
} catch (Exception eee) {
- transaction.rollback();
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
+ }
throw new WikittyException(String.format(
"Can't retrieve all required extension for %s", extensionName), eee);
}
}
@Override
- public WikittyEvent storeExtension(
- String securityToken, Collection<WikittyExtension> exts) {
- WikittyEvent result = storeExtension(securityToken, null, exts);
- return result;
- }
-
- @Override
- public WikittyEvent deleteExtension(
- String securityToken, Collection<String> extNames) {
- WikittyEvent result = deleteExtension(securityToken, null, extNames);
- return result;
- }
-
- protected WikittyEvent storeExtension(String securityToken,
- WikittyTransaction transaction, Collection<WikittyExtension> exts) {
- boolean txCreated = false;
+ public WikittyEvent storeExtension(String securityToken,
+ Collection<WikittyExtension> exts) {
+ WikittyTransaction tx = WikittyTransaction.get();
+ boolean txBeginHere = false;
try {
- if (transaction == null) {
- transaction = new WikittyTransaction();
- txCreated = true;
- transaction.begin();
+ if (!tx.isStarted()) {
+ tx.begin();
+ txBeginHere = true;
}
WikittyEvent result =
- getExtensionStorage().store(transaction, exts);
+ getExtensionStorage().store(tx, exts);
- if (txCreated) {
- transaction.commit();
+ if (txBeginHere) {
+ tx.commit();
}
return result;
} catch (WikittyException ex) {
- if (transaction != null) {
- transaction.rollback();
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
}
throw ex;
} catch (Exception eee) {
- if (transaction != null) {
- transaction.rollback();
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
}
throw new WikittyException("Can't store extensions", eee);
}
}
- protected WikittyEvent deleteExtension(String securityToken,
- WikittyTransaction transaction, Collection<String> extNames) {
- boolean txCreated = false;
+ @Override
+ public WikittyEvent deleteExtension(
+ String securityToken, Collection<String> extNames) {
+ WikittyTransaction tx = WikittyTransaction.get();
+ boolean txBeginHere = false;
try {
- if (transaction == null) {
- transaction = new WikittyTransaction();
- txCreated = true;
- transaction.begin();
+ if (!tx.isStarted()) {
+ tx.begin();
+ txBeginHere = true;
}
// check that all extensions are not used
@@ -353,7 +331,7 @@
Criteria criteria = Search.query().eq(Element.ELT_EXTENSION, name).criteria();
criteria.setEndIndex(0); // result is not use, just numFound
PagedResult<String> wikittyWithExt = findAllByCriteria(
- securityToken, transaction, criteria);
+ securityToken, criteria);
int numFound = wikittyWithExt.getNumFound();
if (numFound > 0) {
throw new WikittyException(String.format(
@@ -364,20 +342,20 @@
}
WikittyEvent result =
- getExtensionStorage().delete(transaction, extNames);
+ getExtensionStorage().delete(tx, extNames);
- if (txCreated) {
- transaction.commit();
+ if (txBeginHere) {
+ tx.commit();
}
return result;
} catch (WikittyException ex) {
- if (transaction != null) {
- transaction.rollback();
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
}
throw ex;
} catch (Exception eee) {
- if (transaction != null) {
- transaction.rollback();
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
}
throw new WikittyException("Can't delete extensions", eee);
}
@@ -386,38 +364,32 @@
@Override
public WikittyExtension restoreExtension(
String securityToken, String extensionId) {
- WikittyExtension result = restoreExtension(securityToken, null, extensionId);
- return result;
- }
-
- protected WikittyExtension restoreExtension(
- String securityToken, WikittyTransaction transaction, String extensionId) {
- boolean txCreated = false;
+ WikittyTransaction tx = WikittyTransaction.get();
+ boolean txBeginHere = false;
try {
- if (transaction == null) {
- transaction = new WikittyTransaction();
- txCreated = true;
- transaction.begin();
+ if (!tx.isStarted()) {
+ tx.begin();
+ txBeginHere = true;
}
//split the id to ensure that version is normalized
String name = WikittyExtension.computeName(extensionId);
String version = WikittyExtension.computeVersion(extensionId);
- WikittyExtension result = getExtensionStorage().restore(transaction, name, version);
+ WikittyExtension result = getExtensionStorage().restore(tx, name, version);
- if (txCreated) {
- transaction.commit();
+ if (txBeginHere) {
+ tx.commit();
}
return result;
} catch (WikittyException ex) {
- if (transaction != null) {
- transaction.rollback();
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
}
throw ex;
} catch (Exception eee) {
- if (transaction != null) {
- transaction.rollback();
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
}
throw new WikittyException("Can't restore extensions", eee);
}
@@ -426,92 +398,111 @@
@Override
public WikittyExtension restoreExtensionLastVersion(
String securityToken, String name) {
- WikittyExtension result = restoreExtensionLastVersion(securityToken, null, name);
- return result;
- }
-
- protected WikittyExtension restoreExtensionLastVersion(String securityToken,
- WikittyTransaction transaction, String name) {
- String version = getExtensionStorage().getLastVersion(transaction, name);
- if(version == null) {
- return null;
- }
-
- boolean txCreated = false;
+ WikittyTransaction tx = WikittyTransaction.get();
+ boolean txBeginHere = false;
try {
- if (transaction == null) {
- transaction = new WikittyTransaction();
- txCreated = true;
- transaction.begin();
+ if (!tx.isStarted()) {
+ tx.begin();
+ txBeginHere = true;
}
- WikittyExtension result = getExtensionStorage().restore(transaction, name, version);
+ String version = getExtensionStorage().getLastVersion(tx, name);
+ if (version == null) {
+ if (txBeginHere) {
+ tx.commit();
+ }
+ return null;
+ }
- if (txCreated) {
- transaction.commit();
+
+ WikittyExtension result = getExtensionStorage().restore(tx, name, version);
+
+ if (txBeginHere) {
+ tx.commit();
}
return result;
} catch (WikittyException ex) {
- if (transaction != null) {
- transaction.rollback();
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
}
throw ex;
} catch (Exception eee) {
- if (transaction != null) {
- transaction.rollback();
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
}
throw new WikittyException("Can't store extensions", eee);
}
}
- protected Wikitty restore(String securityToken,
- WikittyTransaction transaction, String id) {
- if (id == null) {
- return null;
- }
- if (!getWikittyStorage().exists(transaction, id)) {
- // object doesn't exist, we return null
- return null;
- }
+ /**
+ * restore one wikitty
+ * @param securityToken
+ * @param id
+ * @return
+ */
+ protected Wikitty restore(String securityToken, String id) {
+ WikittyTransaction tx = WikittyTransaction.get();
+ boolean txBeginHere = false;
+ try {
+ if (!tx.isStarted()) {
+ tx.begin();
+ txBeginHere = true;
+ }
- if (getWikittyStorage().isDeleted(transaction, id)) {
- // object deleted, we return null
- return null;
+ if (id == null) {
+ return null;
+ }
+ if (!getWikittyStorage().exists(tx, id)) {
+ // object doesn't exist, we return null
+ return null;
+ }
+
+ if (getWikittyStorage().isDeleted(tx, id)) {
+ // object deleted, we return null
+ return null;
+ }
+ Wikitty result = getWikittyStorage().restore(tx, id);
+ if (result != null) {
+ result = upgradeData(securityToken, result);
+ }
+
+ if (txBeginHere) {
+ tx.commit();
+ }
+ return result;
+ } catch (WikittyException ex) {
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
+ }
+ throw ex;
+ } catch (Exception eee) {
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
+ }
+ throw new WikittyException("Can't store extensions", eee);
}
- Wikitty result = getWikittyStorage().restore(transaction, id);
- if(result != null) {
- result = upgradeData(securityToken, transaction, result);
- }
- return result;
}
@Override
public List<Wikitty> restore(String securityToken, List<String> ids) {
- List<Wikitty> result = restore(securityToken, null, ids);
- return result;
- }
-
- protected List<Wikitty> restore(String securityToken,
- WikittyTransaction transaction, List<String> ids) {
-
List<Wikitty> result = new ArrayList<Wikitty>();
- boolean txCreated = false;
+ WikittyTransaction transaction = WikittyTransaction.get();
+ boolean txBeginHere = false;
try {
- if (transaction == null) {
- transaction = new WikittyTransaction();
- txCreated = true;
+ if (!transaction.isStarted()) {
transaction.begin();
+ txBeginHere = true;
}
for (String id : ids) {
- Wikitty w = restore(securityToken, transaction, id);
+ Wikitty w = restore(securityToken, id);
// on l'ajoutde tout le temps, meme si w est nul lorsqu'il y a
// une demande et qu'elle echoue on ajout
// bien null, pour qu'il y ait une correspondance 1 pour 1
// avec la demande
result.add(w);
}
- if (txCreated) {
+ if (txBeginHere) {
transaction.commit();
}
return result;
@@ -528,9 +519,13 @@
}
}
- // FIXME poussin 20101029 use WikittyServiceTransaction and remove other transaction
- protected Wikitty upgradeData(String securityToken,
- WikittyTransaction transaction, Wikitty wikitty) {
+ /**
+ * Upgrade wikitty but not saved it.
+ * @param securityToken
+ * @param wikitty
+ * @return
+ */
+ protected Wikitty upgradeData(String securityToken, Wikitty wikitty) {
Wikitty result = wikitty;
Collection<WikittyExtension> extensions = wikitty.getExtensions();
@@ -545,7 +540,7 @@
String currentExtensionVersion = currentExtension.getVersion();
WikittyExtension lastExtension = restoreExtensionLastVersion(
- securityToken, transaction, extensionName);
+ securityToken, extensionName);
String lastExtensionVersion = lastExtension.getVersion();
if (log.isDebugEnabled()) {
@@ -567,7 +562,7 @@
String nextExtensionId =
WikittyExtension.computeId(extensionName, nextExtensionVersion);
WikittyExtension nextExtension = restoreExtension(
- securityToken, transaction, nextExtensionId);
+ securityToken, nextExtensionId);
if (log.isDebugEnabled()) {
log.debug("currentExtensionVersion=" + currentExtensionVersion);
@@ -589,85 +584,93 @@
return result;
}
- protected WikittyEvent delete(String securityToken, WikittyTransaction transaction,
+ @Override
+ public WikittyEvent delete(String securityToken,
Collection<String> ids) throws WikittyException {
- // work only on valid id
- Collection<Wikitty> storedWikitties = new LinkedHashSet<Wikitty>();
- // copy ids because we can remove some element, and modify it
- // use set to prevent id duplication and preformance (contains method call)
- Set<String> idSet = new LinkedHashSet<String>(ids);
- for (Iterator<String> i = idSet.iterator(); i.hasNext();) {
- String id = i.next();
- // test if wikitty exists
- if (!getWikittyStorage().exists(transaction, id)) {
- // don't exist, remove this id in id list
- i.remove();
- // go to the next id, because this id doesn't exist and can't
- // be used in tree
- continue;
+ WikittyTransaction tx = WikittyTransaction.get();
+ boolean txBeginHere = false;
+ try {
+ if (!tx.isStarted()) {
+ tx.begin();
+ txBeginHere = true;
}
- if (getWikittyStorage().isDeleted(transaction, id)) {
- // already deleted, remove this id in id list
- i.remove();
- // go to the next id, because this id already deleted and can't
- // be used in tree
- continue;
- }
- // Store node with have deleted node as parent
- Criteria criteria =
- Search.query().eq(WikittyTreeNode.FQ_FIELD_WIKITTYTREENODE_PARENT, id).criteria();
- List<String> wikittyNodesId = findAllByCriteria(
- securityToken, transaction, criteria).getAll();
- for (String wikittyNodeId : wikittyNodesId) {
- if(!idSet.contains(wikittyNodeId)) {
- Wikitty treeNode = restore(
- securityToken, transaction, wikittyNodeId);
- WikittyTreeNodeHelper.setParent(treeNode, null);
- storedWikitties.add(treeNode);
+ // work only on valid id
+ Collection<Wikitty> storedWikitties = new LinkedHashSet<Wikitty>();
+ // copy ids because we can remove some element, and modify it
+ // use set to prevent id duplication and preformance (contains method call)
+ Set<String> idSet = new LinkedHashSet<String>(ids);
+ for (Iterator<String> i = idSet.iterator(); i.hasNext();) {
+ String id = i.next();
+ // test if wikitty exists
+ if (!getWikittyStorage().exists(tx, id)) {
+ // don't exist, remove this id in id list
+ i.remove();
+ // go to the next id, because this id doesn't exist and can't
+ // be used in tree
+ continue;
}
- }
+ if (getWikittyStorage().isDeleted(tx, id)) {
+ // already deleted, remove this id in id list
+ i.remove();
+ // go to the next id, because this id already deleted and can't
+ // be used in tree
+ continue;
+ }
- // Store node with have deleted child
- criteria = Search.query().eq(WikittyTreeNode.FQ_FIELD_WIKITTYTREENODE_ATTACHMENT, id).criteria();
- wikittyNodesId = findAllByCriteria(
- securityToken, transaction, criteria).getAll();
- for (String wikittyNodeId : wikittyNodesId) {
- if(!idSet.contains(wikittyNodeId)) {
- Wikitty treeNode = restore(
- securityToken, transaction, wikittyNodeId);
- WikittyTreeNodeHelper.removeAttachment(treeNode, id);
- storedWikitties.add(treeNode);
+ // Store node with have deleted node as parent
+ Criteria criteria =
+ Search.query().eq(WikittyTreeNode.
+ FQ_FIELD_WIKITTYTREENODE_PARENT, id).criteria();
+ List<String> wikittyNodesId = findAllByCriteria(
+ securityToken, criteria).getAll();
+ for (String wikittyNodeId : wikittyNodesId) {
+ if (!idSet.contains(wikittyNodeId)) {
+ Wikitty treeNode = restore(
+ securityToken, wikittyNodeId);
+ WikittyTreeNodeHelper.setParent(treeNode, null);
+ storedWikitties.add(treeNode);
+ }
}
+
+ // Store node with have deleted child
+ criteria = Search.query().eq(WikittyTreeNode.
+ FQ_FIELD_WIKITTYTREENODE_ATTACHMENT, id).criteria();
+ wikittyNodesId = findAllByCriteria(
+ securityToken, criteria).getAll();
+ for (String wikittyNodeId : wikittyNodesId) {
+ if (!idSet.contains(wikittyNodeId)) {
+ Wikitty treeNode = restore(
+ securityToken, wikittyNodeId);
+ WikittyTreeNodeHelper.removeAttachment(treeNode, id);
+ storedWikitties.add(treeNode);
+ }
+ }
}
- }
- WikittyEvent eventDelete =
- getWikittyStorage().delete(transaction, idSet);
- getSearchEngin().delete(transaction, idSet);
+ WikittyEvent eventDelete =
+ getWikittyStorage().delete(tx, idSet);
+ getSearchEngin().delete(tx, idSet);
- WikittyEvent eventStore =
- store(securityToken, transaction, storedWikitties, false);
-
- WikittyEvent result = new WikittyEvent(this);
- result.add(eventDelete);
- result.add(eventStore);
-
- return result;
- }
+ WikittyEvent eventStore = store(securityToken, storedWikitties, false);
- @Override
- public WikittyEvent delete(String securityToken, Collection<String> ids){
- WikittyTransaction transaction = new WikittyTransaction();
- try {
- transaction.begin();
-
- WikittyEvent result = delete(securityToken, transaction, ids);
+ WikittyEvent result = new WikittyEvent(this);
+ result.add(eventDelete);
+ result.add(eventStore);
- transaction.commit();
+ if (txBeginHere) {
+ tx.commit();
+ }
return result;
+ } catch (WikittyException ex) {
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
+ }
+ throw ex;
} catch (Exception eee) {
- transaction.rollback();
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
+ }
throw new WikittyException("Can't delete wikitty", eee);
}
}
@@ -678,71 +681,68 @@
*/
@Override
public WikittyEvent clear(String securityToken) {
- WikittyTransaction transaction = new WikittyTransaction();
+ WikittyTransaction tx = WikittyTransaction.get();
+ boolean txBeginHere = false;
try {
- transaction.begin();
+ if (!tx.isStarted()) {
+ tx.begin();
+ txBeginHere = true;
+ }
-
- WikittyEvent result = clear(securityToken, transaction);
+ getSearchEngin().clear(tx);
+ WikittyEvent eventWik = getWikittyStorage().clear(tx);
+ WikittyEvent eventExt = getExtensionStorage().clear(tx);
- transaction.commit();
+ WikittyEvent result = new WikittyEvent(this);
+ result.add(eventWik);
+ result.add(eventExt);
+
+ if (txBeginHere) {
+ tx.commit();
+ }
return result;
+ } catch (WikittyException ex) {
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
+ }
+ throw ex;
} catch (Exception eee) {
- transaction.rollback();
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
+ }
throw new WikittyException("Can't clear all data", eee);
}
}
/**
- * Use with caution : It will delete ALL indexes from search engine !
- * This operation should be disabled in production environment.
- */
- protected WikittyEvent clear(String securityToken, WikittyTransaction tx) {
- getSearchEngin().clear(tx);
- WikittyEvent eventWik = getWikittyStorage().clear(tx);
- WikittyEvent eventExt = getExtensionStorage().clear(tx);
-
- WikittyEvent result = new WikittyEvent(this);
- result.add(eventWik);
- result.add(eventExt);
- return result;
- }
-
- /**
* Assume that this PagedResult contains wikitty id as result and
* return new PagedResult with Wikitty instance
*/
@Override
public PagedResult<String> findAllByCriteria(
String securityToken, Criteria criteria) {
- PagedResult<String> result = findAllByCriteria(securityToken, null, criteria);
- return result;
- }
-
- protected PagedResult<String> findAllByCriteria(String securityToken,
- WikittyTransaction transaction, Criteria criteria) {
+ WikittyTransaction tx = WikittyTransaction.get();
+ boolean txBeginHere = false;
try {
- boolean txCreated = false;
- if (transaction == null) {
- transaction = new WikittyTransaction();
- txCreated = true;
- transaction.begin();
+ if (!tx.isStarted()) {
+ tx.begin();
+ txBeginHere = true;
}
PagedResult<String> result =
- getSearchEngin().findAllByCriteria(transaction, criteria);
- if (txCreated) {
- transaction.commit();
+ getSearchEngin().findAllByCriteria(tx, criteria);
+ if (txBeginHere) {
+ tx.commit();
}
return result;
} catch (WikittyException ex) {
- if (transaction != null) {
- transaction.rollback();
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
}
throw ex;
} catch (Exception eee) {
- if (transaction != null) {
- transaction.rollback();
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
}
throw new WikittyException("Error during find", eee);
}
@@ -750,124 +750,128 @@
@Override
public Wikitty findByCriteria(String securityToken, Criteria criteria) {
- Wikitty result = findByCriteria(securityToken, null, criteria);
- return result;
- }
-
- protected Wikitty findByCriteria(String securityToken,
- WikittyTransaction transaction, Criteria criteria) {
+ WikittyTransaction tx = WikittyTransaction.get();
+ boolean txBeginHere = false;
try {
- boolean txCreated = false;
- if (transaction == null) {
- transaction = new WikittyTransaction();
- txCreated = true;
- transaction.begin();
+ if (!tx.isStarted()) {
+ tx.begin();
+ txBeginHere = true;
}
criteria.setFirstIndex(0).setEndIndex(1);
PagedResult<String> pages = findAllByCriteria(
- securityToken, transaction, criteria);
+ securityToken, criteria);
Wikitty result = null;
if (pages.size() > 0) {
String id = pages.getFirst();
- result = restore(securityToken, transaction, id);
+ result = restore(securityToken, id);
}
- if (txCreated) {
- transaction.commit();
+ if (txBeginHere) {
+ tx.commit();
}
return result;
} catch (WikittyException ex) {
- if (transaction != null) {
- transaction.rollback();
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
}
throw ex;
} catch (Exception eee) {
- if (transaction != null) {
- transaction.rollback();
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
}
throw new WikittyException("Error during find", eee);
}
}
- protected WikittyTree restoreTree(String securityToken,
- WikittyTransaction transaction, String wikittyId) {
- Wikitty w = restore(securityToken, transaction, wikittyId);
- if(w == null) {
- return null;
- }
+ @Override
+ public WikittyTree restoreTree(String securityToken, String wikittyId) {
+ WikittyTransaction tx = WikittyTransaction.get();
+ boolean txBeginHere = false;
+ try {
+ if (!tx.isStarted()) {
+ tx.begin();
+ txBeginHere = true;
+ }
- if ( !w.hasExtension(WikittyTreeNode.EXT_WIKITTYTREENODE) ) {
- throw new WikittyException(String.format(
- "Wikitty '%s' do not handle extension %s",
- wikittyId, WikittyTreeNode.EXT_WIKITTYTREENODE ));
- }
- WikittyTree tree = new WikittyTree();
- WikittyTreeNode node = new WikittyTreeNodeImpl(w);
- tree.setNode(node);
+ Wikitty w = restore(securityToken, wikittyId);
+ if (w == null) {
+ if (txBeginHere) {
+ tx.commit();
+ }
+ return null;
+ }
- WikittyTreeNodeImpl exempleNode = new WikittyTreeNodeImpl();
- exempleNode.setParent(wikittyId);
+ if (!w.hasExtension(WikittyTreeNode.EXT_WIKITTYTREENODE)) {
+ throw new WikittyException(String.format(
+ "Wikitty '%s' do not handle extension %s",
+ wikittyId, WikittyTreeNode.EXT_WIKITTYTREENODE));
+ }
+ WikittyTree tree = new WikittyTree();
+ WikittyTreeNode node = new WikittyTreeNodeImpl(w);
+ tree.setNode(node);
- Criteria criteria = Search.query(exempleNode.getWikitty()).criteria()
- .setFirstIndex(0).setEndIndex(Criteria.ALL_ELEMENTS);
- PagedResult<String> childNodesId = findAllByCriteria(
- securityToken, transaction, criteria);
- for (String childNodeId : childNodesId.getAll()) {
- tree.addChild(restoreTree(securityToken, transaction, childNodeId));
- }
+ WikittyTreeNodeImpl exempleNode = new WikittyTreeNodeImpl();
+ exempleNode.setParent(wikittyId);
- return tree;
- }
+ Criteria criteria = Search.query(exempleNode.getWikitty())
+ .criteria().setFirstIndex(0).setEndIndex(Criteria.ALL_ELEMENTS);
+ PagedResult<String> childNodesId = findAllByCriteria(
+ securityToken, criteria);
+ for (String childNodeId : childNodesId.getAll()) {
+ tree.addChild(restoreTree(securityToken, childNodeId));
+ }
- @Override
- public WikittyTree restoreTree(String securityToken, String wikittyId) {
- WikittyTransaction transaction = new WikittyTransaction();
- try {
- transaction.begin();
-
- WikittyTree tree = restoreTree(securityToken, transaction, wikittyId);
-
- transaction.commit();
+ if(txBeginHere) {
+ tx.commit();
+ }
return tree;
+ } catch (WikittyException ex) {
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
+ }
+ throw ex;
} catch (Exception eee) {
- transaction.rollback();
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
+ }
throw new WikittyException("Can't restore tree", eee);
}
}
@Override
public WikittyEvent deleteTree(String securityToken, String thesaurusId) {
- WikittyTransaction transaction = new WikittyTransaction();
+ WikittyTransaction tx = WikittyTransaction.get();
+ boolean txBeginHere = false;
try {
- transaction.begin();
-
- WikittyEvent result = deleteTree(securityToken, transaction, thesaurusId);
+ if (!tx.isStarted()) {
+ tx.begin();
+ txBeginHere = true;
+ }
- transaction.commit();
+ List<String> allTreeNodeId = getRecursiveTreeNodeId(
+ securityToken, thesaurusId);
+ WikittyEvent result = delete(securityToken, allTreeNodeId);
+
+ if (txBeginHere) {
+ tx.commit();
+ }
return result;
+ } catch (WikittyException ex) {
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
+ }
+ throw ex;
} catch (Exception eee) {
- transaction.rollback();
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
+ }
throw new WikittyException("Can't delete tree", eee);
}
}
/**
- * Delete specified treenode and sub treenode.
- *
- * @param securityToken security token
- * @param transaction transaction
- * @param treeNodeId thesaurusId to delete
- * @return all id of delete nodes
- */
- protected WikittyEvent deleteTree(String securityToken, WikittyTransaction transaction, String treeNodeId) {
- List<String> allTreeNodeId = getRecursiveTreeNodeId(securityToken, transaction, treeNodeId);
- WikittyEvent result = delete(securityToken, transaction, allTreeNodeId);
- return result;
- }
-
- /**
* Get recursive id of tree node children of {@code treeNodeId}.
*
* @param securityToken security token
@@ -875,17 +879,16 @@
* @param treeNodeId tree node id
* @return all id of {@code treeNodeId}'s children
*/
- protected List<String> getRecursiveTreeNodeId(String securityToken, WikittyTransaction transaction, String treeNodeId) {
-
+ protected List<String> getRecursiveTreeNodeId(String securityToken, String treeNodeId) {
Search search = Search.query();
search = search.eq(WikittyTreeNode.FQ_FIELD_WIKITTYTREENODE_PARENT, treeNodeId);
Criteria criteria = search.criteria();
- PagedResult<String> childTreeNodeIds = findAllByCriteria(securityToken, transaction, criteria);
+ PagedResult<String> childTreeNodeIds = findAllByCriteria(securityToken, criteria);
List<String> treeNodeIds = new ArrayList<String>();
treeNodeIds.add(treeNodeId);
for (String childTreeNodeId : childTreeNodeIds.getAll()) {
- List<String> subTreeNodeIds = getRecursiveTreeNodeId(securityToken, transaction, childTreeNodeId);
+ List<String> subTreeNodeIds = getRecursiveTreeNodeId(securityToken, childTreeNodeId);
treeNodeIds.addAll(subTreeNodeIds);
}
return treeNodeIds;
@@ -894,13 +897,19 @@
@Override
public Map.Entry<WikittyTreeNode, Integer> restoreNode(String securityToken,
String wikittyId, Criteria filter) {
- WikittyTransaction transaction = new WikittyTransaction();
+ WikittyTransaction tx = WikittyTransaction.get();
+ boolean txBeginHere = false;
try {
- transaction.begin();
+ if (!tx.isStarted()) {
+ tx.begin();
+ txBeginHere = true;
+ }
- Wikitty w = restore(securityToken, transaction, wikittyId);
+ Wikitty w = restore(securityToken, wikittyId);
if(w == null) {
- transaction.commit();
+ if (txBeginHere) {
+ tx.commit();
+ }
return null;
}
@@ -911,15 +920,24 @@
}
WikittyTreeNode node = new WikittyTreeNodeImpl(w);
- Integer count = getSearchEngin().findNodeCount(transaction, w, filter);
+ Integer count = getSearchEngin().findNodeCount(tx, w, filter);
HashMap.SimpleEntry<WikittyTreeNode, Integer> result =
new SimpleEntry<WikittyTreeNode, Integer>(node, count);
- transaction.commit();
+ if (txBeginHere) {
+ tx.commit();
+ }
return result;
+ } catch (WikittyException ex) {
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
+ }
+ throw ex;
} catch (Exception eee) {
- transaction.rollback();
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
+ }
throw new WikittyException("Can't restore node", eee);
}
}
@@ -927,13 +945,19 @@
@Override
public Map<WikittyTreeNode, Integer> restoreChildren(String securityToken,
String wikittyId, Criteria filter) {
- WikittyTransaction transaction = new WikittyTransaction();
+ WikittyTransaction tx = WikittyTransaction.get();
+ boolean txBeginHere = false;
try {
- transaction.begin();
+ if (!tx.isStarted()) {
+ tx.begin();
+ txBeginHere = true;
+ }
- Wikitty w = restore(securityToken, transaction, wikittyId);
+ Wikitty w = restore(securityToken, wikittyId);
if(w == null) {
- transaction.commit();
+ if (txBeginHere) {
+ tx.commit();
+ }
return null;
}
@@ -946,22 +970,31 @@
Map<WikittyTreeNode, Integer> result = new LinkedHashMap<WikittyTreeNode, Integer>();
Map<String, Integer> search = getSearchEngin().findAllChildrenCount(
- transaction, w, filter);
+ tx, w, filter);
Set<Entry<String, Integer>> children = search.entrySet();
for (Entry<String, Integer> child : children) {
Integer count = child.getValue();
String id = child.getKey();
- Wikitty wikitty = restore(securityToken, transaction, id);
+ Wikitty wikitty = restore(securityToken, id);
WikittyTreeNode node = new WikittyTreeNodeImpl(wikitty);
result.put(node, count);
}
- transaction.commit();
+ if (txBeginHere) {
+ tx.commit();
+ }
return result;
+ } catch (WikittyException ex) {
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
+ }
+ throw ex;
} catch (Exception eee) {
- transaction.rollback();
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
+ }
throw new WikittyException("Can't restore children", eee);
}
}
@@ -972,25 +1005,42 @@
throw new UnsupportedOperationException("Not supported yet.");
}
+ /**
+ * This method do some commit during execution. Transaction must be not
+ * started when we call it.
+ * @param securityToken
+ */
@Override
public void syncEngin(final String securityToken) {
- final WikittyTransaction transaction = new WikittyTransaction();
+ final WikittyTransaction tx = WikittyTransaction.get();
+ if (tx.isStarted()) {
+ throw new WikittyException("Transaction must be not started for syncEngin method");
+ }
+
+ boolean txBeginHere = false;
try {
final int numberForCommit = 1000;
final WikittySearchEngin searchEngin = getSearchEngin();
final List<Wikitty> wikitties = new ArrayList<Wikitty>(numberForCommit);
- transaction.begin();
- searchEngin.clear(transaction);
- transaction.commit();
- transaction.begin();
-
- getWikittyStorage().scanWikitties(transaction, new WikittyStorage.Scanner() {
+ if (!tx.isStarted()) {
+ tx.begin();
+ txBeginHere = true;
+ }
+ searchEngin.clear(tx);
+ if (txBeginHere) {
+ tx.commit();
+ }
+ if (!tx.isStarted()) {
+ tx.begin();
+ txBeginHere = true;
+ }
+ getWikittyStorage().scanWikitties(tx, new WikittyStorage.Scanner() {
int count = 0;
@Override
public void scan(String wikittyId) {
- Wikitty wikitty = restore(securityToken, transaction, wikittyId);
+ Wikitty wikitty = restore(securityToken, wikittyId);
Date deleteDate = wikitty.getDeleteDate();
if(deleteDate == null) {
count ++;
@@ -998,22 +1048,31 @@
if(count == numberForCommit) {
// Reindex
- searchEngin.store(transaction, wikitties);
- transaction.commit();
+ searchEngin.store(tx, wikitties);
+ tx.commit();
// Reinit
count = 0;
wikitties.clear();
- transaction.begin();
+ tx.begin();
}
}
}
});
// Last wikitties
- searchEngin.store(transaction, wikitties);
- transaction.commit();
+ searchEngin.store(tx, wikitties);
+ if (txBeginHere) {
+ tx.commit();
+ }
+ } catch (WikittyException ex) {
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
+ }
+ throw ex;
} catch (Exception eee) {
- transaction.rollback();
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
+ }
throw new WikittyException("Can't sync searchable index with data", eee);
}
}
@@ -1084,35 +1143,48 @@
}
}
- WikittyTransaction tx = new WikittyTransaction();
+ WikittyTransaction tx = WikittyTransaction.get();
+ boolean txBeginHere = false;
try {
- tx.begin();
+ if (!tx.isStarted()) {
+ tx.begin();
+ txBeginHere = true;
+ }
WikittyEvent result = new WikittyEvent(this);
if (mustClear) {
- WikittyEvent eventClear = clear(securityToken, tx);
+ WikittyEvent eventClear = clear(securityToken);
result.add(eventClear);
}
WikittyEvent eventStoreExtension =
- storeExtension(securityToken, tx, toAddExt);
+ storeExtension(securityToken, toAddExt);
result.add(eventStoreExtension);
WikittyEvent eventDeleteExtension =
- deleteExtension(securityToken, tx, toDeleteExt);
+ deleteExtension(securityToken, toDeleteExt);
result.add(eventDeleteExtension);
WikittyEvent eventStoreWikitty =
- store(securityToken, tx, toAddWikitty.values(), force);
+ store(securityToken, toAddWikitty.values(), force);
result.add(eventStoreWikitty);
WikittyEvent eventDeleteWikitty =
- delete(securityToken, tx, toRemoveWikitty.keySet());
+ delete(securityToken, toRemoveWikitty.keySet());
result.add(eventDeleteWikitty);
- tx.commit();
+ if(txBeginHere) {
+ tx.commit();
+ }
return result;
+ } catch (WikittyException ex) {
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
+ }
+ throw ex;
} catch (Exception eee) {
- tx.rollback();
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
+ }
throw new WikittyException("Can't replay data", eee);
}
@@ -1120,28 +1192,57 @@
@Override
public boolean exists(String securityToken, String wikittyId) {
- WikittyTransaction tx = new WikittyTransaction();
+ WikittyTransaction tx = WikittyTransaction.get();
+ boolean txBeginHere = false;
try {
- tx.begin();
+ if (!tx.isStarted()) {
+ tx.begin();
+ txBeginHere = true;
+ }
+
boolean result = getWikittyStorage().exists(null, wikittyId);
- tx.commit();
+
+ if (txBeginHere) {
+ tx.commit();
+ }
return result;
+ } catch (WikittyException ex) {
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
+ }
+ throw ex;
} catch (Exception eee) {
- tx.rollback();
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
+ }
throw new WikittyException("Can't test existance", eee);
}
}
@Override
public boolean isDeleted(String securityToken, String wikittyId) {
- WikittyTransaction tx = new WikittyTransaction();
+ WikittyTransaction tx = WikittyTransaction.get();
+ boolean txBeginHere = false;
try {
- tx.begin();
+ if (!tx.isStarted()) {
+ tx.begin();
+ txBeginHere = true;
+ }
+
boolean result = getWikittyStorage().isDeleted(tx, wikittyId);
- tx.commit();
+ if (txBeginHere) {
+ tx.commit();
+ }
return result;
+ } catch (WikittyException ex) {
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
+ }
+ throw ex;
} catch (Exception eee) {
- tx.rollback();
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
+ }
throw new WikittyException("Can't test existance", eee);
}
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyTransaction.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyTransaction.java 2010-12-01 14:37:43 UTC (rev 547)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyTransaction.java 2010-12-01 15:32:39 UTC (rev 548)
@@ -35,6 +35,8 @@
/***
* Manage JTA transaction. You can store some information during execution.
+ * Each thread have only one transaction. To get current transaction use
+ * {@link WikittyTransaction#get()} method
*/
public class WikittyTransaction {
@@ -44,10 +46,31 @@
/** permet d'attacher n'importe quoi a une transaction */
protected Map<Object, Object> tagValues;
- public WikittyTransaction() {
+ /** if true begin has been called for this transaction */
+ protected boolean started = false;
+
+ private static ThreadLocal<WikittyTransaction> wikittyTransaction =
+ new ThreadLocal<WikittyTransaction>() {
+ @Override
+ protected synchronized WikittyTransaction initialValue() {
+ return new WikittyTransaction();
+ }
+ };
+
+ private WikittyTransaction() {
tagValues = new HashMap<Object, Object>();
}
+ /**
+ * return current transaction used by current thread. If no transaction
+ * existe, create new one.
+ * YOU MUST COMMIT OR ROLLBACK TRANSACTION AFTER USE
+ * @return
+ */
+ static public WikittyTransaction get() {
+ return wikittyTransaction.get();
+ }
+
public Object getTagValue(Object tag) {
return tagValues.get(tag);
}
@@ -56,6 +79,14 @@
tagValues.put(tag, value);
}
+ public boolean isStarted() {
+ return started;
+ }
+
+ protected void setStarted(boolean started) {
+ this.started = started;
+ }
+
public UserTransaction getUserTransaction() {
return com.arjuna.ats.jta.UserTransaction.userTransaction();
}
@@ -65,6 +96,9 @@
}
public void begin() {
+ if (isStarted()) {
+ throw new WikittyException("Transaction is already started");
+ }
UserTransaction userTransaction = getUserTransaction();
try {
if (log.isDebugEnabled()) {
@@ -72,6 +106,7 @@
}
userTransaction.setTransactionTimeout(3600); // FIXME: jru 20100115 error in service if call during lot of times
userTransaction.begin();
+ setStarted(true);
} catch (Exception eee) {
throw new WikittyException("Error on begin JTA transaction", eee);
}
@@ -84,6 +119,7 @@
log.debug("Commit transaction");
}
userTransaction.commit();
+ setStarted(false);
} catch (Exception eee) {
throw new WikittyException("Error on commit JTA transaction", eee);
}
@@ -99,8 +135,10 @@
}
userTransaction.rollback();
}
+ setStarted(false);
} catch (Exception eee) {
throw new WikittyException("Error on roolback JTA transaction", eee);
}
}
+
}
1
0
r547 - in trunk: wikitty-dto/src/main/java/org/nuiton/wikitty/dto wikitty-generators/src/main/java/org/nuiton/wikitty/generator
by jcouteau@users.nuiton.org 01 Dec '10
by jcouteau@users.nuiton.org 01 Dec '10
01 Dec '10
Author: jcouteau
Date: 2010-12-01 15:37:43 +0100 (Wed, 01 Dec 2010)
New Revision: 547
Url: http://nuiton.org/repositories/revision/wikitty/547
Log:
Prevent NPE on copyFrom method on DTOs
Modified:
trunk/wikitty-dto/src/main/java/org/nuiton/wikitty/dto/DTOHelper.java
trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyDTOGenerator.java
Modified: trunk/wikitty-dto/src/main/java/org/nuiton/wikitty/dto/DTOHelper.java
===================================================================
--- trunk/wikitty-dto/src/main/java/org/nuiton/wikitty/dto/DTOHelper.java 2010-11-30 17:22:39 UTC (rev 546)
+++ trunk/wikitty-dto/src/main/java/org/nuiton/wikitty/dto/DTOHelper.java 2010-12-01 14:37:43 UTC (rev 547)
@@ -55,7 +55,7 @@
public static <E extends BusinessEntity> E fromDto(WikittyProxy proxy, Class<E> clazz, E dto) {
- E result = (E)proxy.restore(clazz, dto.getWikittyId());
+ E result = proxy.restore(clazz, dto.getWikittyId());
result.copyFrom(dto);
return result;
Modified: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyDTOGenerator.java
===================================================================
--- trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyDTOGenerator.java 2010-11-30 17:22:39 UTC (rev 546)
+++ trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyDTOGenerator.java 2010-12-01 14:37:43 UTC (rev 547)
@@ -616,11 +616,14 @@
String attributeType = WikittyTransformerUtil.generateResultType(attribute, false);
String attributeName = attribute.getName();
String attributeTypeInSetImpl = null;
+ String attributeTypeInSet = null;
String collectionType = WikittyTransformerUtil.getCollectionTypeName(attribute);
if (Set.class.getSimpleName().equals(collectionType)) {
+ attributeTypeInSet = "Set<String>";
attributeTypeInSetImpl = "HashSet<String>";
}
if (List.class.getSimpleName().equals(collectionType)) {
+ attributeTypeInSet = "List<String>";
attributeTypeInSetImpl = "ArrayList<String>";
}
@@ -634,7 +637,10 @@
if (WikittyTransformerUtil.isAttributeCollection(attribute)) {
methodBody += ""
/*{
- set<%=capitalizedAttributeName%>(new <%=attributeTypeInSetImpl%>(sourceCopy.get<%=capitalizedAttributeName%>()));
+ <%=attributeTypeInSet%> <%=attributeName%> = sourceCopy.get<%=capitalizedAttributeName%>();
+ if (<%=attributeName%> != null){
+ set<%=capitalizedAttributeName%>(new <%=attributeTypeInSetImpl%>(<%=attributeName%>));
+ }
}*/;
} else {
methodBody += ""
1
0