Author: bpoussin Date: 2010-05-28 15:06:15 +0200 (Fri, 28 May 2010) New Revision: 59 Url: http://nuiton.org/repositories/revision/wikitty/59 Log: grosse modification dans wikitty - debut implantation du cache - creation d'un service d'import export pour l'extraire de wikittyService - ajout de certaine methode avec transation dans l'interface wikittyService - creation du package importexport pour toutes les classes relatives - ajout de @deprecated sur certaine classe (bean) Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyCache.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyImportExportService.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceCached.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceImpl.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/importexport/ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/importexport/ExportTask.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/importexport/ImportExportCSV.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/importexport/ImportExportMethod.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/importexport/ImportExportXML.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/importexport/ImportTask.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/importexport/JobState.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/importexport/WikittyBatchUpdate.java Removed: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/AbstractWikittyService.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/JobState.java Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/BusinessEntity.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/BusinessEntityBean.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyDAO.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyExtensionMigration.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyExtensionMigrationRename.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/WikittyServiceInMemory.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyTransaction.java trunk/wikitty-api/src/test/java/org/nuiton/wikitty/test/api/WikittyUtilTest.java trunk/wikitty-api/src/test/java/org/nuiton/wikitty/test/conform/ImportExportTest.java trunk/wikitty-hbase-impl/src/main/java/org/nuiton/wikitty/hbase/WikittyServiceHBase.java trunk/wikitty-jdbc-impl/src/main/java/org/nuiton/wikitty/jdbc/WikittyServiceJDBC.java trunk/wikitty-multistorage-impl/src/main/java/org/nuiton/wikitty/multistorage/WikittyServiceMultiStorage.java Deleted: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/AbstractWikittyService.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/AbstractWikittyService.java 2010-05-20 09:43:56 UTC (rev 58) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/AbstractWikittyService.java 2010-05-28 13:06:15 UTC (rev 59) @@ -1,1233 +0,0 @@ -/* *##% - * Copyright (c) 2009 poussin. All rights reserved. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - *##%*/ - -package org.nuiton.wikitty; - -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.Reader; -import java.io.StringReader; -import java.io.StringWriter; -import java.io.Writer; -import java.net.URL; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; -import java.util.AbstractMap.SimpleEntry; -import java.util.Map.Entry; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; -import java.util.concurrent.FutureTask; - -import org.apache.commons.lang.StringEscapeUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.nuiton.wikitty.search.Search; -import org.nuiton.wikitty.LabelImpl; -import org.nuiton.wikitty.TreeNode; -import org.nuiton.wikitty.TreeNodeBean; -import org.nuiton.wikitty.TreeNodeImpl; -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlPullParserFactory; - -/** - * Abstract class that new implementation must extends. - * New implementation only have three method to implement: - * <li>getSearchEngin - * <li>getExtensionStorage - * <li>getWikittyStorage - * - * @author poussin - * @version $Revision$ - * - * Last update: $Date$ - * by : $Author$ - */ -public abstract class AbstractWikittyService implements WikittyService { - - /** to use log facility, just put in your code: log.info(\"...\"); */ - static private Log log = LogFactory.getLog(AbstractWikittyService.class); - - // FIXME poussin 20090902 next 3 variables must be read from configuration file - /** number of thread used to import/export task */ - protected int MAX_IMPORT_EXPORT_THREAD = 1; - /** directory path where export asynchronous file are stored */ - protected String EXPORT_DIRECTORY = "/tmp/"; - /** url used by client to retrieve export file when job is ended */ - protected String EXPORT_URL = "file:///tmp/"; - - /** Executor that do import export task */ - protected ExecutorService importExportExecutor = - // TODO poussin 20090902 do thread number configurable - Executors.newFixedThreadPool(MAX_IMPORT_EXPORT_THREAD); - /** contains all import or export task, key is job id send to client */ - protected Map<String, Future<String>> importExportTask = - new HashMap<String, Future<String>>(); - - /** Default migration use to migrate a wikitty in last extension version */ - protected WikittyExtensionMigration defaultExtensionMigration = - new WikittyExtensionMigrationRename(); - - abstract protected WikittySearchEngin getSearchEngin(); - abstract protected WikittyExtensionStorage getExtensionStorage(); - abstract protected WikittyStorage getWikittyStorage(); - - protected UpdateResponse store(WikittyTransaction transaction, - Collection<Wikitty> wikitties, boolean disableAutoVersionIncrement) { - // update/store extension if necessary - Set<WikittyExtension> allExtensions = new HashSet<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, disableAutoVersionIncrement); - 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; - } - - /** - * Store and index wikitty object - * @param wikitty - */ - @Override - public UpdateResponse store(Wikitty wikitty) { - if (wikitty != null) { - WikittyTransaction transaction = new WikittyTransaction(); - try { - transaction.begin(); - - List<Wikitty> wikitties = Arrays.asList(wikitty); - UpdateResponse result = store(transaction, wikitties, false); - - transaction.commit(); - return result; - } catch (Exception eee) { - transaction.rollback(); - throw new WikittyException(eee); - } - } else { - throw new WikittyException("You can't store null wikitty object"); - } - } - - /** - * Store and index wikitties object - * @param wikitty - */ - @Override - public UpdateResponse store(Collection<Wikitty> wikitties) { - WikittyTransaction transaction = new WikittyTransaction(); - try { - transaction.begin(); - - UpdateResponse result = store(transaction, wikitties, false); - - transaction.commit(); - return result; - } catch (Exception eee) { - transaction.rollback(); - throw new WikittyException(eee); - } - } - - /** - * Store and index wikitties object - * @param wikitty - */ - @Override - public UpdateResponse store(Collection<Wikitty> wikitties, boolean disableAutoVersionIncrement) { - WikittyTransaction transaction = new WikittyTransaction(); - try { - transaction.begin(); - - UpdateResponse result = store(transaction, wikitties, disableAutoVersionIncrement); - - transaction.commit(); - return result; - } catch (Exception eee) { - transaction.rollback(); - throw new WikittyException(eee); - } - } - - @Override - public List<String> getAllExtensionIds() { - WikittyTransaction transaction = new WikittyTransaction(); - try { - transaction.begin(); - - List<String> result = getExtensionStorage().getAllExtensionIds(transaction); - - transaction.commit(); - return result; - } catch (Exception eee) { - transaction.rollback(); - throw new WikittyException(eee); - } - } - - @Override - public List<String> getAllExtensionsRequires(String extensionName) { - WikittyTransaction transaction = new WikittyTransaction(); - try { - transaction.begin(); - - List<String> result = getExtensionStorage() - .getAllExtensionsRequires(transaction, extensionName); - - transaction.commit(); - return result; - } catch (Exception eee) { - transaction.rollback(); - throw new WikittyException(eee); - } - } - - protected UpdateResponse storeExtension(WikittyTransaction transaction, Collection<WikittyExtension> exts) { - UpdateResponse result = getExtensionStorage().store(transaction, exts); - return result; - } - - /** - * Save just one extension - * @param ext - * @throws java.io.IOException - */ - @Override - public UpdateResponse storeExtension(Collection<WikittyExtension> exts) { - WikittyTransaction transaction = new WikittyTransaction(); - try { - transaction.begin(); - - UpdateResponse result = storeExtension(transaction, exts); - - transaction.commit(); - return result; - } catch (Exception eee) { - transaction.rollback(); - throw new WikittyException(eee); - } - } - - @Override - public UpdateResponse storeExtension(WikittyExtension ext) { - WikittyTransaction transaction = new WikittyTransaction(); - try { - transaction.begin(); - - UpdateResponse result = storeExtension(transaction, Arrays.asList(ext)); - - transaction.commit(); - return result; - } catch (Exception eee) { - transaction.rollback(); - throw new WikittyException(eee); - } - } - - protected WikittyExtension restoreExtension(WikittyTransaction transaction, String id) { - //split the id to ensure that version is normalized - String name = WikittyExtension.computeName(id); - String version = WikittyExtension.computeVersion(id); - - WikittyExtension result = getExtensionStorage().restore(transaction, name, version); - return result; - } - /** - * Load extension from id. Id is 'name[version]' - * @param id - * @return - */ - @Override - public WikittyExtension restoreExtension(String id) { - WikittyTransaction transaction = new WikittyTransaction(); - try { - transaction.begin(); - - WikittyExtension result = restoreExtension(transaction, id); - - transaction.commit(); - return result; - } catch (Exception eee) { - transaction.rollback(); - throw new WikittyException(eee); - } - - } - - protected WikittyExtension restoreExtensionLastVersion(WikittyTransaction transaction, String name) { - String version = getExtensionStorage().getLastVersion(transaction, name); - if(version == null) { - return null; - } - - WikittyExtension result = getExtensionStorage().restore(transaction, name, version); - return result; - } - - @Override - public WikittyExtension restoreExtensionLastVersion(String name) { - WikittyTransaction transaction = new WikittyTransaction(); - try { - transaction.begin(); - - WikittyExtension result = restoreExtensionLastVersion(transaction, name); - - transaction.commit(); - return result; - } catch (Exception eee) { - transaction.rollback(); - throw new WikittyException(eee); - } - } - - protected Wikitty restore(WikittyTransaction transaction, String id) { - if (!getWikittyStorage().exists(transaction, id)) { - // object doesn't exist, we return null - return null; - } - - if (getWikittyStorage().isDeleted(transaction, id)) { - // object deleted, we return null - return null; - } - Wikitty result = getWikittyStorage().restore(transaction, id); - if(result != null) { - result = upgradeData(transaction, result); - } - return result; - } - - protected List<Wikitty> restore(WikittyTransaction transaction, List<String> ids) { - List<Wikitty> result = new ArrayList<Wikitty>(); - for(String id : ids) { - Wikitty w = restore(transaction, id); - if (w != null) { - result.add(w); - } - } - return result; - } - - @Override - public List<Wikitty> restore(List<String> ids) { - WikittyTransaction transaction = new WikittyTransaction(); - try { - transaction.begin(); - - List<Wikitty> result = restore(transaction, ids); - - transaction.commit(); - return result; - } catch (Exception eee) { - transaction.rollback(); - throw new WikittyException(eee); - } - } - - @Override - public Wikitty restore(String id) { - WikittyTransaction transaction = new WikittyTransaction(); - try { - transaction.begin(); - - Wikitty result = restore(transaction, id); - - transaction.commit(); - return result; - } catch (Exception eee) { - transaction.rollback(); - throw new WikittyException(eee); - } - } - - protected Wikitty upgradeData(WikittyTransaction transaction, Wikitty wikitty) { - Wikitty result = wikitty; - - Collection<WikittyExtension> extensions = wikitty.getExtensions(); - for (WikittyExtension extension : extensions) { - String extensionName = extension.getName(); - log.debug("extensionName=" + extensionName); - - WikittyExtension currentExtension = extension; - String currentExtensionVersion = currentExtension.getVersion(); - - WikittyExtension lastExtension = restoreExtensionLastVersion(transaction, extensionName); - String lastExtensionVersion = lastExtension.getVersion(); - log.debug("lastExtensionVersion=" + lastExtensionVersion); - - WikittyExtensionMigration migration = WikittyExtensionMigration.migrationRegistry.get(extensionName); - if (migration == null) { - migration = defaultExtensionMigration; - } - - // Loop on between extension in wikitty and last version - while(WikittyUtil.versionGreaterThan(lastExtensionVersion, currentExtensionVersion)) { - - // Get extension after the current version - String nextExtensionVersion = WikittyUtil.incrementMajorRevision(currentExtensionVersion); - String nextExtensionId = WikittyExtension.computeId(extensionName, nextExtensionVersion); - WikittyExtension nextExtension = restoreExtension(transaction, nextExtensionId); - - log.debug("currentExtensionVersion=" + currentExtensionVersion); - log.debug("nextExtensionVersion=" + nextExtensionVersion); - - // Test if extension is never use in this version - if(nextExtension != null) { - result = migration.migrate(this, transaction, result, currentExtension, nextExtension); - currentExtension = nextExtension; - } - - // Follow - currentExtensionVersion = nextExtensionVersion; - } - } - - return result; - } - - protected void delete(WikittyTransaction transaction, Collection<String> ids) throws WikittyException { - // work only on valid id - Collection<Wikitty> storedWikitties = new ArrayList<Wikitty>(); - List<String> idList = new LinkedList<String>(ids); - for (Iterator<String> i = idList.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(); - } - if (getWikittyStorage().isDeleted(transaction, id)) { - // already deleted, remove this id in id list - i.remove(); - } - - // Store node with have deleted node as parent - Criteria criteria = Search.query().eq(TreeNode.FQ_FIELD_PARENT, id).criteria(); - List<Wikitty> wikittyNodes = findAllByCriteria(transaction, criteria).getAll(); - for (Wikitty wikittyNode : wikittyNodes) { - String wikittyNodeId = wikittyNode.getId(); - if(!ids.contains(wikittyNodeId)) { - TreeNode treeNode = new TreeNodeImpl(wikittyNode); - treeNode.setParent(null); - storedWikitties.add(wikittyNode); - } - } - - // Store node with have deleted child - criteria = Search.query().eq(TreeNode.FQ_FIELD_CHILDREN, id).criteria(); - wikittyNodes = findAllByCriteria(transaction, criteria).getAll(); - for (Wikitty wikittyNode : wikittyNodes) { - String wikittyNodeId = wikittyNode.getId(); - if(!ids.contains(wikittyNodeId)) { - TreeNode treeNode = new TreeNodeImpl(wikittyNode); - treeNode.removeChildren(id); - storedWikitties.add(wikittyNode); - } - } - } - - getWikittyStorage().delete(transaction, ids); - getSearchEngin().delete(transaction, ids); - - store(transaction, storedWikitties, false); - } - - @Override - public void delete(String id) { - WikittyTransaction transaction = new WikittyTransaction(); - try { - transaction.begin(); - - List<String> ids = Arrays.asList(id); - delete(transaction, ids); - - transaction.commit(); - } catch (Exception eee) { - transaction.rollback(); - throw new WikittyException(eee); - } - } - - @Override - public void delete(Collection<String> ids){ - WikittyTransaction transaction = new WikittyTransaction(); - try { - transaction.begin(); - - delete(transaction, ids); - - transaction.commit(); - } catch (Exception eee) { - transaction.rollback(); - throw new WikittyException(eee); - } - } - - /** - * Use with caution : It will delete ALL indexes from search engine ! - * This operation should be disabled in production environment. - */ - @Override - public void clear() { - WikittyTransaction transaction = new WikittyTransaction(); - try { - transaction.begin(); - - getSearchEngin().clear(transaction); - getWikittyStorage().clear(transaction); - getExtensionStorage().clear(transaction); - - transaction.commit(); - } catch (Exception eee) { - transaction.rollback(); - throw new WikittyException(eee); - } - } - - /** - * Assume that this PagedResult contains wikitty id as result and - * return new PagedResult with Wikitty instance - */ - protected PagedResult<Wikitty> findAllByCriteria(WikittyTransaction transaction, Criteria criteria) { - PagedResult<String> resultIds = getSearchEngin().findAllByCriteria(transaction, criteria); - List<String> ids = resultIds.getAll(); - List<Wikitty> wikitties = restore(transaction, ids); - PagedResult<Wikitty> result = new PagedResult<Wikitty>( - resultIds.getFirstIndice(), - resultIds.getNumFound(), - resultIds.getQueryString(), - resultIds.getFacets(), - wikitties); - return result; - } - - @Override - public PagedResult<Wikitty> findAllByCriteria(Criteria criteria) { - WikittyTransaction transaction = new WikittyTransaction(); - try { - transaction.begin(); - - PagedResult<Wikitty> result = findAllByCriteria(transaction, criteria); - - transaction.commit(); - return result; - } catch (Exception eee) { - transaction.rollback(); - throw new WikittyException(eee); - } - } - - protected Wikitty findByCriteria(WikittyTransaction transaction, Criteria criteria) { - criteria.setFirstIndex(0).setEndIndex(1); - PagedResult<Wikitty> pages = findAllByCriteria(transaction, criteria); - - Wikitty result = null; - if (pages.size() > 0) { - result = pages.getFirst(); - } - - return result; - } - - @Override - public Wikitty findByCriteria(Criteria criteria) { - WikittyTransaction transaction = new WikittyTransaction(); - try { - transaction.begin(); - - Wikitty result = findByCriteria(transaction, criteria); - - transaction.commit(); - return result; - } catch (Exception eee) { - transaction.rollback(); - throw new WikittyException(eee); - } - } - - @Override - public void addLabel(String wikittyId, String label) { - WikittyTransaction transaction = new WikittyTransaction(); - try { - transaction.begin(); - - Wikitty w = restore(transaction, wikittyId); - w.addExtension(LabelImpl.extensions); - LabelImpl l = new LabelImpl(w); - l.addLabels(label); - store(transaction, Arrays.asList(w), false); - - transaction.commit(); - } catch (Exception eee) { - transaction.rollback(); - throw new WikittyException(eee); - } - } - - - @Override - public PagedResult<Wikitty> findAllByLabel(String label, int firstIndex, int endIndex) { - WikittyTransaction transaction = new WikittyTransaction(); - try { - transaction.begin(); - - LabelImpl l = new LabelImpl(); - l.addLabels(label); - Criteria criteria = Search.query(l.getWikitty()).criteria() - .setFirstIndex(firstIndex).setEndIndex(endIndex); - PagedResult<Wikitty> result = findAllByCriteria(transaction, criteria); - - transaction.commit(); - return result; - } catch (Exception eee) { - transaction.rollback(); - throw new WikittyException(eee); - } - } - - - @Override - public Wikitty findByLabel(String label) { - WikittyTransaction transaction = new WikittyTransaction(); - try { - transaction.begin(); - - LabelImpl l = new LabelImpl(); - l.addLabels(label); - Criteria criteria = Search.query(l.getWikitty()).criteria(); - Wikitty result = findByCriteria(transaction, criteria); - - transaction.commit(); - return result; - } catch (Exception eee) { - transaction.rollback(); - throw new WikittyException(eee); - } - } - - - @Override - public Set<String> findAllAppliedLabels(String wikittyId) { - WikittyTransaction transaction = new WikittyTransaction(); - try { - transaction.begin(); - - Wikitty w = restore(transaction, wikittyId); - LabelImpl l = new LabelImpl(w); - Set<String> result = l.getLabels(); - - transaction.commit(); - return result; - } catch (Exception eee) { - transaction.rollback(); - throw new WikittyException(eee); - } - } - - - protected Tree restoreTree(WikittyTransaction transaction, String wikittyId) { - Wikitty w = restore(transaction, wikittyId); - if(w == null) { - return null; - } - - if ( !w.hasExtension(TreeNode.EXT_TREENODE) ) { - throw new WikittyException(String.format( - "Wikitty '%s' do not handle extension %s", - wikittyId, TreeNode.EXT_TREENODE )); - } - Tree tree = new Tree(); - TreeNode node = AbstractWikittyService.toBean(new TreeNodeImpl(w)); - tree.setNode(node); - - TreeNodeImpl exempleNode = new TreeNodeImpl(); - exempleNode.setParent(wikittyId); - - Criteria criteria = Search.query(exempleNode.getWikitty()).criteria() - .setFirstIndex(0).setEndIndex(Criteria.ALL_ELEMENTS); - PagedResult<Wikitty> childNodes = findAllByCriteria(transaction, criteria); - for( Wikitty childNode : childNodes.getAll() ) { - tree.addChild(restoreTree(transaction, childNode.getId())); - } - - return tree; - } - - @Override - public Tree restoreTree(String wikittyId) { - WikittyTransaction transaction = new WikittyTransaction(); - try { - transaction.begin(); - - Tree tree = restoreTree(transaction, wikittyId); - - transaction.commit(); - return tree; - } catch (Exception eee) { - transaction.rollback(); - throw new WikittyException(eee); - } - } - - @Override - public Map.Entry<TreeNode, Integer> restoreNode(String wikittyId, Criteria filter) { - WikittyTransaction transaction = new WikittyTransaction(); - try { - transaction.begin(); - - Wikitty w = restore(transaction, wikittyId); - if(w == null) { - transaction.commit(); - return null; - } - - if ( !w.hasExtension(TreeNode.EXT_TREENODE) ) { - throw new WikittyException(String.format( - "Wikitty '%s' do not handle extension %s", - wikittyId, TreeNode.EXT_TREENODE )); - } - - TreeNode node = AbstractWikittyService.toBean(new TreeNodeImpl(w)); - Integer count = getSearchEngin().findNodeCount(transaction, w, filter); - - HashMap.SimpleEntry<TreeNode, Integer> result = - new SimpleEntry<TreeNode, Integer>(node, count); - - transaction.commit(); - return result; - } catch (Exception eee) { - transaction.rollback(); - throw new WikittyException(eee); - } - } - - @Override - public Map<TreeNode, Integer> restoreChildren(String wikittyId, Criteria filter) { - WikittyTransaction transaction = new WikittyTransaction(); - try { - transaction.begin(); - - Wikitty w = restore(transaction, wikittyId); - if(w == null) { - transaction.commit(); - return null; - } - - if ( !w.hasExtension(TreeNode.EXT_TREENODE) ) { - throw new WikittyException(String.format( - "Wikitty '%s' do not handle extension %s", - wikittyId, TreeNode.EXT_TREENODE )); - } - - Map<TreeNode, Integer> result = new LinkedHashMap<TreeNode, Integer>(); - - Map<String, Integer> search = getSearchEngin().findAllChildrenCount(transaction, 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(transaction, id); - TreeNode node = AbstractWikittyService.toBean(new TreeNodeImpl(wikitty)); - - result.put(node, count); - } - - transaction.commit(); - return result; - } catch (Exception eee) { - transaction.rollback(); - throw new WikittyException(eee); - } - } - - @Override - public Wikitty restoreVersion(String wikittyId, String version) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public UpdateResponse syncEngin() { - final WikittyTransaction transaction = new WikittyTransaction(); - try { - final int numberForCommit = 1000; - final WikittySearchEngin searchEngin = getSearchEngin(); - final UpdateResponse result = new UpdateResponse(); - final List<Wikitty> wikitties = new ArrayList<Wikitty>(numberForCommit); - - transaction.begin(); - searchEngin.clear(transaction); - transaction.commit(); - transaction.begin(); - - getWikittyStorage().scanWikitties(transaction, new WikittyStorage.Scanner() { - int count = 0; - - @Override - public void scan(Wikitty wikitty) { - Date deleteDate = wikitty.getDeleteDate(); - if(deleteDate == null) { - count ++; - wikitties.add(wikitty); - - if(count == numberForCommit) { - // Reindex - UpdateResponse response = searchEngin.store(transaction, wikitties); - result.add(response); - transaction.commit(); - // Reinit - count = 0; - wikitties.clear(); - transaction.begin(); - } - } - } - }); - - // Last wikitties - UpdateResponse response = searchEngin.store(transaction, wikitties); - result.add(response); - - transaction.commit(); - return result; - } catch (Exception eee) { - transaction.rollback(); - throw new WikittyException(eee); - } - } - - /** - * Class used for import process, this class retain numberForCommit object - * before to send it to storage. - */ - static protected class WikittyBatchUpdate { - // TODO poussin 20090902 do configurable numberForCommit - protected int numberForCommit = 1000; - protected int currentAdded = 0; - protected Map<String, WikittyExtension> exts = new HashMap<String, WikittyExtension>(); - protected List<Wikitty> wikitties = new LinkedList<Wikitty>(); - - protected AbstractWikittyService ws; - protected WikittyTransaction transaction; - - public WikittyBatchUpdate(AbstractWikittyService ws, WikittyTransaction transaction) { - this.ws = ws; - this.transaction = transaction; - } - - public void addExtension(WikittyExtension ext) { - exts.put(ext.getId(), ext); - inc(); - } - - public void addWikitty(Wikitty w) { - wikitties.add(w); - inc(); - } - - /** - * search extension in local extension list and if missed restore - * extension from internal WikittyService - * @param id - * @return - */ - public WikittyExtension getExtension(WikittyTransaction transaction, String id) { - WikittyExtension result = exts.get(id); - if (result == null) { - result = ws.restoreExtension(transaction, id); - } - return result; - } - - public void flush() { - ws.storeExtension(transaction, exts.values()); - ws.store(transaction, wikitties, true); - - exts.clear(); - wikitties.clear(); - currentAdded = 0; - } - - protected void inc() { - currentAdded++; - if (currentAdded >= numberForCommit) { - flush(); - } - } - } - - - @Override - public void syncImportFromXml(String xml) { - Reader reader = new StringReader(xml); - ImportTask task = new ImportTask(this, reader); - task.run(); - } - - - @Override - public void syncImportFromUri(String uri) { - try { - URL url = new URL(uri); - Reader reader = new InputStreamReader(url.openStream()); - ImportTask task = new ImportTask(this, reader); - task.run(); - } catch (Exception eee) { - throw new WikittyException(eee); - } - } - - - @Override - public String asyncImportFromUri(String uri) { - try { - URL url = new URL(uri); - Reader reader = new InputStreamReader(url.openStream()); - ImportTask task = new ImportTask(this, reader); - FutureTask<String> future = new FutureTask<String>(task, null); - importExportExecutor.submit(future); - - String jobId = UUID.randomUUID().toString(); - importExportTask.put(jobId, future); - return jobId; - } catch (Exception eee) { - throw new WikittyException(eee); - } - } - - - static public class ImportTask implements Runnable { - protected AbstractWikittyService ws; - protected WikittyTransaction transaction; - protected Reader reader; - - public ImportTask(AbstractWikittyService ws, Reader reader) { - this.ws = ws; - this.reader = reader; - this.transaction = new WikittyTransaction(); - } - - @Override - public void run() { - try { - transaction.begin(); - XmlPullParserFactory factory = XmlPullParserFactory.newInstance( - System.getProperty(XmlPullParserFactory.PROPERTY_NAME), null); - factory.setNamespaceAware(true); - XmlPullParser xpp = factory.newPullParser(); - xpp.setInput(reader); - - WikittyExtension ext = null; - Wikitty w = null; - String CDATA = null; - - WikittyBatchUpdate batchUpdate = new WikittyBatchUpdate(ws, transaction); - - long time = System.currentTimeMillis(); - - int eventType = xpp.getEventType(); - do { - String objectVersion = null; - if (eventType == xpp.START_DOCUMENT) { - log.info("start XML import at " + new Date()); - } else if (eventType == xpp.END_DOCUMENT) { - time = System.currentTimeMillis() - time; - log.info("XML import in (ms)" + time); - } else if (eventType == xpp.START_TAG) { - String name = xpp.getName(); - if ("extension".equals(name)) { - String extName = xpp.getAttributeValue(null, "name"); - String version = xpp.getAttributeValue(null, "version"); - String requires = xpp.getAttributeValue(null, "requires"); - ext = new WikittyExtension(extName, version, requires, new LinkedHashMap<String, FieldType>()); - } else if ("object".equals(name)) { - String id = xpp.getAttributeValue(null, "id"); - objectVersion = xpp.getAttributeValue(null, "version"); - String extensions = xpp.getAttributeValue(null, "extensions"); - w = new Wikitty(id); - String[] extensionList = extensions.split(","); - for (String extId : extensionList) { - String extName = WikittyExtension.computeName(extId); - String extVersion = WikittyExtension.computeVersion(extId); - extId = WikittyExtension.computeId(extName, extVersion); - WikittyExtension e = batchUpdate.getExtension(transaction, extId); - if(e == null) { - throw new WikittyException("Extension not found : " + extId); - } - w.addExtension(e); - } - } - } else if (eventType == xpp.END_TAG) { - String name = xpp.getName(); - if ("extension".equals(name)) { - batchUpdate.addExtension(ext); - ext = null; - } else if ("object".equals(name)) { - w.setVersion(objectVersion); - batchUpdate.addWikitty(w); - w = null; - } else if (ext != null && "field".equals(name)) { - FieldType type = new FieldType(); - String fieldName = WikittyUtil.parseField(CDATA, type); - ext.addField(fieldName, type); - } else if (ext != null && "tagvalues".equals(name)) { - Map<String, String> tagValues = WikittyUtil.tagValuesToMap(CDATA); - ext.setTagValues(tagValues); - } else if (w != null) { - String[] fq = name.split("\\."); - String extensionName = fq[0]; - String fieldName = fq[1]; - FieldType fieldType = w.getFieldType(name); - if(fieldType.isCollection()) { - w.addToField(extensionName, fieldName, CDATA); - } else { - w.setField(extensionName, fieldName, CDATA); - } - } - } else if (eventType == xpp.TEXT) { - CDATA = xpp.getText(); - } - eventType = xpp.next(); - } while (eventType != xpp.END_DOCUMENT); - - // don't forget to flush batchUpdate :) - batchUpdate.flush(); - transaction.commit(); - } catch (Exception eee) { - transaction.rollback(); - throw new WikittyException(eee); - } - } - } // end ImportTask - - @Override - public String asyncExportAllByCriteria(Criteria criteria) { - try { - String jobId = UUID.randomUUID().toString(); - - File file = new File(EXPORT_DIRECTORY, jobId); - String url = EXPORT_URL + jobId; - Writer result = new FileWriter(file); - ExportTask task = new ExportTask(this, criteria, result); - FutureTask<String> future = new FutureTask<String>(task, url); - importExportExecutor.submit(future); - - importExportTask.put(jobId, future); - return jobId; - } catch (Exception eee) { - throw new WikittyException(eee); - } - } - - - @Override - public String syncExportAllByCriteria(Criteria criteria) { - StringWriter result = new StringWriter(); - ExportTask task = new ExportTask(this, criteria, result); - task.run(); - return result.toString(); - } - - - static public class ExportTask implements Runnable { - protected AbstractWikittyService ws; - protected WikittyTransaction transaction; - - protected Criteria criteria; - protected Writer result; - - public ExportTask(AbstractWikittyService ws, Criteria criteria, Writer result) { - this.ws = ws; - this.transaction = new WikittyTransaction(); - this.criteria = criteria; - this.result = result; - } - - @Override - public void run() { - try { - transaction.begin(); - PagedResult<Wikitty> pageResult = ws.findAllByCriteria(transaction, criteria); - - // keep extension already done - Set<String> extDone = new HashSet<String>(); - result.write("<wikengo>\n"); - for (Wikitty w : pageResult.getAll()) { - String extensionList = ""; - for (WikittyExtension ext : w.getExtensions()) { - String id = ext.getId(); - extensionList += "," + id; - if (!extDone.contains(id)) { - extDone.add(id); - result.write(" <extension name='" + ext.getName() - + "' version='" + ext.getVersion() - + (ext.getRequires() != null ? "' requires='" + ext.getRequires() : "") - + "'>\n"); - Map<String, String> tagValues = ext.getTagValues(); - result.write(" <tagvalues>" + WikittyUtil.tagValuesToString(tagValues) + "</tagvalues>\n"); - for (String fieldName : ext.getFieldNames()) { - String def = ext.getFieldType(fieldName).toDefinition(fieldName); - result.write(" <field>" + def + "</field>\n"); - } - result.write(" </extension>\n"); - } - } - if (!"".equals(extensionList)) { - // delete first ',' - extensionList = extensionList.substring(1); - } - result.write(" <object id='" + w.getId() + "' version='" + w.getVersion() + "' extensions='" + extensionList + "'>\n"); - for (String fieldName : w.fieldNames()) { - FieldType type = w.getFieldType(fieldName); - if (type.isCollection()) { - Object fqField = w.getFqField(fieldName); - if (fqField != null) { - for (Object o : (Collection) fqField) { - String fqFieldValue = WikittyUtil.toString(type, o); - if (fqFieldValue != null) { - fqFieldValue = StringEscapeUtils.escapeXml(fqFieldValue); - result.write(" <" + fieldName + ">" + fqFieldValue + "</" + fieldName + ">\n"); - } - } - } - } else { - String fqFieldValue = WikittyUtil.toString(type, w.getFqField(fieldName)); - if (fqFieldValue != null) { - fqFieldValue = StringEscapeUtils.escapeXml(fqFieldValue); - result.write(" <" + fieldName + ">" + fqFieldValue + "</" + fieldName + ">\n"); - } - } - } - result.write(" </object>\n"); - } - result.write("</wikengo>\n"); - transaction.commit(); - } catch (IOException eee) { - transaction.rollback(); - throw new WikittyException(eee); - } - } - } // end ExportTask - - - @Override - public JobState infoJob(String jobId) { - try { - Future<String> future = importExportTask.get(jobId); - JobState result = new JobState(); - if (future.isDone()) { - result.status = "done"; - result.resourceUri = future.get(); - } else if (future.isCancelled()) { - result.status = "cancelled"; - } else { - result.status = "inProgress"; - } - return result; - } catch (Exception eee) { - throw new WikittyException(eee); - } - } - - - @Override - public void cancelJob(String jobId) { - Future future = importExportTask.get(jobId); - future.cancel(true); // true to kill process, perhaps to strong ? - } - - - @Override - public void freeJobResource(String jobId) { - Future<String> future = importExportTask.remove(jobId); - if (future != null) { - File file = new File(EXPORT_DIRECTORY, jobId); - file.delete(); - } - } - - /** - * Method copied from eugengo-0.7 generators - * - * @param bean - * @return - */ - /*public static TreeNodeImpl toImpl(TreeNode bean) { - if (bean == null) return null; - TreeNodeImpl impl = new TreeNodeImpl(bean); - return impl; - }*/ - - /** - * Method copied from eugengo-0.7 generators - * - * @param bean - * @return - */ - protected static void fillBeanAttributes(TreeNode fromBean, TreeNodeBean toBean) { - String beanId = fromBean.getWikittyId(); - toBean.id = beanId; - - String beanVersion = fromBean.getWikittyVersion(); - toBean.setWikittyVersion(beanVersion); - - toBean.setName(fromBean.getName()); - toBean.setParent(fromBean.getParent()); - // WARNING: Copy collection to other collection to not manipulate storage collection directly - Collection<String> treeNodeChildren = fromBean.getChildren(); - if(treeNodeChildren != null) { - toBean.TreeNode$children = new HashSet<String>(treeNodeChildren); - } - } - - /** - * Method copied from eugengo-0.7 generators - * - * @param impl - * @return - */ - public static TreeNode toBean(TreeNodeImpl impl) { - if (impl == null) return null; - TreeNodeBean bean = new TreeNodeBean(); - AbstractWikittyService.fillBeanAttributes(impl, bean); - return bean; - } -} Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/BusinessEntity.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/BusinessEntity.java 2010-05-20 09:43:56 UTC (rev 58) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/BusinessEntity.java 2010-05-28 13:06:15 UTC (rev 59) @@ -30,6 +30,7 @@ * Last update: $Date$ * by : $Author$ */ +// FIXME poussin 20100528 voir si cette interface est reellement necessaire. On pourra renommer BusinessEntityWikitty en BusinessEntity public interface BusinessEntity extends Serializable, Cloneable { public String getWikittyId(); Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/BusinessEntityBean.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/BusinessEntityBean.java 2010-05-20 09:43:56 UTC (rev 58) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/BusinessEntityBean.java 2010-05-28 13:06:15 UTC (rev 59) @@ -32,6 +32,8 @@ * Last update: $Date$ * by : $Author$ */ +// FIXME poussin 20100528 verifie que cette classe n'est reellement plus utilisee, seul BusinessEntity(Wikitty) devrait l'etre +@Deprecated public class BusinessEntityBean implements BusinessEntity { /** serialVersionUID. */ Deleted: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/JobState.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/JobState.java 2010-05-20 09:43:56 UTC (rev 58) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/JobState.java 2010-05-28 13:06:15 UTC (rev 59) @@ -1,41 +0,0 @@ -/* *##% - * Copyright (c) 2009 Sharengo, Guillaume Dufrene, Benjamin POUSSIN. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - *##%*/ - -package org.nuiton.wikitty; - - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -/** - * - * @author poussin - * @version $Revision$ - * - * Last update: $Date$ - * by : $Author$ - */ -public class JobState { - - /** to use log facility, just put in your code: log.info(\"...\"); */ - static private Log log = LogFactory.getLog(JobState.class); - - String status; // or enum - /** if is an export, resourceUri is not null when job is ended */ - String resourceUri; // generated resource URI on that job - -} Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyCache.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyCache.java (rev 0) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyCache.java 2010-05-28 13:06:15 UTC (rev 59) @@ -0,0 +1,189 @@ +/* *##% + * Copyright (c) 2010 poussin. All rights reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU 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 Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + *##%*/ + +package org.nuiton.wikitty; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.commons.collections.map.ReferenceMap; + +/** + * Cette classe sert a introduire du cache dans wikitty. Elle sert a centraliser + * tous les appels au cache pour pouvoir simplement changer de librairie de + * cache si necessaire, meme si pour l'instant on s'appuie le JDK + * + * @author poussin + * @version $Revision$ + * + * Last update: $Date$ + * by : $Author$ + */ +public class WikittyCache { + + /** to use log facility, just put in your code: log.info(\"...\"); */ + static private Log log = LogFactory.getLog(WikittyCache.class); + + public static interface WikittyCacheListener { + public void putWikitty(Wikitty ... ws); + public void removeWikitty(String ... ids); + public void clearWikitty(); + + public void putExtension(WikittyExtension ... es); + public void removeExtension(String ... ids); + public void clearExtension(); + } + + static protected WikittyCache instance = null; + + /** + * indique si les objects sont propages (true) vers les autres caches ou + * simplement supprimes des autres caches (false) + */ + // TODO poussin 20100520 rendre configurable cette variable propagateCache + protected boolean propagateCache = false; + protected Map<String, Wikitty> wikittyCache; + protected Set<WikittyCacheListener> listeners; + + protected WikittyCache() { + wikittyCache = new ReferenceMap(ReferenceMap.HARD, ReferenceMap.SOFT); + listeners = new HashSet<WikittyCacheListener>(); + // FIXME poussin 20100520 add jgroups listener to send message to other cache + // addListener(new JGroupsCacheNotifier(propagateCache)); + } + + public static synchronized WikittyCache getInstance() { + if (instance == null) { + instance = new WikittyCache(); + } + return instance; + } + + /** + * Notifie les autres caches d'une action: ajout, mise a jour + * + * @param w + */ + // FIXME poussin 20100520 send message to other cache + protected void firePutWikitty(Wikitty ... ws) { + WikittyCacheListener[] ls = + listeners.toArray(new WikittyCacheListener[listeners.size()]); + for (WikittyCacheListener l : ls) { + l.putWikitty(ws); + } + } + + /** + * Notifie les autres caches d'une action: suppression + * + * @param w + */ + protected void fireRemoveWikitty(String ... ids) { + WikittyCacheListener[] ls = + listeners.toArray(new WikittyCacheListener[listeners.size()]); + for (WikittyCacheListener l : ls) { + l.removeWikitty(ids); + } + } + + protected void fireClearWikitty() { + WikittyCacheListener[] ls = + listeners.toArray(new WikittyCacheListener[listeners.size()]); + for (WikittyCacheListener l : ls) { + l.clearWikitty(); + } + } + + public boolean existsWikitty(String id) { + Object o = wikittyCache.get(id); + boolean result = (o != null); + return result; + } + + /** + * Return wikitty object if is in the cache, null otherwize + * @param id + * @return wikitty object or null + */ + public Wikitty getWikitty(String id) { + Wikitty result = wikittyCache.get(id); + return result; + } + + /** + * Only realy put wikitty in cache, if not in cache or version is newer than + * one in cache + * @param e + */ + public void putWikitty(Wikitty e) { + Wikitty old = getWikitty(e.getId()); + if (old == null + || WikittyUtil.versionGreaterThan(e.getVersion(), old.getVersion())) { + wikittyCache.put(e.getId(), e); + firePutWikitty(e); + } + } + + /** + * batched put + * @param e + */ + public void putAllWikitty(Collection<Wikitty> all) { + for (Wikitty w : all) { + wikittyCache.put(w.getId(), w); + } + firePutWikitty(all.toArray(new Wikitty[all.size()])); + } + + public void removeWikitty(String id) { + wikittyCache.remove(id); + fireRemoveWikitty(id); + } + + /** + * clear all wikitty objet in cache + */ + public void clearWikitty() { + wikittyCache.clear(); + fireClearWikitty(); + } + + /** + * batched remove + * @param ids + */ + public void removeAllWikitty(Collection<String> ids) { + for (String id : ids) { + wikittyCache.remove(id); + } + fireRemoveWikitty(ids.toArray(new String[ids.size()])); + } + + public void addListener(WikittyCacheListener l) { + listeners.add(l); + } + + public void removeListener(WikittyCacheListener l) { + listeners.remove(l); + } + + + +} Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyDAO.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyDAO.java 2010-05-20 09:43:56 UTC (rev 58) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyDAO.java 2010-05-28 13:06:15 UTC (rev 59) @@ -9,6 +9,10 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +// FIXME poussin 20100528 verifier que cette class ne sert bien a rien et la supprimee +// Certaine methode ont ete commentee, car si on supprime la classe, ca ne sert a rien +// de la maintenir +@Deprecated public class WikittyDAO<E extends BusinessEntityWikitty> { protected static Log log = LogFactory.getLog( WikittyDAO.class ); @@ -30,22 +34,22 @@ proxy.addLabel(wikittyId, label); } - public String asyncExportAllByCriteria(Criteria criteria) { - return proxy.asyncExportAllByCriteria(criteria); - } +// public String asyncExportAllByCriteria(Criteria criteria) { +// return proxy.asyncExportAllByCriteria(criteria); +// } +// +// public String asyncExportAllByExample(E e) { +// return proxy.asyncExportAllByExample(e); +// } +// +// public String asyncImportFromUri(String uri) { +// return proxy.asyncImportFromUri(uri); +// } +// +// public void cancelJob(String jobId) { +// proxy.cancelJob(jobId); +// } - public String asyncExportAllByExample(E e) { - return proxy.asyncExportAllByExample(e); - } - - public String asyncImportFromUri(String uri) { - return proxy.asyncImportFromUri(uri); - } - - public void cancelJob(String jobId) { - proxy.cancelJob(jobId); - } - public void delete(Collection<String> ids) { proxy.delete(ids); } @@ -90,9 +94,9 @@ return proxy.findByLabel(label); } - public void freeJobResource(String jobId) { - proxy.freeJobResource(jobId); - } +// public void freeJobResource(String jobId) { +// proxy.freeJobResource(jobId); +// } public WikittyService getWikittyService() { return proxy.getWikittyService(); @@ -102,9 +106,9 @@ return proxy.hashCode(); } - public JobState infoJob(String jobId) { - return proxy.infoJob(jobId); - } +// public JobState infoJob(String jobId) { +// return proxy.infoJob(jobId); +// } public List<E> restore(List<String> id) { return proxy.restore(clazz, id, true); @@ -161,22 +165,22 @@ return proxy.store(objets); } - public String syncExportAllByCriteria(Criteria criteria) { - return proxy.syncExportAllByCriteria(criteria); - } +// public String syncExportAllByCriteria(Criteria criteria) { +// return proxy.syncExportAllByCriteria(criteria); +// } +// +// public String syncExportAllByExample(E e) { +// return proxy.syncExportAllByExample(e); +// } +// +// public void syncImportFromUri(String uri) { +// proxy.syncImportFromUri(uri); +// } +// +// public void syncImportFromXml(String xml) { +// proxy.syncImportFromXml(xml); +// } - public String syncExportAllByExample(E e) { - return proxy.syncExportAllByExample(e); - } - - public void syncImportFromUri(String uri) { - proxy.syncImportFromUri(uri); - } - - public void syncImportFromXml(String xml) { - proxy.syncImportFromXml(xml); - } - public String toString() { return proxy.toString(); } Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyExtensionMigration.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyExtensionMigration.java 2010-05-20 09:43:56 UTC (rev 58) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyExtensionMigration.java 2010-05-28 13:06:15 UTC (rev 59) @@ -53,7 +53,7 @@ * @return same wikitty as argument if nothing to do, or new wikitty * if some modification is done */ - public Wikitty migrate(AbstractWikittyService service, WikittyTransaction transaction, + public Wikitty migrate(WikittyServiceImpl service, WikittyTransaction transaction, Wikitty wikitty, WikittyExtension oldExt, WikittyExtension newExt); } Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyExtensionMigrationRename.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyExtensionMigrationRename.java 2010-05-20 09:43:56 UTC (rev 58) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyExtensionMigrationRename.java 2010-05-28 13:06:15 UTC (rev 59) @@ -47,7 +47,7 @@ * @param wikitty wikitty to add extension to * @param newExt extension to add */ - protected void addExtension(AbstractWikittyService service, WikittyTransaction transaction, Wikitty wikitty, WikittyExtension newExt) { + protected void addExtension(WikittyServiceImpl service, WikittyTransaction transaction, Wikitty wikitty, WikittyExtension newExt) { // manage requires before current String requires = newExt.getRequires(); @@ -63,7 +63,7 @@ } @Override - public Wikitty migrate(AbstractWikittyService service, WikittyTransaction transaction, Wikitty wikitty, WikittyExtension oldExt, WikittyExtension newExt) { + public Wikitty migrate(WikittyServiceImpl service, WikittyTransaction transaction, Wikitty wikitty, WikittyExtension oldExt, WikittyExtension newExt) { String wikittyId = wikitty.getId(); String wikittyVersion = wikitty.getVersion(); Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyImportExportService.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyImportExportService.java (rev 0) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyImportExportService.java 2010-05-28 13:06:15 UTC (rev 59) @@ -0,0 +1,210 @@ +/* *##% + * Copyright (c) 2010 poussin. All rights reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU 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 Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + *##%*/ + +package org.nuiton.wikitty; + +import java.io.File; +import java.io.FileWriter; +import java.io.InputStreamReader; +import java.io.Reader; +import java.io.StringReader; +import java.io.StringWriter; +import java.io.Writer; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.FutureTask; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.wikitty.importexport.ExportTask; +import org.nuiton.wikitty.importexport.ImportExportCSV; +import org.nuiton.wikitty.importexport.ImportExportMethod; +import org.nuiton.wikitty.importexport.ImportExportXML; +import org.nuiton.wikitty.importexport.ImportTask; +import org.nuiton.wikitty.importexport.JobState; +import org.nuiton.wikitty.search.Search; + +/** + * + * @author poussin + * @version $Revision$ + * + * Last update: $Date$ + * by : $Author$ + */ +public class WikittyImportExportService { + + /** to use log facility, just put in your code: log.info(\"...\"); */ + static private Log log = LogFactory.getLog(WikittyImportExportService.class); + + static public enum FORMAT { + XML(new ImportExportXML()), + CSV(new ImportExportCSV()); + + /** ieport == Importer/Exporter */ + protected ImportExportMethod ieporter; + FORMAT(ImportExportMethod ieporter) { + this.ieporter = ieporter; + } + + public ImportExportMethod ieporter() { + return ieporter; + } + }; + + // FIXME poussin 20090902 next 3 variables must be read from configuration file + /** number of thread used to import/export task */ + protected int MAX_IMPORT_EXPORT_THREAD = 1; + /** directory path where export asynchronous file are stored */ + protected String EXPORT_DIRECTORY = "/tmp/"; + /** url used by client to retrieve export file when job is ended */ + protected String EXPORT_URL = "file:///tmp/"; + + /** Executor that do import export task */ + protected ExecutorService importExportExecutor = + // TODO poussin 20090902 do thread number configurable + Executors.newFixedThreadPool(MAX_IMPORT_EXPORT_THREAD); + /** contains all import or export task, key is job id send to client */ + protected Map<String, Future<String>> importExportTask = + new HashMap<String, Future<String>>(); + + protected WikittyService ws; + + public WikittyImportExportService(WikittyService ws) { + this.ws = ws; + } + + public WikittyService getWikittyService() { + return ws; + } + + public void syncImport(FORMAT format, String s) { + Reader reader = new StringReader(s); + ImportTask task = new ImportTask(ws, format, reader); + task.run(); + } + + public void syncImportFromUri(FORMAT format, String uri) { + try { + URL url = new URL(uri); + Reader reader = new InputStreamReader(url.openStream()); + ImportTask task = new ImportTask(ws, format, reader); + task.run(); + } catch (Exception eee) { + throw new WikittyException(eee); + } + } + + public String asyncImportFromUri(FORMAT format, String uri) { + try { + URL url = new URL(uri); + Reader reader = new InputStreamReader(url.openStream()); + ImportTask task = new ImportTask(ws, format, reader); + FutureTask<String> future = new FutureTask<String>(task, null); + importExportExecutor.submit(future); + + String jobId = UUID.randomUUID().toString(); + importExportTask.put(jobId, future); + return jobId; + } catch (Exception eee) { + throw new WikittyException(eee); + } + } + + /** + * + * @param e + * @return job id + */ + public String asyncExportAllByExample(FORMAT format, BusinessEntityWikitty e) { + Criteria criteria = Search.query(e.getWikitty()).criteria(); + String result = asyncExportAllByCriteria(format, criteria); + return result; + } + + /** + * + * @param e + * @return xml string + */ + public String syncExportAllByExample(FORMAT format, BusinessEntityWikitty e) { + Criteria criteria = Search.query(e.getWikitty()).criteria(); + String result = syncExportAllByCriteria(format, criteria); + return result; + } + + public String asyncExportAllByCriteria(FORMAT format, Criteria criteria) { + try { + String jobId = UUID.randomUUID().toString(); + + File file = new File(EXPORT_DIRECTORY, jobId); + String url = EXPORT_URL + jobId; + Writer result = new FileWriter(file); + ExportTask task = new ExportTask(ws, format, criteria, result); + FutureTask<String> future = new FutureTask<String>(task, url); + importExportExecutor.submit(future); + + importExportTask.put(jobId, future); + return jobId; + } catch (Exception eee) { + throw new WikittyException(eee); + } + } + + public String syncExportAllByCriteria(FORMAT format, Criteria criteria) { + StringWriter result = new StringWriter(); + ExportTask task = new ExportTask(ws, format, criteria, result); + task.run(); + return result.toString(); + } + + public JobState infoJob(String jobId) { + try { + Future<String> future = importExportTask.get(jobId); + JobState result = new JobState(); + if (future.isDone()) { + result.status = "done"; + result.resourceUri = future.get(); + } else if (future.isCancelled()) { + result.status = "cancelled"; + } else { + result.status = "inProgress"; + } + return result; + } catch (Exception eee) { + throw new WikittyException(eee); + } + } + + public void cancelJob(String jobId) { + Future future = importExportTask.get(jobId); + future.cancel(true); // true to kill process, perhaps to strong ? + } + + public void freeJobResource(String jobId) { + Future<String> future = importExportTask.remove(jobId); + if (future != null) { + File file = new File(EXPORT_DIRECTORY, jobId); + file.delete(); + } + } + +} Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyProxy.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyProxy.java 2010-05-20 09:43:56 UTC (rev 58) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyProxy.java 2010-05-28 13:06:15 UTC (rev 59) @@ -30,7 +30,6 @@ import org.nuiton.wikitty.search.Element; import org.nuiton.wikitty.search.Search; -import org.nuiton.wikitty.TreeNode; /** * @@ -425,92 +424,4 @@ return true; } - public void syncImportFromXml(String xml) { - wikittyService.syncImportFromXml(xml); - } - - public void syncImportFromUri(String uri) { - wikittyService.syncImportFromUri(uri); - } - - /** - * - * @param uri - * @return job id - */ - public String asyncImportFromUri(String uri) { - String result = wikittyService.asyncImportFromUri(uri); - return result; - } - - /** - * - * @param e - * @return job id - */ - public <E extends BusinessEntityWikitty> String asyncExportAllByExample(E e) { - Criteria criteria = Search.query(e.getWikitty()).criteria(); - String result = wikittyService.asyncExportAllByCriteria(criteria); - return result; - } - - /** - * - * @param e - * @return xml string - */ - public <E extends BusinessEntityWikitty> String syncExportAllByExample(E e) { - Criteria criteria = Search.query(e.getWikitty()).criteria(); - String result = wikittyService.syncExportAllByCriteria(criteria); - return result; - } - - /** - * - * @param criteria - * @return job id - */ - public String asyncExportAllByCriteria(Criteria criteria) { - String result = wikittyService.asyncExportAllByCriteria(criteria); - return result; - } - - /** - * - * @param criteria - * @return xml string - */ - public String syncExportAllByCriteria(Criteria criteria) { - String result = wikittyService.syncExportAllByCriteria(criteria); - return result; - } - - /** - * give the job state - * @param jobId - * @return - */ - public JobState infoJob(String jobId) { - JobState result = wikittyService.infoJob(jobId); - return result; - } - - /** - * cancel job you must call freeJobResource - * @param jobId - */ - public void cancelJob(String jobId) { - wikittyService.cancelJob(jobId); - } - - /** - * This method must be call when your job is done and you have result, or - * when you call cancelJob - * @param jobId - */ - public void freeJobResource(String jobId) { - wikittyService.freeJobResource(jobId); - } - - } Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyService.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyService.java 2010-05-20 09:43:56 UTC (rev 58) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyService.java 2010-05-28 13:06:15 UTC (rev 59) @@ -22,8 +22,6 @@ import java.util.Map; import java.util.Set; -import org.nuiton.wikitty.TreeNode; - /** * * @author poussin @@ -74,7 +72,20 @@ UpdateResponse store(Collection<Wikitty> wikitties, boolean disableAutoVersionIncrement); + /** + * Manage Update and creation, action is done in transaction passed in + * argument + * + * @param transaction transaction used to do the action (must not be null) + * @param wikitties list of wikitty to be persisted + * @param disableAutoVersionIncrement boolean to disable version increment + * on saved wikitty + */ + UpdateResponse store(WikittyTransaction transaction, + Collection<Wikitty> wikitties, boolean disableAutoVersionIncrement); + + /** * Return all extension id (ex: "extName[version])") * @return */ @@ -100,6 +111,16 @@ */ UpdateResponse storeExtension(Collection<WikittyExtension> exts); + /** + * Manage Update and creation, action is done in transaction passed in + * argument + * + * @param transaction transaction used to do the action (must not be null) + * @param exts list of wikitty extension to be persisted + */ + UpdateResponse storeExtension(WikittyTransaction transaction, + Collection<WikittyExtension> exts); + /** * * @param id @@ -108,6 +129,16 @@ public WikittyExtension restoreExtension(String id); /** + * action is done in transaction passed in argument + * + * @param transaction transaction used to do the action (must not be null) * + * @param id + * @return the corresponding object, exception if no such object found. + */ + public WikittyExtension restoreExtension(WikittyTransaction transaction, + String id); + + /** * Search extension with name in last version * @param name * @return the corresponding object, exception if no such object found. @@ -151,6 +182,15 @@ public PagedResult<Wikitty> findAllByCriteria(Criteria criteria); /** + * + * @param transaction + * @param criteria + * @return + */ + public PagedResult<Wikitty> findAllByCriteria( + WikittyTransaction transaction, Criteria criteria); + + /** * Fist lonely (or first one) wikitty object that match criteria, if no wikitty found return null * @param criteria * @return @@ -242,65 +282,4 @@ */ UpdateResponse syncEngin(); - /* - * Import / Export - */ - - - /** - * synchonous or not ? - * - * @param xmlData data to import - */ - void syncImportFromXml(String xml); - - /** - * - * @param uri - */ - void syncImportFromUri(String uri); - - /** - * - * @param uri - * @return a jobID - */ - String asyncImportFromUri(String uri); - - /** - * - * @param criteria - * @return - */ - String asyncExportAllByCriteria(Criteria criteria); - - /** - * - * @param criteria - * @return - */ - String syncExportAllByCriteria(Criteria criteria); - - /* - * Job Management - */ - - /** - * - * @param jobId - * @return - */ - JobState infoJob(String jobId); - - /** - * - * @param jobId - */ - void cancelJob(String jobId); - - /** - * delete job info and all resources associated to that job (files or other ...) - */ - void freeJobResource(String jobId); - } Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceCached.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceCached.java (rev 0) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceCached.java 2010-05-28 13:06:15 UTC (rev 59) @@ -0,0 +1,432 @@ +/* *##% + * Copyright (c) 2010 poussin. All rights reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU 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 Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + *##%*/ + +package org.nuiton.wikitty; + + +import java.util.ArrayList; +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * Override some method of WikittyService to use cache + * + * @author poussin + * @version $Revision$ + * + * Last update: $Date$ + * by : $Author$ + */ +public class WikittyServiceCached implements WikittyService { + + /** to use log facility, just put in your code: log.info(\"...\"); */ + static private Log log = LogFactory.getLog(WikittyServiceCached.class); + + WikittyCache cache = null; + WikittyService ws; + + public WikittyServiceCached(WikittyService ws) { + cache = WikittyCache.getInstance(); + this.ws = ws; + } + + @Override + public void clear() { + ws.clear(); + cache.clearWikitty(); + } + + + /** + * Override to refresh wikitty after put label + * @param wikittyId + * @param label + */ + @Override + public void addLabel(String wikittyId, String label) { + ws.addLabel(wikittyId, label); + restore(wikittyId); + } + + /** + * delete object in cache + * @param id + */ + @Override + public void delete(String id) { + ws.delete(id); + cache.removeWikitty(id); + } + + /** + * delete objets in cache + * @param ids + */ + @Override + public void delete(Collection<String> ids) { + ws.delete(ids); + cache.removeAllWikitty(ids); + } + + /** + * just wrap service method + * + * @param wikittyId + * @return + */ + @Override + public Set<String> findAllAppliedLabels(String wikittyId) { + // if we want to add cache for this method, we must clear cache when + // addLabel is called + return ws.findAllAppliedLabels(wikittyId); + } + + /** + * just wrap service method + * + * @param criteria + * @return + */ + @Override + public PagedResult<Wikitty> findAllByCriteria(Criteria criteria) { + // if we want to add cache for this method, we must clear cache when + // addLabel, store, storeExtension are called + return ws.findAllByCriteria(criteria); + } + + /** + * just wrap service method + * + * @param criteria + * @return + */ + @Override + public PagedResult<Wikitty> findAllByCriteria(WikittyTransaction transaction, Criteria criteria) { + // if we want to add cache for this method, we must clear cache when + // addLabel, store, storeExtension are called + return ws.findAllByCriteria(transaction, criteria); + } + + + /** + * just wrap service method + * + * @param label + * @param firstIndex + * @param endIndex + * @return + */ + @Override + public PagedResult<Wikitty> findAllByLabel(String label, int firstIndex, int endIndex) { + // if we want to add cache for this method, we must clear cache when + // addLabel is called + return ws.findAllByLabel(label, firstIndex, endIndex); + } + + /** + * just wrap service method + * + * @param criteria + * @return + */ + @Override + public Wikitty findByCriteria(Criteria criteria) { + // if we want to add cache for this method, we must clear cache when + // addLabel, store, storeExtension are called + return ws.findByCriteria(criteria); + } + + /** + * just wrap service method + * + * @param label + * @return + */ + @Override + public Wikitty findByLabel(String label) { + // if we want to add cache for this method, we must clear cache when + // addLabel is called + return ws.findByLabel(label); + } + + /** + * just wrap service method + * + * @return + */ + @Override + public List<String> getAllExtensionIds() { + // TODO poussin 20100412: perhaps use cache for extension ? + return ws.getAllExtensionIds(); + } + + /** + * just wrap service method + * + * @param extensionName + * @return + */ + @Override + public List<String> getAllExtensionsRequires(String extensionName) { + // TODO poussin 20100412: perhaps use cache for extension ? + return ws.getAllExtensionsRequires(extensionName); + } + + /** + * just wrap service method + * + * @param id + * @return + */ + @Override + public Wikitty restore(String id) { + Wikitty result = cache.getWikitty(id); + if (result == null) { + result = ws.restore(id); + cache.putWikitty(result); + } + return result; + } + + /** + * Overriden to put all restored object from server in cache + * + * @param id + * @return + */ + @Override + public List<Wikitty> restore(List<String> ids) { + ArrayList<String> notInCache = new ArrayList<String>(); + // linked to maintains the ordre + LinkedHashMap<String, Wikitty> fromCache = + new LinkedHashMap<String, Wikitty>(); + for (String id : ids) { + Wikitty w = cache.getWikitty(id); + fromCache.put(id, w); // put all to maintains order + if (w == null) { // if not found on cache, ask the server + notInCache.add(id); + } + } + + // retrieve missing object + List<Wikitty> missingInCache = ws.restore(notInCache); + + cache.putAllWikitty(missingInCache); + + for (Wikitty w : missingInCache) { + // add missing object + fromCache.put(w.getId(), w); + } + + Collection<Wikitty> tmp = fromCache.values(); + ArrayList<Wikitty> result = new ArrayList<Wikitty>(tmp); + + return result; + } + + /** + * just wrap service method + * + * @param wikittyId + * @param filter + * @return + */ + @Override + public Map<TreeNode, Integer> restoreChildren(String wikittyId, Criteria filter) { + // FIXME lookup in cache, and put in cache + return ws.restoreChildren(wikittyId, filter); + } + + /** + * just wrap service method + * + * @param id + * @return + */ + @Override + public WikittyExtension restoreExtension(String id) { + // TODO poussin 20100412: perhaps use cache for extension ? + return ws.restoreExtension(id); + } + + /** + * just wrap service method + * + * @param name + * @return + */ + @Override + public WikittyExtension restoreExtensionLastVersion(String name) { + // TODO poussin 20100412: perhaps use cache for extension ? + return ws.restoreExtensionLastVersion(name); + } + + /** + * just wrap service method + * + * @param wikittyId + * @param filter + * @return + */ + @Override + public Entry<TreeNode, Integer> restoreNode(String wikittyId, Criteria filter) { + // FIXME lookup in cache, and put in cache + return ws.restoreNode(wikittyId, filter); + } + + /** + * just wrap service method + * + * @param wikittyId + * @return + */ + @Override + public Tree restoreTree(String wikittyId) { + // FIXME lookup in cache, and put in cache + return ws.restoreTree(wikittyId); + } + + /** + * Overriden to update wikitty and put it in cache + * @param wikitty + * @return + */ + @Override + public UpdateResponse store(Wikitty wikitty) { + UpdateResponse result = ws.store(wikitty); + + result.update(wikitty); + cache.putWikitty(wikitty); + + return result; + } + + /** + * Overriden to put wikitty in cache + * + * @param wikitties + * @return + */ + @Override + public UpdateResponse store(Collection<Wikitty> wikitties) { + UpdateResponse result = ws.store(wikitties); + + for (Wikitty w : wikitties) { + result.update(w); + } + cache.putAllWikitty(wikitties); + + return result; + } + + /** + * Overriden to put wikitty in cache + * + * @param wikitties + * @param disableAutoVersionIncrement + * @return + */ + @Override + public UpdateResponse store(Collection<Wikitty> wikitties, boolean disableAutoVersionIncrement) { + UpdateResponse result = ws.store(wikitties, disableAutoVersionIncrement); + + for (Wikitty w : wikitties) { + result.update(w); + } + cache.putAllWikitty(wikitties); + + return result; + } + + /** + * Overriden to put wikitty in cache + * + * @param wikitties + * @param disableAutoVersionIncrement + * @return + */ + @Override + public UpdateResponse store(WikittyTransaction transaction, + Collection<Wikitty> wikitties, boolean disableAutoVersionIncrement) { + // FIXME poussin 2010 comment gerer le cache avec des transactions ???? + + UpdateResponse result = ws.store(transaction, wikitties, disableAutoVersionIncrement); + + for (Wikitty w : wikitties) { + result.update(w); + } + cache.putAllWikitty(wikitties); + + return result; + } + + + /** + * just wrap service method + * + * @param ext + * @return + */ + @Override + public UpdateResponse storeExtension(WikittyExtension ext) { + // TODO poussin 20100412: perhaps use cache for extension ? + return ws.storeExtension(ext); + } + + /** + * just wrap service method + * + * @param exts + * @return + */ + @Override + public UpdateResponse storeExtension(Collection<WikittyExtension> exts) { + // TODO poussin 20100412: perhaps use cache for extension ? + return ws.storeExtension(exts); + } + + @Override + public UpdateResponse storeExtension(WikittyTransaction transaction, Collection<WikittyExtension> exts) { + // FIXME poussin 2010 comment gerer le cache avec des transactions ???? + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public WikittyExtension restoreExtension(WikittyTransaction transaction, String id) { + // FIXME poussin 2010 comment gerer le cache avec des transactions ???? + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Wikitty restoreVersion(String wikittyId, String version) { + // not put it in cache + return ws.restoreVersion(wikittyId, version); + } + + @Override + public UpdateResponse syncEngin() { + return ws.syncEngin(); + } + + +} Copied: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceImpl.java (from rev 57, trunk/wikitty-api/src/main/java/org/nuiton/wikitty/AbstractWikittyService.java) =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceImpl.java (rev 0) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceImpl.java 2010-05-28 13:06:15 UTC (rev 59) @@ -0,0 +1,868 @@ +/* *##% + * Copyright (c) 2009 poussin. All rights reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU 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 Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + *##%*/ + +package org.nuiton.wikitty; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.AbstractMap.SimpleEntry; +import java.util.Map.Entry; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.wikitty.search.Search; + +/** + * WikittyService is main service + * + * @author poussin + * @version $Revision$ + * + * Last update: $Date$ + * by : $Author$ + */ +public class WikittyServiceImpl implements WikittyService { + + /** to use log facility, just put in your code: log.info(\"...\"); */ + static private Log log = LogFactory.getLog(WikittyServiceImpl.class); + + /** Default migration use to migrate a wikitty in last extension version */ + protected WikittyExtensionMigration defaultExtensionMigration = + new WikittyExtensionMigrationRename(); + + protected WikittySearchEngin searchEngin; + protected WikittyExtensionStorage extensionStorage; + protected WikittyStorage wikittyStorage; + + public WikittyServiceImpl(WikittyExtensionStorage extensionStorage, + WikittyStorage wikittyStorage, + WikittySearchEngin searchEngin) { + this.extensionStorage = extensionStorage; + this.wikittyStorage = wikittyStorage; + this.searchEngin = searchEngin; + } + + protected WikittySearchEngin getSearchEngin() { + return searchEngin; + } + + protected WikittyExtensionStorage getExtensionStorage() { + return extensionStorage; + } + + protected WikittyStorage getWikittyStorage() { + return wikittyStorage; + } + + @Override + public UpdateResponse store(WikittyTransaction transaction, + Collection<Wikitty> wikitties, boolean disableAutoVersionIncrement) { + // update/store extension if necessary + Set<WikittyExtension> allExtensions = new HashSet<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, disableAutoVersionIncrement); + 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; + } + + /** + * Store and index wikitty object + * @param wikitty + */ + @Override + public UpdateResponse store(Wikitty wikitty) { + if (wikitty != null) { + WikittyTransaction transaction = new WikittyTransaction(); + try { + transaction.begin(); + + List<Wikitty> wikitties = Arrays.asList(wikitty); + UpdateResponse result = store(transaction, wikitties, false); + + transaction.commit(); + return result; + } catch (Exception eee) { + transaction.rollback(); + throw new WikittyException(eee); + } + } else { + throw new WikittyException("You can't store null wikitty object"); + } + } + + /** + * Store and index wikitties object + * @param wikitty + */ + @Override + public UpdateResponse store(Collection<Wikitty> wikitties) { + WikittyTransaction transaction = new WikittyTransaction(); + try { + transaction.begin(); + + UpdateResponse result = store(transaction, wikitties, false); + + transaction.commit(); + return result; + } catch (Exception eee) { + transaction.rollback(); + throw new WikittyException(eee); + } + } + + /** + * Store and index wikitties object + * @param wikitty + */ + @Override + public UpdateResponse store(Collection<Wikitty> wikitties, boolean disableAutoVersionIncrement) { + WikittyTransaction transaction = new WikittyTransaction(); + try { + transaction.begin(); + + UpdateResponse result = store(transaction, wikitties, disableAutoVersionIncrement); + + transaction.commit(); + return result; + } catch (Exception eee) { + transaction.rollback(); + throw new WikittyException(eee); + } + } + + @Override + public List<String> getAllExtensionIds() { + WikittyTransaction transaction = new WikittyTransaction(); + try { + transaction.begin(); + + List<String> result = getExtensionStorage().getAllExtensionIds(transaction); + + transaction.commit(); + return result; + } catch (Exception eee) { + transaction.rollback(); + throw new WikittyException(eee); + } + } + + @Override + public List<String> getAllExtensionsRequires(String extensionName) { + WikittyTransaction transaction = new WikittyTransaction(); + try { + transaction.begin(); + + List<String> result = getExtensionStorage() + .getAllExtensionsRequires(transaction, extensionName); + + transaction.commit(); + return result; + } catch (Exception eee) { + transaction.rollback(); + throw new WikittyException(eee); + } + } + + @Override + public UpdateResponse storeExtension(WikittyTransaction transaction, Collection<WikittyExtension> exts) { + UpdateResponse result = getExtensionStorage().store(transaction, exts); + return result; + } + + /** + * Save just one extension + * @param ext + * @throws java.io.IOException + */ + @Override + public UpdateResponse storeExtension(Collection<WikittyExtension> exts) { + WikittyTransaction transaction = new WikittyTransaction(); + try { + transaction.begin(); + + UpdateResponse result = storeExtension(transaction, exts); + + transaction.commit(); + return result; + } catch (Exception eee) { + transaction.rollback(); + throw new WikittyException(eee); + } + } + + @Override + public UpdateResponse storeExtension(WikittyExtension ext) { + WikittyTransaction transaction = new WikittyTransaction(); + try { + transaction.begin(); + + UpdateResponse result = storeExtension(transaction, Arrays.asList(ext)); + + transaction.commit(); + return result; + } catch (Exception eee) { + transaction.rollback(); + throw new WikittyException(eee); + } + } + + @Override + public WikittyExtension restoreExtension(WikittyTransaction transaction, String id) { + //split the id to ensure that version is normalized + String name = WikittyExtension.computeName(id); + String version = WikittyExtension.computeVersion(id); + + WikittyExtension result = getExtensionStorage().restore(transaction, name, version); + return result; + } + /** + * Load extension from id. Id is 'name[version]' + * @param id + * @return + */ + @Override + public WikittyExtension restoreExtension(String id) { + WikittyTransaction transaction = new WikittyTransaction(); + try { + transaction.begin(); + + WikittyExtension result = restoreExtension(transaction, id); + + transaction.commit(); + return result; + } catch (Exception eee) { + transaction.rollback(); + throw new WikittyException(eee); + } + + } + + protected WikittyExtension restoreExtensionLastVersion(WikittyTransaction transaction, String name) { + String version = getExtensionStorage().getLastVersion(transaction, name); + if(version == null) { + return null; + } + + WikittyExtension result = getExtensionStorage().restore(transaction, name, version); + return result; + } + + @Override + public WikittyExtension restoreExtensionLastVersion(String name) { + WikittyTransaction transaction = new WikittyTransaction(); + try { + transaction.begin(); + + WikittyExtension result = restoreExtensionLastVersion(transaction, name); + + transaction.commit(); + return result; + } catch (Exception eee) { + transaction.rollback(); + throw new WikittyException(eee); + } + } + + protected Wikitty restore(WikittyTransaction transaction, String id) { + if (!getWikittyStorage().exists(transaction, id)) { + // object doesn't exist, we return null + return null; + } + + if (getWikittyStorage().isDeleted(transaction, id)) { + // object deleted, we return null + return null; + } + Wikitty result = getWikittyStorage().restore(transaction, id); + if(result != null) { + result = upgradeData(transaction, result); + } + return result; + } + + protected List<Wikitty> restore(WikittyTransaction transaction, List<String> ids) { + List<Wikitty> result = new ArrayList<Wikitty>(); + for(String id : ids) { + Wikitty w = restore(transaction, id); + if (w != null) { + result.add(w); + } + } + return result; + } + + @Override + public List<Wikitty> restore(List<String> ids) { + WikittyTransaction transaction = new WikittyTransaction(); + try { + transaction.begin(); + + List<Wikitty> result = restore(transaction, ids); + + transaction.commit(); + return result; + } catch (Exception eee) { + transaction.rollback(); + throw new WikittyException(eee); + } + } + + @Override + public Wikitty restore(String id) { + WikittyTransaction transaction = new WikittyTransaction(); + try { + transaction.begin(); + + Wikitty result = restore(transaction, id); + + transaction.commit(); + return result; + } catch (Exception eee) { + transaction.rollback(); + throw new WikittyException(eee); + } + } + + protected Wikitty upgradeData(WikittyTransaction transaction, Wikitty wikitty) { + Wikitty result = wikitty; + + Collection<WikittyExtension> extensions = wikitty.getExtensions(); + for (WikittyExtension extension : extensions) { + String extensionName = extension.getName(); + log.debug("extensionName=" + extensionName); + + WikittyExtension currentExtension = extension; + String currentExtensionVersion = currentExtension.getVersion(); + + WikittyExtension lastExtension = restoreExtensionLastVersion(transaction, extensionName); + String lastExtensionVersion = lastExtension.getVersion(); + log.debug("lastExtensionVersion=" + lastExtensionVersion); + + WikittyExtensionMigration migration = WikittyExtensionMigration.migrationRegistry.get(extensionName); + if (migration == null) { + migration = defaultExtensionMigration; + } + + // Loop on between extension in wikitty and last version + while(WikittyUtil.versionGreaterThan(lastExtensionVersion, currentExtensionVersion)) { + + // Get extension after the current version + String nextExtensionVersion = WikittyUtil.incrementMajorRevision(currentExtensionVersion); + String nextExtensionId = WikittyExtension.computeId(extensionName, nextExtensionVersion); + WikittyExtension nextExtension = restoreExtension(transaction, nextExtensionId); + + log.debug("currentExtensionVersion=" + currentExtensionVersion); + log.debug("nextExtensionVersion=" + nextExtensionVersion); + + // Test if extension is never use in this version + if(nextExtension != null) { + result = migration.migrate(this, transaction, result, currentExtension, nextExtension); + currentExtension = nextExtension; + } + + // Follow + currentExtensionVersion = nextExtensionVersion; + } + } + + return result; + } + + protected void delete(WikittyTransaction transaction, Collection<String> ids) throws WikittyException { + // work only on valid id + Collection<Wikitty> storedWikitties = new ArrayList<Wikitty>(); + List<String> idList = new LinkedList<String>(ids); + for (Iterator<String> i = idList.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(); + } + if (getWikittyStorage().isDeleted(transaction, id)) { + // already deleted, remove this id in id list + i.remove(); + } + + // Store node with have deleted node as parent + Criteria criteria = Search.query().eq(TreeNode.FQ_FIELD_PARENT, id).criteria(); + List<Wikitty> wikittyNodes = findAllByCriteria(transaction, criteria).getAll(); + for (Wikitty wikittyNode : wikittyNodes) { + String wikittyNodeId = wikittyNode.getId(); + if(!ids.contains(wikittyNodeId)) { + TreeNode treeNode = new TreeNodeImpl(wikittyNode); + treeNode.setParent(null); + storedWikitties.add(wikittyNode); + } + } + + // Store node with have deleted child + criteria = Search.query().eq(TreeNode.FQ_FIELD_CHILDREN, id).criteria(); + wikittyNodes = findAllByCriteria(transaction, criteria).getAll(); + for (Wikitty wikittyNode : wikittyNodes) { + String wikittyNodeId = wikittyNode.getId(); + if(!ids.contains(wikittyNodeId)) { + TreeNode treeNode = new TreeNodeImpl(wikittyNode); + treeNode.removeChildren(id); + storedWikitties.add(wikittyNode); + } + } + } + + getWikittyStorage().delete(transaction, ids); + getSearchEngin().delete(transaction, ids); + + store(transaction, storedWikitties, false); + } + + @Override + public void delete(String id) { + WikittyTransaction transaction = new WikittyTransaction(); + try { + transaction.begin(); + + List<String> ids = Arrays.asList(id); + delete(transaction, ids); + + transaction.commit(); + } catch (Exception eee) { + transaction.rollback(); + throw new WikittyException(eee); + } + } + + @Override + public void delete(Collection<String> ids){ + WikittyTransaction transaction = new WikittyTransaction(); + try { + transaction.begin(); + + delete(transaction, ids); + + transaction.commit(); + } catch (Exception eee) { + transaction.rollback(); + throw new WikittyException(eee); + } + } + + /** + * Use with caution : It will delete ALL indexes from search engine ! + * This operation should be disabled in production environment. + */ + @Override + public void clear() { + WikittyTransaction transaction = new WikittyTransaction(); + try { + transaction.begin(); + + getSearchEngin().clear(transaction); + getWikittyStorage().clear(transaction); + getExtensionStorage().clear(transaction); + + transaction.commit(); + } catch (Exception eee) { + transaction.rollback(); + throw new WikittyException(eee); + } + } + + /** + * Assume that this PagedResult contains wikitty id as result and + * return new PagedResult with Wikitty instance + */ + @Override + public PagedResult<Wikitty> findAllByCriteria(WikittyTransaction transaction, Criteria criteria) { + PagedResult<String> resultIds = getSearchEngin().findAllByCriteria(transaction, criteria); + List<String> ids = resultIds.getAll(); + List<Wikitty> wikitties = restore(transaction, ids); + PagedResult<Wikitty> result = new PagedResult<Wikitty>( + resultIds.getFirstIndice(), + resultIds.getNumFound(), + resultIds.getQueryString(), + resultIds.getFacets(), + wikitties); + return result; + } + + @Override + public PagedResult<Wikitty> findAllByCriteria(Criteria criteria) { + WikittyTransaction transaction = new WikittyTransaction(); + try { + transaction.begin(); + + PagedResult<Wikitty> result = findAllByCriteria(transaction, criteria); + + transaction.commit(); + return result; + } catch (Exception eee) { + transaction.rollback(); + throw new WikittyException(eee); + } + } + + protected Wikitty findByCriteria(WikittyTransaction transaction, Criteria criteria) { + criteria.setFirstIndex(0).setEndIndex(1); + PagedResult<Wikitty> pages = findAllByCriteria(transaction, criteria); + + Wikitty result = null; + if (pages.size() > 0) { + result = pages.getFirst(); + } + + return result; + } + + @Override + public Wikitty findByCriteria(Criteria criteria) { + WikittyTransaction transaction = new WikittyTransaction(); + try { + transaction.begin(); + + Wikitty result = findByCriteria(transaction, criteria); + + transaction.commit(); + return result; + } catch (Exception eee) { + transaction.rollback(); + throw new WikittyException(eee); + } + } + + @Override + public void addLabel(String wikittyId, String label) { + WikittyTransaction transaction = new WikittyTransaction(); + try { + transaction.begin(); + + Wikitty w = restore(transaction, wikittyId); + w.addExtension(LabelImpl.extensions); + LabelImpl l = new LabelImpl(w); + l.addLabels(label); + store(transaction, Arrays.asList(w), false); + + transaction.commit(); + } catch (Exception eee) { + transaction.rollback(); + throw new WikittyException(eee); + } + } + + + @Override + public PagedResult<Wikitty> findAllByLabel(String label, int firstIndex, int endIndex) { + WikittyTransaction transaction = new WikittyTransaction(); + try { + transaction.begin(); + + LabelImpl l = new LabelImpl(); + l.addLabels(label); + Criteria criteria = Search.query(l.getWikitty()).criteria() + .setFirstIndex(firstIndex).setEndIndex(endIndex); + PagedResult<Wikitty> result = findAllByCriteria(transaction, criteria); + + transaction.commit(); + return result; + } catch (Exception eee) { + transaction.rollback(); + throw new WikittyException(eee); + } + } + + + @Override + public Wikitty findByLabel(String label) { + WikittyTransaction transaction = new WikittyTransaction(); + try { + transaction.begin(); + + LabelImpl l = new LabelImpl(); + l.addLabels(label); + Criteria criteria = Search.query(l.getWikitty()).criteria(); + Wikitty result = findByCriteria(transaction, criteria); + + transaction.commit(); + return result; + } catch (Exception eee) { + transaction.rollback(); + throw new WikittyException(eee); + } + } + + + @Override + public Set<String> findAllAppliedLabels(String wikittyId) { + WikittyTransaction transaction = new WikittyTransaction(); + try { + transaction.begin(); + + Wikitty w = restore(transaction, wikittyId); + LabelImpl l = new LabelImpl(w); + Set<String> result = l.getLabels(); + + transaction.commit(); + return result; + } catch (Exception eee) { + transaction.rollback(); + throw new WikittyException(eee); + } + } + + + protected Tree restoreTree(WikittyTransaction transaction, String wikittyId) { + Wikitty w = restore(transaction, wikittyId); + if(w == null) { + return null; + } + + if ( !w.hasExtension(TreeNode.EXT_TREENODE) ) { + throw new WikittyException(String.format( + "Wikitty '%s' do not handle extension %s", + wikittyId, TreeNode.EXT_TREENODE )); + } + Tree tree = new Tree(); + TreeNode node = WikittyServiceImpl.toBean(new TreeNodeImpl(w)); + tree.setNode(node); + + TreeNodeImpl exempleNode = new TreeNodeImpl(); + exempleNode.setParent(wikittyId); + + Criteria criteria = Search.query(exempleNode.getWikitty()).criteria() + .setFirstIndex(0).setEndIndex(Criteria.ALL_ELEMENTS); + PagedResult<Wikitty> childNodes = findAllByCriteria(transaction, criteria); + for( Wikitty childNode : childNodes.getAll() ) { + tree.addChild(restoreTree(transaction, childNode.getId())); + } + + return tree; + } + + @Override + public Tree restoreTree(String wikittyId) { + WikittyTransaction transaction = new WikittyTransaction(); + try { + transaction.begin(); + + Tree tree = restoreTree(transaction, wikittyId); + + transaction.commit(); + return tree; + } catch (Exception eee) { + transaction.rollback(); + throw new WikittyException(eee); + } + } + + @Override + public Map.Entry<TreeNode, Integer> restoreNode(String wikittyId, Criteria filter) { + WikittyTransaction transaction = new WikittyTransaction(); + try { + transaction.begin(); + + Wikitty w = restore(transaction, wikittyId); + if(w == null) { + transaction.commit(); + return null; + } + + if ( !w.hasExtension(TreeNode.EXT_TREENODE) ) { + throw new WikittyException(String.format( + "Wikitty '%s' do not handle extension %s", + wikittyId, TreeNode.EXT_TREENODE )); + } + + TreeNode node = WikittyServiceImpl.toBean(new TreeNodeImpl(w)); + Integer count = getSearchEngin().findNodeCount(transaction, w, filter); + + HashMap.SimpleEntry<TreeNode, Integer> result = + new SimpleEntry<TreeNode, Integer>(node, count); + + transaction.commit(); + return result; + } catch (Exception eee) { + transaction.rollback(); + throw new WikittyException(eee); + } + } + + @Override + public Map<TreeNode, Integer> restoreChildren(String wikittyId, Criteria filter) { + WikittyTransaction transaction = new WikittyTransaction(); + try { + transaction.begin(); + + Wikitty w = restore(transaction, wikittyId); + if(w == null) { + transaction.commit(); + return null; + } + + if ( !w.hasExtension(TreeNode.EXT_TREENODE) ) { + throw new WikittyException(String.format( + "Wikitty '%s' do not handle extension %s", + wikittyId, TreeNode.EXT_TREENODE )); + } + + Map<TreeNode, Integer> result = new LinkedHashMap<TreeNode, Integer>(); + + Map<String, Integer> search = getSearchEngin().findAllChildrenCount(transaction, 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(transaction, id); + TreeNode node = WikittyServiceImpl.toBean(new TreeNodeImpl(wikitty)); + + result.put(node, count); + } + + transaction.commit(); + return result; + } catch (Exception eee) { + transaction.rollback(); + throw new WikittyException(eee); + } + } + + @Override + public Wikitty restoreVersion(String wikittyId, String version) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public UpdateResponse syncEngin() { + final WikittyTransaction transaction = new WikittyTransaction(); + try { + final int numberForCommit = 1000; + final WikittySearchEngin searchEngin = getSearchEngin(); + final UpdateResponse result = new UpdateResponse(); + final List<Wikitty> wikitties = new ArrayList<Wikitty>(numberForCommit); + + transaction.begin(); + searchEngin.clear(transaction); + transaction.commit(); + transaction.begin(); + + getWikittyStorage().scanWikitties(transaction, new WikittyStorage.Scanner() { + int count = 0; + + @Override + public void scan(Wikitty wikitty) { + Date deleteDate = wikitty.getDeleteDate(); + if(deleteDate == null) { + count ++; + wikitties.add(wikitty); + + if(count == numberForCommit) { + // Reindex + UpdateResponse response = searchEngin.store(transaction, wikitties); + result.add(response); + transaction.commit(); + // Reinit + count = 0; + wikitties.clear(); + transaction.begin(); + } + } + } + }); + + // Last wikitties + UpdateResponse response = searchEngin.store(transaction, wikitties); + result.add(response); + + transaction.commit(); + return result; + } catch (Exception eee) { + transaction.rollback(); + throw new WikittyException(eee); + } + } + + + /** + * Method copied from eugengo-0.7 generators + * + * @param bean + * @return + */ + /*public static TreeNodeImpl toImpl(TreeNode bean) { + if (bean == null) return null; + TreeNodeImpl impl = new TreeNodeImpl(bean); + return impl; + }*/ + + /** + * Method copied from eugengo-0.7 generators + * + * @param bean + * @return + */ + protected static void fillBeanAttributes(TreeNode fromBean, TreeNodeBean toBean) { + String beanId = fromBean.getWikittyId(); + toBean.id = beanId; + + String beanVersion = fromBean.getWikittyVersion(); + toBean.setWikittyVersion(beanVersion); + + toBean.setName(fromBean.getName()); + toBean.setParent(fromBean.getParent()); + // WARNING: Copy collection to other collection to not manipulate storage collection directly + Collection<String> treeNodeChildren = fromBean.getChildren(); + if(treeNodeChildren != null) { + toBean.TreeNode$children = new HashSet<String>(treeNodeChildren); + } + } + + /** + * Method copied from eugengo-0.7 generators + * + * @param impl + * @return + */ + public static TreeNode toBean(TreeNodeImpl impl) { + if (impl == null) return null; + TreeNodeBean bean = new TreeNodeBean(); + WikittyServiceImpl.fillBeanAttributes(impl, bean); + return bean; + } +} Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceInMemory.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceInMemory.java 2010-05-20 09:43:56 UTC (rev 58) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceInMemory.java 2010-05-28 13:06:15 UTC (rev 59) @@ -51,7 +51,7 @@ * Last update: $Date$ * by : $Author$ */ -public class WikittyServiceInMemory extends AbstractWikittyService { +public class WikittyServiceInMemory extends WikittyServiceImpl { //FIXME InMemory implementation is not usable for production. Must be reviewed. //FIXME The version increment must be done in 'prepare' method @@ -353,14 +353,16 @@ */ protected File persitenceFile = null; - protected WikittyStorage wikittyStorage; - protected WikittyExtensionStorage extensionStorage; - protected WikittySearchEngin searchEngin; +// protected WikittyStorage wikittyStorage; +// protected WikittyExtensionStorage extensionStorage; +// protected WikittySearchEngin searchEngin; public WikittyServiceInMemory() { - extensionStorage = new WikittyExtensionStorageInMemory(); - wikittyStorage = new WikittyStorageInMemory(); - searchEngin = new WikittySearchEnginInMemory((WikittyStorageInMemory)wikittyStorage); + super(new WikittyExtensionStorageInMemory(), + new WikittyStorageInMemory(), + null); + searchEngin = new WikittySearchEnginInMemory( + (WikittyStorageInMemory) wikittyStorage); } public WikittyServiceInMemory(File persitenceFile) { @@ -380,21 +382,6 @@ } @Override - protected WikittyStorage getWikittyStorage() { - return wikittyStorage; - } - - @Override - protected WikittyExtensionStorage getExtensionStorage() { - return extensionStorage; - } - - @Override - protected WikittySearchEngin getSearchEngin() { - return searchEngin; - } - - @Override protected void finalize() throws Throwable { saveToPersistenceFile(); Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyTransaction.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyTransaction.java 2010-05-20 09:43:56 UTC (rev 58) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyTransaction.java 2010-05-28 13:06:15 UTC (rev 59) @@ -14,7 +14,7 @@ public class WikittyTransaction { /** to use log facility, just put in your code: log.info(\"...\"); */ - static private Log log = LogFactory.getLog(AbstractWikittyService.class); + static private Log log = LogFactory.getLog(WikittyServiceImpl.class); protected Map<Object, Object> tagValues; Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/importexport/ExportTask.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/importexport/ExportTask.java (rev 0) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/importexport/ExportTask.java 2010-05-28 13:06:15 UTC (rev 59) @@ -0,0 +1,56 @@ +package org.nuiton.wikitty.importexport; + +import java.io.Writer; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.wikitty.Criteria; +import org.nuiton.wikitty.PagedResult; +import org.nuiton.wikitty.Wikitty; +import org.nuiton.wikitty.WikittyException; +import org.nuiton.wikitty.WikittyService; +import org.nuiton.wikitty.WikittyTransaction; +import org.nuiton.wikitty.WikittyImportExportService.FORMAT; + +public class ExportTask implements Runnable { + + /** to use log facility, just put in your code: log.info(\"...\"); */ + static private Log log = LogFactory.getLog(ImportTask.class); + + protected WikittyService ws; + protected WikittyTransaction transaction; + protected FORMAT format; + protected Criteria criteria; + protected Writer writer; + + public ExportTask(WikittyService ws, FORMAT format, Criteria criteria, Writer writer) { + super(); + this.ws = ws; + this.transaction = new WikittyTransaction(); + this.format = format; + this.criteria = criteria; + this.writer = writer; + } + + @Override + public void run() { + try { + transaction.begin(); + PagedResult<Wikitty> pageResult = ws.findAllByCriteria(transaction, criteria); + long time = 0; + if (log.isInfoEnabled()) { + time = System.currentTimeMillis(); + log.info("Export started"); + } + ImportExportMethod exporter = format.ieporter(); + exporter.exportWriter(writer, pageResult.getAll()); + if (log.isInfoEnabled()) { + time = System.currentTimeMillis() - time; + log.info("Export in (ms)" + time); + } + transaction.commit(); + } catch (Exception eee) { + transaction.rollback(); + throw new WikittyException(eee); + } + } +} Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/importexport/ImportExportCSV.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/importexport/ImportExportCSV.java (rev 0) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/importexport/ImportExportCSV.java 2010-05-28 13:06:15 UTC (rev 59) @@ -0,0 +1,51 @@ +/* *##% + * Copyright (c) 2010 poussin. All rights reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU 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 Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + *##%*/ + +package org.nuiton.wikitty.importexport; + + +import java.io.Reader; +import java.io.Writer; +import java.util.List; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.wikitty.Wikitty; + +/** + * + * @author poussin + * @version $Revision$ + * + * Last update: $Date$ + * by : $Author$ + */ +public class ImportExportCSV implements ImportExportMethod { + + /** to use log facility, just put in your code: log.info(\"...\"); */ + static private Log log = LogFactory.getLog(ImportExportCSV.class); + + @Override + public void importReader(Reader reader, WikittyBatchUpdate batchUpdate) throws Exception { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void exportWriter(Writer writer, List<Wikitty> wikitties) throws Exception { + throw new UnsupportedOperationException("Not supported yet."); + } + +} Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/importexport/ImportExportMethod.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/importexport/ImportExportMethod.java (rev 0) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/importexport/ImportExportMethod.java 2010-05-28 13:06:15 UTC (rev 59) @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2010 poussin. All rights reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU 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 Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package org.nuiton.wikitty.importexport; + +import java.io.Reader; +import java.io.Writer; +import java.util.List; +import org.nuiton.wikitty.Wikitty; + +/** + * + * @author poussin + * @version $Revision$ + * + * Last update: $Date$ + * by : $Author$ + */ +public interface ImportExportMethod { + public void importReader(Reader reader, WikittyBatchUpdate batchUpdate) throws Exception; + public void exportWriter(Writer writer, List<Wikitty> wikitties) throws Exception; +} Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/importexport/ImportExportXML.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/importexport/ImportExportXML.java (rev 0) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/importexport/ImportExportXML.java 2010-05-28 13:06:15 UTC (rev 59) @@ -0,0 +1,183 @@ +/* *##% + * Copyright (c) 2010 poussin. All rights reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU 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 Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + *##%*/ + +package org.nuiton.wikitty.importexport; + + +import java.io.Reader; +import java.io.Writer; +import java.util.Collection; +import java.util.Date; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import org.apache.commons.lang.StringEscapeUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.wikitty.FieldType; +import org.nuiton.wikitty.PagedResult; +import org.nuiton.wikitty.Wikitty; +import org.nuiton.wikitty.WikittyException; +import org.nuiton.wikitty.WikittyExtension; +import org.nuiton.wikitty.WikittyUtil; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserFactory; + +/** + * + * @author poussin + * @version $Revision$ + * + * Last update: $Date$ + * by : $Author$ + */ +public class ImportExportXML implements ImportExportMethod { + + /** to use log facility, just put in your code: log.info(\"...\"); */ + static private Log log = LogFactory.getLog(ImportExportXML.class); + + @Override + public void importReader(Reader reader, WikittyBatchUpdate batchUpdate) throws Exception { + XmlPullParserFactory factory = XmlPullParserFactory.newInstance( + System.getProperty(XmlPullParserFactory.PROPERTY_NAME), null); + factory.setNamespaceAware(true); + XmlPullParser xpp = factory.newPullParser(); + xpp.setInput(reader); + + WikittyExtension ext = null; + Wikitty w = null; + String CDATA = null; + + int eventType; + do { + eventType = xpp.next(); + String objectVersion = null; + if (eventType == xpp.START_DOCUMENT) { + log.info("start XML import at " + new Date()); + } else if (eventType == xpp.START_TAG) { + String name = xpp.getName(); + if ("extension".equals(name)) { + String extName = xpp.getAttributeValue(null, "name"); + String version = xpp.getAttributeValue(null, "version"); + String requires = xpp.getAttributeValue(null, "requires"); + ext = new WikittyExtension(extName, version, requires, + new LinkedHashMap<String, FieldType>()); + } else if ("object".equals(name)) { + String id = xpp.getAttributeValue(null, "id"); + objectVersion = xpp.getAttributeValue(null, "version"); + String extensions = xpp.getAttributeValue(null, "extensions"); + w = new Wikitty(id); + String[] extensionList = extensions.split(","); + for (String extId : extensionList) { + String extName = WikittyExtension.computeName(extId); + String extVersion = WikittyExtension.computeVersion(extId); + extId = WikittyExtension.computeId(extName, extVersion); + WikittyExtension e = batchUpdate.getExtension(extId); + if (e == null) { + throw new WikittyException("Extension not found : " + extId); + } + w.addExtension(e); + } + } + } else if (eventType == xpp.END_TAG) { + String name = xpp.getName(); + if ("extension".equals(name)) { + batchUpdate.addExtension(ext); + ext = null; + } else if ("object".equals(name)) { + w.setVersion(objectVersion); + batchUpdate.addWikitty(w); + w = null; + } else if (ext != null && "field".equals(name)) { + FieldType type = new FieldType(); + String fieldName = WikittyUtil.parseField(CDATA, type); + ext.addField(fieldName, type); + } else if (ext != null && "tagvalues".equals(name)) { + Map<String, String> tagValues = WikittyUtil.tagValuesToMap(CDATA); + ext.setTagValues(tagValues); + } else if (w != null) { + String[] fq = name.split("\\."); + String extensionName = fq[0]; + String fieldName = fq[1]; + FieldType fieldType = w.getFieldType(name); + if (fieldType.isCollection()) { + w.addToField(extensionName, fieldName, CDATA); + } else { + w.setField(extensionName, fieldName, CDATA); + } + } + } else if (eventType == xpp.TEXT) { + CDATA = xpp.getText(); + } + } while (eventType != xpp.END_DOCUMENT); + } + + @Override + public void exportWriter(Writer result, List<Wikitty> wikitties) throws Exception { + // keep extension already done + Set<String> extDone = new HashSet<String>(); + result.write("<wikengo>\n"); + for (Wikitty w : wikitties) { + String extensionList = ""; + for (WikittyExtension ext : w.getExtensions()) { + String id = ext.getId(); + extensionList += "," + id; + if (!extDone.contains(id)) { + extDone.add(id); + result.write(" <extension name='" + ext.getName() + "' version='" + ext.getVersion() + (ext.getRequires() != null ? "' requires='" + ext.getRequires() : "") + "'>\n"); + Map<String, String> tagValues = ext.getTagValues(); + result.write(" <tagvalues>" + WikittyUtil.tagValuesToString(tagValues) + "</tagvalues>\n"); + for (String fieldName : ext.getFieldNames()) { + String def = ext.getFieldType(fieldName).toDefinition(fieldName); + result.write(" <field>" + def + "</field>\n"); + } + result.write(" </extension>\n"); + } + } + if (!"".equals(extensionList)) { + // delete first ',' + extensionList = extensionList.substring(1); + } + result.write(" <object id='" + w.getId() + "' version='" + w.getVersion() + "' extensions='" + extensionList + "'>\n"); + for (String fieldName : w.fieldNames()) { + FieldType type = w.getFieldType(fieldName); + if (type.isCollection()) { + Object fqField = w.getFqField(fieldName); + if (fqField != null) { + for (Object o : (Collection) fqField) { + String fqFieldValue = WikittyUtil.toString(type, o); + if (fqFieldValue != null) { + fqFieldValue = StringEscapeUtils.escapeXml(fqFieldValue); + result.write(" <" + fieldName + ">" + fqFieldValue + "</" + fieldName + ">\n"); + } + } + } + } else { + String fqFieldValue = WikittyUtil.toString(type, w.getFqField(fieldName)); + if (fqFieldValue != null) { + fqFieldValue = StringEscapeUtils.escapeXml(fqFieldValue); + result.write(" <" + fieldName + ">" + fqFieldValue + "</" + fieldName + ">\n"); + } + } + } + result.write(" </object>\n"); + } + result.write("</wikengo>\n"); + } +} Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/importexport/ImportTask.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/importexport/ImportTask.java (rev 0) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/importexport/ImportTask.java 2010-05-28 13:06:15 UTC (rev 59) @@ -0,0 +1,56 @@ +package org.nuiton.wikitty.importexport; + +import java.io.Reader; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.wikitty.WikittyException; +import org.nuiton.wikitty.WikittyService; +import org.nuiton.wikitty.WikittyTransaction; +import org.nuiton.wikitty.WikittyImportExportService.FORMAT; + +public class ImportTask implements Runnable { + + /** to use log facility, just put in your code: log.info(\"...\"); */ + static private Log log = LogFactory.getLog(ImportTask.class); + + protected WikittyService ws; + protected WikittyTransaction transaction; + protected FORMAT format; + protected Reader reader; + protected ImportExportMethod importerExporter; + + public ImportTask(WikittyService ws, FORMAT format, Reader reader) { + super(); + this.ws = ws; + this.format = format; + this.reader = reader; + this.transaction = new WikittyTransaction(); + } + + @Override + public void run() { + try { + transaction.begin(); + WikittyBatchUpdate batchUpdate = new WikittyBatchUpdate(ws, transaction); + + long time = 0; + if (log.isInfoEnabled()) { + time = System.currentTimeMillis(); + log.info("Import in (ms)" + time); + } + ImportExportMethod importer = format.ieporter(); + importer.importReader(reader, batchUpdate); + + if (log.isInfoEnabled()) { + time = System.currentTimeMillis() - time; + log.info("Import in (ms)" + time); + } + // don't forget to flush batchUpdate :) + batchUpdate.flush(); + transaction.commit(); + } catch (Exception eee) { + transaction.rollback(); + throw new WikittyException(eee); + } + } +} Copied: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/importexport/JobState.java (from rev 58, trunk/wikitty-api/src/main/java/org/nuiton/wikitty/JobState.java) =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/importexport/JobState.java (rev 0) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/importexport/JobState.java 2010-05-28 13:06:15 UTC (rev 59) @@ -0,0 +1,41 @@ +/* *##% + * Copyright (c) 2009 Sharengo, Guillaume Dufrene, Benjamin POUSSIN. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU 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 Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + *##%*/ + +package org.nuiton.wikitty.importexport; + + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * + * @author poussin + * @version $Revision$ + * + * Last update: $Date$ + * by : $Author$ + */ +public class JobState { + + /** to use log facility, just put in your code: log.info(\"...\"); */ + static private Log log = LogFactory.getLog(JobState.class); + + public String status; // or enum + /** if is an export, resourceUri is not null when job is ended */ + public String resourceUri; // generated resource URI on that job + +} Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/importexport/WikittyBatchUpdate.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/importexport/WikittyBatchUpdate.java (rev 0) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/importexport/WikittyBatchUpdate.java 2010-05-28 13:06:15 UTC (rev 59) @@ -0,0 +1,70 @@ +package org.nuiton.wikitty.importexport; + +import org.nuiton.wikitty.Wikitty; +import org.nuiton.wikitty.WikittyExtension; +import org.nuiton.wikitty.WikittyService; +import org.nuiton.wikitty.WikittyTransaction; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +/** + * Class used for import process, this class retain numberForCommit object + * before to send it to storage. + */ +public class WikittyBatchUpdate { + + // TODO poussin 20090902 do configurable numberForCommit + protected int numberForCommit = 1000; + protected int currentAdded = 0; + protected Map<String, WikittyExtension> exts = new HashMap<String, WikittyExtension>(); + protected List<Wikitty> wikitties = new LinkedList<Wikitty>(); + protected WikittyService ws; + protected WikittyTransaction transaction; + + public WikittyBatchUpdate(WikittyService ws, WikittyTransaction transaction) { + super(); + this.ws = ws; + this.transaction = transaction; + } + + public void addExtension(WikittyExtension ext) { + exts.put(ext.getId(), ext); + inc(); + } + + public void addWikitty(Wikitty w) { + wikitties.add(w); + inc(); + } + + /** + * search extension in local extension list and if missed restore + * extension from internal WikittyService + * @param id + * @return + */ + public WikittyExtension getExtension(String id) { + WikittyExtension result = exts.get(id); + if (result == null) { + result = ws.restoreExtension(transaction, id); + } + return result; + } + + public void flush() { + ws.storeExtension(transaction, exts.values()); + ws.store(transaction, wikitties, true); + exts.clear(); + wikitties.clear(); + currentAdded = 0; + } + + protected void inc() { + currentAdded++; + if (currentAdded >= numberForCommit) { + flush(); + } + } +} Modified: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/test/api/WikittyUtilTest.java =================================================================== --- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/test/api/WikittyUtilTest.java 2010-05-20 09:43:56 UTC (rev 58) +++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/test/api/WikittyUtilTest.java 2010-05-28 13:06:15 UTC (rev 59) @@ -29,7 +29,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.junit.Test; -import org.nuiton.wikitty.AbstractWikittyService; +import org.nuiton.wikitty.WikittyServiceImpl; import org.nuiton.wikitty.FieldType; import org.nuiton.wikitty.WikittyExtension; import org.nuiton.wikitty.WikittyUtil; @@ -430,7 +430,7 @@ impl.setName("toto"); impl.setParent("idparent"); - TreeNode bean = AbstractWikittyService.toBean(impl); // WikittyUtil.wikittyToBean(TreeNodeBean.class, impl); + TreeNode bean = WikittyServiceImpl.toBean(impl); // WikittyUtil.wikittyToBean(TreeNodeBean.class, impl); assertEquals(impl.getName(), bean.getName()); assertEquals(impl.getParent(), bean.getParent()); } Modified: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/test/conform/ImportExportTest.java =================================================================== --- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/test/conform/ImportExportTest.java 2010-05-20 09:43:56 UTC (rev 58) +++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/test/conform/ImportExportTest.java 2010-05-28 13:06:15 UTC (rev 59) @@ -19,6 +19,7 @@ import org.junit.Test; import org.nuiton.wikitty.Criteria; import org.nuiton.wikitty.Wikitty; +import org.nuiton.wikitty.WikittyImportExportService; import org.nuiton.wikitty.search.Element; import org.nuiton.wikitty.search.Search; import org.w3c.dom.Document; @@ -30,12 +31,22 @@ protected final static Log log = LogFactory.getLog(ImportExportTest.class); + protected WikittyImportExportService ieService; + + protected WikittyImportExportService getImportExportService() { + if (ieService == null) { + ieService = new WikittyImportExportService(ws); + } + return ieService; + } + @Test public void testExport() throws Exception { final List<Wikitty> wikitties = createSampleWikitty(ws); Criteria criteria = Search.query().eq(Element.ELT_EXTENSION, AbstractTestConformance.EXTNAME).criteria(); - String result = ws.syncExportAllByCriteria(criteria); + String result = getImportExportService().syncExportAllByCriteria( + WikittyImportExportService.FORMAT.XML, criteria); log.debug("[XML] " + result); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); @@ -117,7 +128,7 @@ " </object>" + "</wikengo>"; - ws.syncImportFromXml(xml); + getImportExportService().syncImport(WikittyImportExportService.FORMAT.XML, xml); String[] ids = new String[] { "f4ef949b-09e4-438f-b359-2a4332771c81", Modified: trunk/wikitty-hbase-impl/src/main/java/org/nuiton/wikitty/hbase/WikittyServiceHBase.java =================================================================== --- trunk/wikitty-hbase-impl/src/main/java/org/nuiton/wikitty/hbase/WikittyServiceHBase.java 2010-05-20 09:43:56 UTC (rev 58) +++ trunk/wikitty-hbase-impl/src/main/java/org/nuiton/wikitty/hbase/WikittyServiceHBase.java 2010-05-28 13:06:15 UTC (rev 59) @@ -54,33 +54,14 @@ * Last update: $Date$ * by : $Author$ */ -public class WikittyServiceHBase extends AbstractWikittyService { +public class WikittyServiceHBase extends WikittyServiceImpl { /** to use log facility, just put in your code: log.info(\"...\"); */ static private Log log = LogFactory.getLog(WikittyServiceHBase.class); - protected WikittySearchEngin searchEngin; - protected WikittyExtensionStorage extensionStorage; - protected WikittyStorage wikittyStorage; - public WikittyServiceHBase() { extensionStorage = new WikittyExtensionStorageHBase(); wikittyStorage = new WikittyStorageHBase(extensionStorage); searchEngin = new WikittySearchEnginSolr(extensionStorage); } - - @Override - protected WikittySearchEngin getSearchEngin() { - return searchEngin; - } - - @Override - protected WikittyExtensionStorage getExtensionStorage() { - return extensionStorage; - } - - @Override - protected WikittyStorage getWikittyStorage() { - return wikittyStorage; - } } 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-05-20 09:43:56 UTC (rev 58) +++ trunk/wikitty-jdbc-impl/src/main/java/org/nuiton/wikitty/jdbc/WikittyServiceJDBC.java 2010-05-28 13:06:15 UTC (rev 59) @@ -22,6 +22,7 @@ import org.nuiton.wikitty.AbstractWikittyService; import org.nuiton.wikitty.WikittyExtensionStorage; import org.nuiton.wikitty.WikittySearchEngin; +import org.nuiton.wikitty.WikittyServiceInMemory; import org.nuiton.wikitty.WikittyStorage; import org.nuiton.wikitty.solr.WikittySearchEnginSolr; @@ -32,33 +33,15 @@ * Last update: $Date$ * by : $Author$ */ -public class WikittyServiceJDBC extends AbstractWikittyService { +public class WikittyServiceJDBC extends WikittyServiceImpl { /** to use log facility, just put in your code: log.info(\"...\"); */ static private Log log = LogFactory.getLog(WikittyServiceJDBC.class); - protected WikittySearchEngin searchEngin; - protected WikittyExtensionStorage extensionStorage; - protected WikittyStorage wikittyStorage; - public WikittyServiceJDBC() { extensionStorage = new WikittyExtensionStorageJDBC(); wikittyStorage = new WikittyStorageJDBC(extensionStorage); searchEngin = new WikittySearchEnginSolr(extensionStorage); } - @Override - protected WikittySearchEngin getSearchEngin() { - return searchEngin; - } - - @Override - protected WikittyExtensionStorage getExtensionStorage() { - return extensionStorage; - } - - @Override - protected WikittyStorage getWikittyStorage() { - return wikittyStorage; - } } Modified: trunk/wikitty-multistorage-impl/src/main/java/org/nuiton/wikitty/multistorage/WikittyServiceMultiStorage.java =================================================================== --- trunk/wikitty-multistorage-impl/src/main/java/org/nuiton/wikitty/multistorage/WikittyServiceMultiStorage.java 2010-05-20 09:43:56 UTC (rev 58) +++ trunk/wikitty-multistorage-impl/src/main/java/org/nuiton/wikitty/multistorage/WikittyServiceMultiStorage.java 2010-05-28 13:06:15 UTC (rev 59) @@ -31,7 +31,7 @@ * Last update: $Date$ * by : $Author$ */ -public class WikittyServiceMultiStorage extends AbstractWikittyService { +public class WikittyServiceMultiStorage extends WikittyServiceImpl { protected WikittySearchEngin searchEngin; protected WikittyExtensionStorage extensionStorage; @@ -58,19 +58,4 @@ return wikittyStorage; } - @Override - protected WikittySearchEngin getSearchEngin() { - return searchEngin; - } - - @Override - protected WikittyExtensionStorage getExtensionStorage() { - return extensionStorage; - } - - @Override - protected WikittyStorage getWikittyStorage() { - return wikittyStorage; - } - }