Author: mfortun Date: 2011-04-13 16:40:47 +0200 (Wed, 13 Apr 2011) New Revision: 798 Url: http://nuiton.org/repositories/revision/wikitty/798 Log: * New class to handle properties and save it again in the same file used to load them * add hashcode and equals methods in the filseSystemWikittyId * implements the delete operation in the wikittyPublicationFileSytem * implemtens delete function * add method to search/create/load wikittypublication properties file Added: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/PropertiesExtended.java Modified: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/FileSystemWIkittyId.java trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/WikittyPublication.java trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/WikittyPublicationFileSystem.java Modified: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/FileSystemWIkittyId.java =================================================================== --- trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/FileSystemWIkittyId.java 2011-04-13 09:32:21 UTC (rev 797) +++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/FileSystemWIkittyId.java 2011-04-13 14:40:47 UTC (rev 798) @@ -34,4 +34,43 @@ this.setPath(path); } + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + + ((fileName == null) ? 0 : fileName.hashCode()); + result = prime * result + ((path == null) ? 0 : path.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (!(obj instanceof FileSystemWIkittyId)) { + return false; + } + FileSystemWIkittyId other = (FileSystemWIkittyId) obj; + if (fileName == null) { + if (other.fileName != null) { + return false; + } + } else if (!fileName.equals(other.fileName)) { + return false; + } + if (path == null) { + if (other.path != null) { + return false; + } + } else if (!path.equals(other.path)) { + return false; + } + return true; + } + } Added: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/PropertiesExtended.java =================================================================== --- trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/PropertiesExtended.java (rev 0) +++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/PropertiesExtended.java 2011-04-13 14:40:47 UTC (rev 798) @@ -0,0 +1,39 @@ +package org.nuiton.wikitty.publication; + +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.util.Properties; + +/** + * Class usefull when load properties file, update, delete, then save again + * File used to load properties is store. + * + * @author mfortun + * + */ +public class PropertiesExtended extends Properties { + + /** + * + */ + private static final long serialVersionUID = -264337198024996529L; + + protected File origin; + + public PropertiesExtended(File origin) throws Exception { + super(); + this.load(origin); + + } + + public void load(File file) throws Exception { + this.origin = file; + this.load(new FileReader(origin)); + } + + public void store() throws Exception { + this.store(new FileWriter(origin), ""); + } + +} Property changes on: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/PropertiesExtended.java ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/WikittyPublication.java =================================================================== --- trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/WikittyPublication.java 2011-04-13 09:32:21 UTC (rev 797) +++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/WikittyPublication.java 2011-04-13 14:40:47 UTC (rev 798) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2010 - 2011 CodeLutin + * Copyright (C) 2010 - 2011 CodeLutin mfortun * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as @@ -27,29 +27,27 @@ import java.io.File; import java.io.FileReader; import java.io.FileWriter; -import java.lang.reflect.Array; -import java.lang.reflect.Method; import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; import java.util.List; import java.util.Properties; +import org.apache.commons.collections.BidiMap; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.util.ApplicationConfig; import org.nuiton.util.ArgumentsParserException; -import org.nuiton.util.StringUtil; +import org.nuiton.util.CollectionUtil; +import org.nuiton.util.FileUtil; import org.nuiton.wikitty.WikittyProxy; import org.nuiton.wikitty.WikittyServiceFactory; import org.nuiton.wikitty.entities.Wikitty; import org.nuiton.wikitty.entities.WikittyLabel; +import org.nuiton.wikitty.entities.WikittyLabelHelper; import org.nuiton.wikitty.publication.entities.WikittyPubData; import org.nuiton.wikitty.publication.entities.WikittyPubText; import org.nuiton.wikitty.search.Criteria; import org.nuiton.wikitty.search.PagedResult; import org.nuiton.wikitty.search.Search; -import org.nuiton.wikitty.services.WikittyServiceCajoClient; /** * Main class of the sync part of wikitty publication, this class is the entry @@ -514,9 +512,12 @@ // check args if (null == toDelete || !toDelete.exists()) { // Exception + } else { - File wpHomeDir = searchWikittyPublicationHomeDir(new File(".")); + File currentDir = new File(FileUtil.getCurrentDirectory() + .getAbsolutePath()); + File wpHomeDir = searchWikittyPublicationHomeDir(currentDir); // search for the .wp home dir to load props // then load proxy @@ -526,9 +527,6 @@ File dir = applicationConfig.getOptionAsFile(DIRECTORY_KEY); - // on va chercher le home dir - wpHomeDir = searchWikittyPublicationHomeDir(dir); - Properties properties = new Properties(); // TODO mfortun-2011-04-06 catch exception instead of throws @@ -558,10 +556,83 @@ log.info("Delete " + " wikitty-service" + wikittyService + " hessian Protocole :" + hessianProtocole + "file to delete : " + toDelete.getAbsolutePath()); + // on va chercher le home dir + wpHomeDir = searchWikittyPublicationHomeDir(dir); - System.out.println("try to delete: "); - printDirectory(dir, true); + WikittyProxy remoteWikittyService = new WikittyProxy( + WikittyServiceFactory + .buildWikittyService(applicationConfig)); + WikittyPublicationFileSystem localWikittyService = new WikittyPublicationFileSystem( + dir); + if (toDelete.isDirectory()) { + + BidiMap deleteMap = WikittyPublicationFileSystem + .harvestLocalWikitties(toDelete, true); + List<String> ids = new ArrayList<String>(); + ids = new ArrayList<String>(); + ids.addAll(CollectionUtil.toGenericCollection( + deleteMap.keySet(), String.class)); + + for (String key : ids) { + // restore wikitty + Wikitty wd = remoteWikittyService.restore(key); + + // searh for the label to delete from the wikitty + FileSystemWIkittyId location = (FileSystemWIkittyId) deleteMap + .get(key); + + File wikittyFileParent = new File(location.getPath()); + PropertiesExtended metaExtended = WikittyPublicationFileSystem + .getWikittyPublicationProperties( + wikittyFileParent, + WikittyPublication.WIKITTY_FILE_META_PROPERTIES_FILE); + + String currentLabel = metaExtended + .getProperty(META_CURRENT_LABEL); + // remove label + WikittyLabelHelper.removeLabels(wd, currentLabel); + // save the wikitty + remoteWikittyService.store(wd); + } + + localWikittyService.delete("", ids); + // if it was a directory the wikitty file service does not have + // delete it + + FileUtil.deleteRecursively(toDelete); + } else { + // infos about file about to delete + String name = toDelete.getName(); + File parentFile = toDelete.getParentFile(); + // search of it's id + PropertiesExtended metaProps = WikittyPublicationFileSystem + .getWikittyPublicationProperties( + parentFile, + WikittyPublication.WIKITTY_FILE_META_PROPERTIES_FILE); + + String id = metaProps.getProperty(name + + DEFAULT_PROPERTY_NAME_SEP + META_SUFFIX_KEY_ID); + // his label + String label = metaProps + .getProperty(WikittyPublication.META_CURRENT_LABEL); + + // restore wikitty remote + + Wikitty wd = remoteWikittyService.restore(id); + + // remove label + + WikittyLabelHelper.removeLabels(wd, label); + // save the wikitty remote + remoteWikittyService.store(wd); + + List<String> ids = new ArrayList<String>(); + ids.add(id); + // delete localy + localWikittyService.delete("", ids); + } + } /* @@ -651,6 +722,7 @@ File propertyDirectory = new File(start.getCanonicalPath() + File.separator + PROPERTY_DIRECTORY); + if (propertyDirectory.exists()) { File propertie = new File(propertyDirectory.getCanonicalPath() + File.separator + WIKITTYPUBLICATION_PROPERTIES_FILE); @@ -658,6 +730,7 @@ return propertyDirectory; } } + return searchWikittyPublicationHomeDir(start.getParentFile()); } else { // Exception @@ -668,56 +741,6 @@ } } - static protected HashMap<String, String> deleteFile(File toDelete) - throws Exception { - HashMap<String, String> result = new HashMap<String, String>(); - - String pathToProperty = toDelete.getCanonicalFile() + File.separator - + PROPERTY_DIRECTORY + File.separator; - // load properties files - File metaFile = new File(pathToProperty - + WIKITTY_FILE_META_PROPERTIES_FILE); - Properties metaProperties = new Properties(); - metaProperties.load(new FileReader(metaFile)); - - File idFile = new File(pathToProperty + WIKITTY_ID_PROPERTIES_FILE); - Properties idProperties = new Properties(); - idProperties.load(new FileReader(idFile)); - - if (toDelete.isDirectory()) { - for (File child : toDelete.listFiles()) { - if (child.isDirectory() - && !child.getName().equals(PROPERTY_DIRECTORY)) { - result.putAll(deleteFile(child)); - } - } - - } else { - - String id = metaProperties.getProperty(toDelete.getName() - + DEFAULT_PROPERTY_NAME_SEP + META_SUFFIX_KEY_ID); - String label = metaProperties.getProperty(META_CURRENT_LABEL); - - result.put(id, label); - // remove from properties - idProperties.remove(id); - - metaProperties.remove(toDelete.getName() - + DEFAULT_PROPERTY_NAME_SEP + META_SUFFIX_KEY_ID); - metaProperties.remove(toDelete.getName() - + DEFAULT_PROPERTY_NAME_SEP + META_SUFFIX_KEY_CHECKSUM); - metaProperties.remove(toDelete.getName() - + DEFAULT_PROPERTY_NAME_SEP + META_SUFFIX_KEY_VERSION); - } - - metaProperties.store(new FileWriter(metaFile), ""); - idProperties.store(new FileWriter(idFile), ""); - - toDelete.delete(); - return result; - - } - static protected void writeHomePropertyFile(File homeDir) throws Exception { if (homeDir.exists()) { @@ -776,4 +799,5 @@ return result; } + } Modified: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/WikittyPublicationFileSystem.java =================================================================== --- trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/WikittyPublicationFileSystem.java 2011-04-13 09:32:21 UTC (rev 797) +++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/WikittyPublicationFileSystem.java 2011-04-13 14:40:47 UTC (rev 798) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2010 - 2011 CodeLutin + * Copyright (C) 2010 - 2011 CodeLutin mfortun * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as @@ -37,9 +37,15 @@ import java.util.Properties; import java.util.Set; +import org.apache.commons.collections.BidiMap; +import org.apache.commons.collections.bidimap.DualHashBidiMap; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.solr.client.solrj.impl.CommonsHttpSolrServer; +import org.apache.velocity.texen.util.PropertiesUtil; +import org.nuiton.util.CollectionUtil; import org.nuiton.util.FileUtil; +import org.nuiton.util.LRUMapMultiKey; import org.nuiton.util.MD5InputStream; import org.nuiton.util.StringUtil; import org.nuiton.wikitty.WikittyService; @@ -84,6 +90,17 @@ this.setLabel(label); } + + + + public WikittyPublicationFileSystem(File homeFile) { + this(homeFile, true, ""); + + } + + + + public File getHomeFile() { return homeFile; } @@ -393,65 +410,80 @@ public List<Wikitty> restore(String securityToken, List<String> id) { List<Wikitty> result = new ArrayList<Wikitty>(); try { - Map<String, FileSystemWIkittyId> locations = harvestLocalWikitties( - homeFile, recursion); + BidiMap locations = harvestLocalWikitties(homeFile, recursion); for (String wikid : id) { - FileSystemWIkittyId localisation = locations.get(wikid); - // create the wikitty with his id - Wikitty wikitty = new WikittyImpl(wikid); - // add label extension - wikitty.addExtension(WikittyLabelImpl.extensionWikittyLabel); + Object value = locations.get(wikid); - // preparation for mime research and file research - String path = localisation.getPath(); - String completeName = localisation.getFileName(); + if (value == null) { + locations = locations.inverseBidiMap(); + value = locations.get(wikid); + } - // search for the file - File fileToTransform = new File(path + File.separator - + completeName); + if (value != null) { - String extension = FileUtil.extension(fileToTransform); - String name = FileUtil.basename(completeName, "." + extension); - // search for the mimetype - String mimeType = mimeTypeForExtension(extension); + FileSystemWIkittyId localisation = (FileSystemWIkittyId) value; - // load properties - Properties props = new Properties(); - File propsFile = new File(path + File.separator - + WikittyPublication.PROPERTY_DIRECTORY - + File.separator - + WikittyPublication.WIKITTY_FILE_META_PROPERTIES_FILE); - props.load(new FileReader(propsFile)); - // re set the id - wikitty.setVersion(props.getProperty(completeName - + WikittyPublication.META_SUFFIX_KEY_ID)); + // create the wikitty with his id + Wikitty wikitty = new WikittyImpl(wikid); + // add label extension + wikitty.addExtension(WikittyLabelImpl.extensionWikittyLabel); - // set the current label - WikittyLabelHelper.addLabels(wikitty, props - .getProperty(WikittyPublication.META_CURRENT_LABEL)); + // preparation for mime research and file research + String path = localisation.getPath(); + String completeName = localisation.getFileName(); - /* - * TODO mfortun-2011-04-12 need to merge part of this code with - * filetowikitty method 'cause it is basically the same - */ + // search for the file + File fileToTransform = new File(path + File.separator + + completeName); - // create the correct wikittypubxxx - if (isMimeWikittyPubText(mimeType)) { - wikitty.addExtension(WikittyPubTextImpl.extensionWikittyPubText); - WikittyPubTextHelper.setName(wikitty, name); - WikittyPubTextHelper.setMimeType(wikitty, mimeType); - WikittyPubTextHelper.setContent(wikitty, - FileUtil.readAsString(fileToTransform)); - } else { - wikitty.addExtension(WikittyPubDataImpl.extensionWikittyPubData); - WikittyPubDataHelper.setName(wikitty, name); - WikittyPubDataHelper.setMimeType(wikitty, mimeType); - WikittyPubDataHelper.setContent(wikitty, - FileUtil.fileToByte(fileToTransform)); + String extension = FileUtil.extension(fileToTransform); + String name = FileUtil.basename(completeName, "." + + extension); + // search for the mimetype + String mimeType = mimeTypeForExtension(extension); + + // load properties + Properties props = new Properties(); + File propsFile = new File( + path + + File.separator + + WikittyPublication.PROPERTY_DIRECTORY + + File.separator + + WikittyPublication.WIKITTY_FILE_META_PROPERTIES_FILE); + props.load(new FileReader(propsFile)); + // re set the id + wikitty.setVersion(props.getProperty(completeName + + WikittyPublication.META_SUFFIX_KEY_ID)); + + // set the current label + WikittyLabelHelper + .addLabels( + wikitty, + props.getProperty(WikittyPublication.META_CURRENT_LABEL)); + + /* + * TODO mfortun-2011-04-12 need to merge part of this code + * with filetowikitty method 'cause it is basically the same + */ + + // create the correct wikittypubxxx + if (isMimeWikittyPubText(mimeType)) { + wikitty.addExtension(WikittyPubTextImpl.extensionWikittyPubText); + WikittyPubTextHelper.setName(wikitty, name); + WikittyPubTextHelper.setMimeType(wikitty, mimeType); + WikittyPubTextHelper.setContent(wikitty, + FileUtil.readAsString(fileToTransform)); + } else { + wikitty.addExtension(WikittyPubDataImpl.extensionWikittyPubData); + WikittyPubDataHelper.setName(wikitty, name); + WikittyPubDataHelper.setMimeType(wikitty, mimeType); + WikittyPubDataHelper.setContent(wikitty, + FileUtil.fileToByte(fileToTransform)); + } + + result.add(wikitty); } - - result.add(wikitty); } } catch (Exception e) { e.printStackTrace(); @@ -462,10 +494,65 @@ @Override public WikittyEvent delete(String securityToken, Collection<String> ids) { - // TODO mfortun-2011-04-05 - throw new UnsupportedOperationException("not yet implemented"); - // return null; + try { + BidiMap location = harvestLocalWikitties(homeFile, true); + + for (String id : ids) { + + Object value = location.get(id); + + if (value == null) { + location = location.inverseBidiMap(); + value = location.get(id); + } + + if (value != null) { + + FileSystemWIkittyId localisation = (FileSystemWIkittyId) value; + + String path = localisation.getPath(); + String fileName = localisation.getFileName(); + + // load properties + PropertiesExtended propsProperties = getWikittyPublicationProperties(new File( + path), WikittyPublication.WIKITTY_FILE_META_PROPERTIES_FILE); + + // update + propsProperties.remove(fileName + + WikittyPublication.META_SUFFIX_KEY_CHECKSUM); + propsProperties.remove(fileName + + WikittyPublication.META_SUFFIX_KEY_ID); + propsProperties.remove(fileName + + WikittyPublication.META_SUFFIX_KEY_VERSION); + + // resave + propsProperties.store(); + + // load properties + PropertiesExtended idProperties = getWikittyPublicationProperties(new File( + path), WikittyPublication.WIKITTY_ID_PROPERTIES_FILE); + // update + idProperties.remove(id); + // resave + idProperties.store(); + + File wikittyFile = new File(path + File.separator + + fileName); + + if (wikittyFile.exists()) { + wikittyFile.delete(); + } + + } + } + } catch (Exception e) { + e.printStackTrace(); + // TODO mfortun-2011-04-13 really handle exception + } + + WikittyEvent result = new WikittyEvent(this); + return result; } @Override @@ -689,15 +776,10 @@ * @return * @throws Exception */ - static public Map<String, FileSystemWIkittyId> harvestLocalWikitties( - File starts, boolean recursivly) throws Exception { - Map<String, FileSystemWIkittyId> result = new HashMap<String, FileSystemWIkittyId>(); + static public BidiMap harvestLocalWikitties(File starts, boolean recursivly) + throws Exception { + BidiMap result = new DualHashBidiMap(); - /* - * TODO mfortun-2011-04-12 find a better way to have cohesion class that - * call another class that call last class <_<. May be a class for file - * access/harvest method - */ List<File> propertiesDirectory = WikittyPublication .harvestPropertyDirectory(starts, recursivly); @@ -717,7 +799,7 @@ String path = propsDir.getParent(); FileSystemWIkittyId value = new FileSystemWIkittyId(name, path); - result.put((String) id, value); + result.put((String) id, value ); } } @@ -733,4 +815,26 @@ return result; } + static public PropertiesExtended getWikittyPublicationProperties(File starts, String name) + throws Exception { + + File propertieDirectory = new File(starts.getCanonicalPath() + + File.separator + WikittyPublication.PROPERTY_DIRECTORY); + + // load/create meta propertie file + File propertieFile = new File(propertieDirectory.getCanonicalPath() + + File.separator + + name); + if (!propertieFile.exists()) { + propertieFile.createNewFile(); + } + + PropertiesExtended result = new PropertiesExtended(propertieFile); + + return result; + } + + + + }