You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-commits@lucene.apache.org by ho...@apache.org on 2006/06/27 21:31:23 UTC
svn commit: r417565 [3/4] - in /lucene/java/trunk/contrib/gdata-server:
src/java/org/apache/lucene/gdata/data/
src/java/org/apache/lucene/gdata/server/administration/
src/java/org/apache/lucene/gdata/server/authentication/
src/java/org/apache/lucene/gd...
Added: lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/ResourceNotFoundException.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/ResourceNotFoundException.java?rev=417565&view=auto
==============================================================================
--- lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/ResourceNotFoundException.java (added)
+++ lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/ResourceNotFoundException.java Tue Jun 27 12:31:20 2006
@@ -0,0 +1,66 @@
+/**
+ * Copyright 2004 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.lucene.gdata.storage;
+
+/**
+ * This exception will be thrown if an requested resource of a resource to modify can not be found
+ * @author Simon Willnauer
+ *
+ */
+public class ResourceNotFoundException extends StorageException {
+
+
+ private static final long serialVersionUID = -8549987918130998249L;
+
+ /**
+ * Constructs an empty ResourceNotFoundException
+ */
+ public ResourceNotFoundException() {
+ super();
+ // TODO Auto-generated constructor stub
+ }
+
+ /**
+ * Constructs a new ResourceNotFoundException with an exception message
+ * @param message - the exception message
+ */
+ public ResourceNotFoundException(String message) {
+ super(message);
+ // TODO Auto-generated constructor stub
+ }
+
+ /**
+ * Constructs a new ResourceNotFoundException with an exception message and a root cause
+ * @param message - the exception message
+ * @param cause - the root cause of this exception
+ */
+ public ResourceNotFoundException(String message, Throwable cause) {
+ super(message, cause);
+ // TODO Auto-generated constructor stub
+ }
+
+ /**
+ * Constructs a new ResourceNotFoundException with a root cause
+ * @param cause - the root cause of this exception
+ *
+ */
+ public ResourceNotFoundException(Throwable cause) {
+ super(cause);
+ // TODO Auto-generated constructor stub
+ }
+
+}
Added: lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/StorageAccountWrapper.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/StorageAccountWrapper.java?rev=417565&view=auto
==============================================================================
--- lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/StorageAccountWrapper.java (added)
+++ lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/StorageAccountWrapper.java Tue Jun 27 12:31:20 2006
@@ -0,0 +1,111 @@
+package org.apache.lucene.gdata.storage.lucenestorage;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.lucene.document.Document;
+import org.apache.lucene.document.Field;
+import org.apache.lucene.gdata.data.GDataAccount;
+
+/**
+ * Wrapps a User Object.
+ * The wrapper provides also a Lucene repesentation of the user;
+ * User Objects will not be Buffered in the lucene storage component. Each User will be written imidialtely.
+ * @author Simon Willnauer
+ *
+ */
+public class StorageAccountWrapper implements StorageWrapper{
+ private static final Log LOG = LogFactory.getLog(StorageAccountWrapper.class);
+
+ /**
+ * Lucene field for the username
+ */
+ public static final String FIELD_ACCOUNTNAME = "accountName";
+ /**
+ * Lucene field for the password
+ */
+ public static final String FIELD_PASSWORD = "passwd";
+ /**
+ * Lucene field for the author name
+ */
+ public static final String FIELD_AUTHORNAME = "author";
+ /**
+ * Lucene field for the author mail address
+ */
+ public static final String FIELD_AUTHORMAIL = "authorMail";
+ /**
+ * Lucene field for the author link
+ */
+ public static final String FIELD_AUTHORHREF = "authorHref";
+ /**
+ * Lucene field fot the userroles
+ */
+ public static final String FIELD_ROLES = "userroles";
+ private final GDataAccount user;
+ /**
+ * @param user - the user to be wrapped
+ */
+ public StorageAccountWrapper(final GDataAccount user) {
+ if(user == null)
+ throw new IllegalArgumentException("user must not be null");
+ this.user = user;
+ }
+
+ /**
+ * @see org.apache.lucene.gdata.storage.lucenestorage.StorageWrapper#getLuceneDocument()
+ */
+ public Document getLuceneDocument() {
+ Document doc = new Document();
+
+ doc.add(new Field(FIELD_ACCOUNTNAME,this.user.getName(),Field.Store.YES,Field.Index.UN_TOKENIZED));
+ doc.add(new Field(FIELD_PASSWORD,this.user.getPassword()==null?"":this.user.getPassword(),Field.Store.YES,Field.Index.NO));
+ doc.add(new Field(FIELD_AUTHORNAME,this.user.getAuthorname()==null?"":this.user.getAuthorname(),Field.Store.YES,Field.Index.NO));
+ doc.add(new Field(FIELD_AUTHORMAIL,this.user.getAuthorMail()==null?"":this.user.getAuthorMail(),Field.Store.YES,Field.Index.NO));
+ doc.add(new Field(FIELD_AUTHORHREF,this.user.getAuthorLink()==null?"":this.user.getAuthorLink().toString(),Field.Store.YES,Field.Index.NO));
+ doc.add(new Field(FIELD_ROLES, Integer.toString(this.user.getRolesAsInt()),Field.Store.YES,Field.Index.NO));
+
+ return doc;
+ }
+
+
+
+
+ /**
+ * @param doc - a lucene document representation of an user
+ * @return - the user to build from the document. or <code>null</code> if the document is <code>null</code>
+ */
+ public static GDataAccount buildEntity(final Document doc){
+ if(doc == null)
+ return null;
+
+ GDataAccount user = new GDataAccount();
+ user.setName(doc.get(FIELD_ACCOUNTNAME));
+ user.setPassword(doc.get(FIELD_PASSWORD));
+ user.setAuthorname(doc.get(FIELD_AUTHORNAME));
+ user.setAuthorMail(doc.get(FIELD_AUTHORMAIL));
+ try{
+ user.setRolesAsInt(Integer.parseInt(doc.get(FIELD_ROLES)));
+ }catch (NumberFormatException e) {
+ LOG.info("Can't parse userroles: "+user.getName()+" throws NumberFormatException. -- skipping --",e);
+ }
+ try {
+ if(doc.get(FIELD_AUTHORHREF)!= null)
+ user.setAuthorLink(new URL(doc.get(FIELD_AUTHORHREF)));
+ } catch (MalformedURLException e) {
+ LOG.info("SPECIFIED URL for user: "+user.getName()+" throws MalformedURLException. -- skipping --",e);
+ }
+ return user;
+ }
+
+
+
+ /**
+ * @return - the wrapped user
+ */
+ public GDataAccount getUser() {
+ return this.user;
+ }
+
+}
Added: lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/StorageFeedWrapper.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/StorageFeedWrapper.java?rev=417565&view=auto
==============================================================================
--- lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/StorageFeedWrapper.java (added)
+++ lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/StorageFeedWrapper.java Tue Jun 27 12:31:20 2006
@@ -0,0 +1,106 @@
+/**
+ * Copyright 2004 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.lucene.gdata.storage.lucenestorage;
+
+import java.io.IOException;
+import java.io.StringWriter;
+
+import org.apache.lucene.document.Document;
+import org.apache.lucene.document.Field;
+import org.apache.lucene.gdata.data.ServerBaseFeed;
+import org.apache.lucene.gdata.server.registry.ProvidedService;
+
+import com.google.gdata.data.BaseFeed;
+import com.google.gdata.util.common.xml.XmlWriter;
+
+/**
+ * This immutable class wrapps <tt>GDataAccount</tt> instances for an internal Storage representation of
+ * an account. This class also acts as a Documentfactory for lucene documents to
+ * be stored inside the index.
+ * @author Simon Willnauer
+ *
+ */
+public class StorageFeedWrapper implements StorageWrapper {
+
+ private static final String INTERNAL_ENCODING = "UTF-8";
+ /**
+ * the account who owns the feed
+ */
+ public static final String FIELD_ACCOUNTREFERENCE = "accountReference";
+ /**
+ * the id of the feed
+ */
+ public static final String FIELD_FEED_ID = "feedId";
+ /**
+ * The xml feed representation
+ */
+ public static final String FIELD_CONTENT = "content";
+
+ /**
+ * The creation timestamp
+ */
+ public static final String FIELD_TIMESTAMP = "timestamp";
+
+ /**
+ * The Service this feed belongs to.
+ */
+ public static final String FIELD_SERVICE_ID = "serviceId";
+ private final ServerBaseFeed feed;
+ private final String accountName;
+ private final ProvidedService config;
+ private final String content;
+
+
+ /**
+ * @param feed
+ * @param accountname
+ * @throws IOException
+ *
+ */
+ public StorageFeedWrapper(final ServerBaseFeed feed, final String accountname) throws IOException {
+ this.feed = feed;
+ this.accountName = accountname;
+ this.config = feed.getServiceConfig();
+ this.content = buildContent();
+
+ }
+
+ /**
+ * @see org.apache.lucene.gdata.storage.lucenestorage.StorageWrapper#getLuceneDocument()
+ */
+ public Document getLuceneDocument() {
+ Document doc = new Document();
+ doc.add(new Field(FIELD_ACCOUNTREFERENCE,this.accountName,Field.Store.YES,Field.Index.UN_TOKENIZED));
+ doc.add(new Field(FIELD_FEED_ID,this.feed.getId(),Field.Store.YES,Field.Index.UN_TOKENIZED));
+ doc.add(new Field(FIELD_CONTENT,this.content,Field.Store.COMPRESS,Field.Index.NO));
+ doc.add(new Field(FIELD_SERVICE_ID,this.feed.getServiceType(),Field.Store.YES,Field.Index.NO));
+ return doc;
+ }
+
+ private String buildContent() throws IOException {
+ StringWriter writer = new StringWriter();
+ XmlWriter xmlWriter = new XmlWriter(writer, INTERNAL_ENCODING);
+ this.feed.generateAtom(xmlWriter,this.config.getExtensionProfile());
+ return writer.toString();
+ }
+ /**
+ * @return - the wrapped feed
+ */
+ public BaseFeed getFeed(){
+ return this.feed.getFeed();
+ }
+}
Added: lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/StorageWrapper.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/StorageWrapper.java?rev=417565&view=auto
==============================================================================
--- lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/StorageWrapper.java (added)
+++ lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/StorageWrapper.java Tue Jun 27 12:31:20 2006
@@ -0,0 +1,38 @@
+/**
+ * Copyright 2004 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.lucene.gdata.storage.lucenestorage;
+
+import org.apache.lucene.document.Document;
+
+/**
+ * A interface to be implemented by <tt>StorageWrapper</tt> sub classes to
+ * provide a lucene document for each entity wrapped.
+ *
+ * @see org.apache.lucene.gdata.storage.lucenestorage.StorageEntryWrapper
+ * @see org.apache.lucene.gdata.storage.lucenestorage.StorageAccountWrapper
+ * @see org.apache.lucene.gdata.storage.lucenestorage.StorageFeedWrapper
+ * @author Simon Willnauer
+ *
+ */
+public interface StorageWrapper {
+ /**
+ * Returns a Lucene document representing the Wrapped Entry
+ *
+ * @return a Lucene Document
+ */
+ public abstract Document getLuceneDocument();
+}
Added: lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/recover/RecoverController.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/recover/RecoverController.java?rev=417565&view=auto
==============================================================================
--- lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/recover/RecoverController.java (added)
+++ lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/recover/RecoverController.java Tue Jun 27 12:31:20 2006
@@ -0,0 +1,169 @@
+/**
+ * Copyright 2004 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.lucene.gdata.storage.lucenestorage.recover;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.Writer;
+import java.util.List;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.lucene.gdata.storage.StorageException;
+import org.apache.lucene.gdata.storage.lucenestorage.StorageEntryWrapper;
+import org.apache.lucene.gdata.storage.lucenestorage.StorageModifier;
+import org.apache.lucene.gdata.storage.lucenestorage.StorageEntryWrapper.StorageOperation;
+
+
+/**
+ * @author Simon Willnauer
+ *
+ */
+public class RecoverController {
+ private static final Log LOG = LogFactory.getLog(RecoverController.class);
+ private final File recoverDirectory;
+
+ private static final String FILE_SUFFIX = ".rec";
+
+ private File currentRecoverFile;
+
+ private RecoverWriter writer;
+
+ private Writer fileWriter;
+
+ private BufferedReader fileReader;
+
+ private RecoverReader reader;
+
+ private Lock lock = new ReentrantLock();
+
+ private final boolean recover;
+ private final boolean keepRecoverFiles;
+
+ public RecoverController(final File recoverDirectory, boolean recover, boolean keepRecoverFiles) {
+ if (recoverDirectory == null)
+ throw new IllegalArgumentException("directory must not be null");
+ if (!recoverDirectory.isDirectory())
+ throw new IllegalStateException("the given File is not a directory");
+ this.recover = recover;
+ this.keepRecoverFiles = keepRecoverFiles;
+ this.recoverDirectory = recoverDirectory;
+
+ }
+
+ public void storageModified(StorageEntryWrapper wrapper)
+ throws RecoverException {
+ // prevent deadlock either recovering or writing
+ if(this.recover){
+ LOG.warn("Can't write entry, Recovercontroller is initialized in recover mode");
+ return;
+ }
+ this.lock.lock();
+ try {
+
+ this.writer.writeEntry(wrapper, this.fileWriter);
+ } catch (Exception e) {
+ LOG.error("Writing entry failed -- create new recover file",e);
+ throw new RecoverException(
+ "Writing entry failed -- create new recover file",e);
+
+ } finally {
+ this.lock.unlock();
+ }
+ }
+
+ public void recoverEntries(final StorageModifier modifier){
+ // prevent deadlock either recovering or writing
+ if(!this.recover){
+ LOG.warn("Can't recover entries, Recovercontroller is initialized in write mode");
+ return;
+ }
+ this.lock.lock();
+ try{
+ this.reader = new RecoverReader();
+ File[] files = this.recoverDirectory.listFiles();
+ for (int i = 0; i < files.length; i++) {
+ if(!files[i].isDirectory()){
+ try{
+ this.fileReader = new BufferedReader(new FileReader(files[i]));
+ List<StorageEntryWrapper> entryList = this.reader.recoverEntries(this.fileReader);
+ if(entryList.size() == 0)
+ continue;
+ storeEntries(entryList,modifier);
+ this.fileReader.close();
+ if(!this.keepRecoverFiles)
+ files[i].delete();
+ }catch (StorageException e) {
+ LOG.error("Can't store recover entries for file: "+files[i].getName()+" -- keep file "+e.getMessage(),e);
+ }catch (IOException e) {
+ LOG.error("Can't recover entries for file: "+files[i].getName()+" -- keep file",e);
+ }
+ }
+ }
+
+ }finally{
+ this.lock.unlock();
+ }
+ }
+
+ protected void storeEntries(final List<StorageEntryWrapper> entries, final StorageModifier modifier) throws StorageException{
+ for (StorageEntryWrapper wrapper : entries) {
+ if(wrapper.getOperation() == StorageOperation.DELETE)
+ modifier.deleteEntry(wrapper);
+ else if(wrapper.getOperation() == StorageOperation.INSERT)
+ modifier.insertEntry(wrapper);
+ else if(wrapper.getOperation() == StorageOperation.UPDATE)
+ modifier.updateEntry(wrapper);
+
+
+ }
+ }
+
+ protected synchronized void initialize() throws IOException {
+ if(this.recover)
+ return;
+ String filename = System.currentTimeMillis() + FILE_SUFFIX;
+ this.currentRecoverFile = new File(this.recoverDirectory, filename);
+ this.writer = new RecoverWriter();
+ this.fileWriter = new BufferedWriter(new FileWriter(
+ this.currentRecoverFile));
+
+ }
+
+ protected void destroy() throws RecoverException {
+ if (this.fileWriter != null) {
+ this.lock.lock();
+ try {
+ this.fileWriter.flush();
+ this.fileWriter.close();
+ } catch (IOException e) {
+ throw new RecoverException("Can't close recover writer ", e);
+ } finally {
+ this.lock.unlock();
+ }
+ }
+ }
+
+
+
+}
Added: lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/recover/RecoverException.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/recover/RecoverException.java?rev=417565&view=auto
==============================================================================
--- lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/recover/RecoverException.java (added)
+++ lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/recover/RecoverException.java Tue Jun 27 12:31:20 2006
@@ -0,0 +1,63 @@
+/**
+ * Copyright 2004 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.lucene.gdata.storage.lucenestorage.recover;
+
+/**
+ * @author Simon Willnauer
+ *
+ */
+public class RecoverException extends Exception {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = -1862309520257024464L;
+
+ /**
+ *
+ */
+ public RecoverException() {
+ super();
+ // TODO Auto-generated constructor stub
+ }
+
+ /**
+ * @param arg0
+ */
+ public RecoverException(String arg0) {
+ super(arg0);
+ // TODO Auto-generated constructor stub
+ }
+
+ /**
+ * @param arg0
+ * @param arg1
+ */
+ public RecoverException(String arg0, Throwable arg1) {
+ super(arg0, arg1);
+ // TODO Auto-generated constructor stub
+ }
+
+ /**
+ * @param arg0
+ */
+ public RecoverException(Throwable arg0) {
+ super(arg0);
+ // TODO Auto-generated constructor stub
+ }
+
+}
Added: lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/recover/RecoverReader.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/recover/RecoverReader.java?rev=417565&view=auto
==============================================================================
--- lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/recover/RecoverReader.java (added)
+++ lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/recover/RecoverReader.java Tue Jun 27 12:31:20 2006
@@ -0,0 +1,174 @@
+/**
+ * Copyright 2004 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.lucene.gdata.storage.lucenestorage.recover;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.StringTokenizer;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.lucene.gdata.data.ServerBaseEntry;
+import org.apache.lucene.gdata.server.GDataEntityBuilder;
+import org.apache.lucene.gdata.server.registry.GDataServerRegistry;
+import org.apache.lucene.gdata.server.registry.ProvidedService;
+import org.apache.lucene.gdata.storage.lucenestorage.StorageEntryWrapper;
+import org.apache.lucene.gdata.storage.lucenestorage.StorageEntryWrapper.StorageOperation;
+
+import com.google.gdata.data.BaseEntry;
+import com.google.gdata.util.ParseException;
+
+/**
+ * Recovers the written object from the harddisc
+ * @author Simon Willnauer
+ *
+ */
+public class RecoverReader {
+
+ private static final Log LOG = LogFactory.getLog(RecoverReader.class);
+ private RecoverStrategy strategy;
+ protected RecoverReader(){
+ this.strategy = new RecoverStrategy();
+ }
+ /**
+ * @param reader
+ * @return
+ * @throws IOException
+ */
+ public List<StorageEntryWrapper> recoverEntries(final BufferedReader reader) throws IOException{
+ List<StorageEntryWrapper> actionList = new ArrayList<StorageEntryWrapper>();
+ this.strategy = new RecoverStrategy();
+ String input = null;
+ String metaData = null;
+ String entryData = null;
+ while((input=reader.readLine())!= null){
+ if(metaData == null){
+ metaData = input;
+ continue;
+ }
+ if(input.equals(RecoverWriter.STORAGE_OPERATION_SEPARATOR)){
+ try{
+ actionList.add(this.strategy.recover(metaData,entryData));
+ }catch (RecoverException e) {
+ LOG.error("Skipping recover entry for metadata: "+metaData,e);
+ }
+ this.strategy = new RecoverStrategy();
+ metaData = null;
+ entryData = null;
+ continue;
+ }
+ if(entryData == null){
+ entryData = input;
+ }
+
+ }
+
+
+
+ return actionList;
+
+ }
+
+
+
+
+
+
+
+
+ private static class RecoverStrategy{
+ private StorageOperation operation;
+ private ProvidedService config;
+ private String feedId;
+ private String entryId;
+ private long timestamp;
+ /**
+ * @param metaData
+ * @param entry
+ * @return
+ * @throws RecoverException
+ */
+ public StorageEntryWrapper recover(String metaData, String entry) throws RecoverException{
+ fillMetaData(metaData);
+ ServerBaseEntry retVal = null;
+ if(entry != null && this.operation == StorageOperation.DELETE)
+ throw new RecoverException("Can not recover -- Delete operation has entry part");
+ if(entry != null)
+ try {
+ retVal = new ServerBaseEntry(buildEntry(entry,this.config));
+ } catch (Exception e) {
+ throw new RecoverException("Exception occured while building entry -- "+e.getMessage(),e);
+ }
+ else
+ retVal = new ServerBaseEntry();
+ retVal.setId(this.entryId);
+ retVal.setFeedId(this.feedId);
+ retVal.setServiceConfig(this.config);
+
+ try{
+ return new StorageEntryWrapper(retVal,this.operation);
+ }catch (IOException e) {
+ throw new RecoverException("Can't create StorageWrapper -- "+e.getMessage(),e);
+ }
+ }
+ private void fillMetaData(String recoverString) throws RecoverException{
+ StringTokenizer tokenizer = new StringTokenizer(recoverString,RecoverWriter.META_DATA_SEPARATOR);
+ String temp = tokenizer.nextToken();
+ if(temp.equals("D"))
+ this.operation = StorageOperation.DELETE;
+ else if(temp.equals("U"))
+ this.operation = StorageOperation.UPDATE;
+ else if(temp.equals("I"))
+ this.operation = StorageOperation.INSERT;
+ else
+ throw new RecoverException("Illegal metadata --- "+recoverString);
+ temp = tokenizer.nextToken();
+ if(temp == null)
+ throw new RecoverException("Can't recover feed Id -- "+temp);
+ this.feedId = temp;
+ temp = tokenizer.nextToken();
+ if(temp == null)
+ throw new RecoverException("Can't recover entry Id -- "+temp);
+ this.entryId = temp;
+
+ temp = tokenizer.nextToken();
+ try{
+ this.timestamp = Long.parseLong(temp);
+ }catch (Exception e) {
+ throw new RecoverException("Can't recover timestamp -- "+temp,e);
+ }
+
+ if(this.operation != StorageOperation.DELETE){
+ temp = tokenizer.nextToken();
+ if(temp == null)
+ throw new RecoverException("Can't recover service -- "+temp);
+ if(!GDataServerRegistry.getRegistry().isServiceRegistered(temp))
+ throw new RecoverException("Service in recover metadata is not registered - "+temp);
+ this.config = GDataServerRegistry.getRegistry().getProvidedService(temp);
+
+ }
+
+ }
+
+ private BaseEntry buildEntry(String entry, ProvidedService serviceConfig) throws ParseException, IOException{
+ StringReader reader = new StringReader(entry);
+ return GDataEntityBuilder.buildEntry(reader,serviceConfig);
+ }
+ }
+}
Added: lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/recover/RecoverWriter.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/recover/RecoverWriter.java?rev=417565&view=auto
==============================================================================
--- lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/recover/RecoverWriter.java (added)
+++ lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/recover/RecoverWriter.java Tue Jun 27 12:31:20 2006
@@ -0,0 +1,104 @@
+/**
+ * Copyright 2004 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.lucene.gdata.storage.lucenestorage.recover;
+
+import java.io.IOException;
+import java.io.Writer;
+
+import org.apache.lucene.gdata.server.registry.ProvidedService;
+import org.apache.lucene.gdata.storage.lucenestorage.StorageEntryWrapper;
+import org.apache.lucene.gdata.storage.lucenestorage.StorageEntryWrapper.StorageOperation;
+
+import com.google.gdata.data.BaseEntry;
+import com.google.gdata.util.common.xml.XmlWriter;
+
+/**
+ * Writes the recover objects to the hard disc.
+ * @author Simon Willnauer
+ *
+ */
+public class RecoverWriter {
+ protected static final String META_DATA_SEPARATOR = ";";
+ protected static final String META_DATA_ENTRY_SEPARATOR = System.getProperty("line.separator");
+ protected static final String STORAGE_OPERATION_SEPARATOR = "###########";
+ protected static final String OPERATION_DELETE = "D";
+ protected static final String OPERATION_UPDATE = "U";
+ protected static final String OPERATION_INSERT = "I";
+ protected static final String FILE_PREFIX = ".strg";
+
+
+
+ /**
+ * @param wrapper
+ * @throws IOException
+ *
+ *
+ *
+ */
+ public void writeEntry(StorageEntryWrapper wrapper,Writer writer)throws IOException{
+
+ writeOperation(wrapper.getOperation(),writer);
+ writeFeedID(wrapper.getFeedId(),writer);
+ writeEntryID(wrapper.getEntryId(),writer);
+ writeTimeStamp(wrapper.getTimestamp().toString(),writer);
+ if(!wrapper.getOperation().equals(StorageOperation.DELETE)){
+ writeService(wrapper,writer);
+ writer.write(META_DATA_ENTRY_SEPARATOR);
+ BaseEntry entry = wrapper.getEntry();
+ XmlWriter xmlWriter = new XmlWriter(writer);
+ entry.generateAtom(xmlWriter,wrapper.getConfigurator().getExtensionProfile());
+ }
+ writer.write(META_DATA_ENTRY_SEPARATOR);
+ writer.write(STORAGE_OPERATION_SEPARATOR);
+ writer.write(META_DATA_ENTRY_SEPARATOR);
+ }
+
+
+
+ private void writeTimeStamp(String timestamp, Writer writer) throws IOException{
+ writer.write(timestamp);
+ writer.write(META_DATA_SEPARATOR);
+ }
+ private void writeFeedID(String feedId,Writer writer) throws IOException{
+ writer.write(feedId);
+ writer.write(META_DATA_SEPARATOR);
+ }
+ private void writeEntryID(String entryId,Writer writer) throws IOException{
+ writer.write(entryId);
+ writer.write(META_DATA_SEPARATOR);
+ }
+
+ private void writeService(StorageEntryWrapper wrapper, Writer writer) throws IOException{
+ ProvidedService config = wrapper.getConfigurator();
+ writer.write(config.getName());
+ writer.write(META_DATA_SEPARATOR);
+ }
+
+ private void writeOperation(StorageOperation operation, Writer writer) throws IOException{
+ if(operation.equals(StorageOperation.INSERT))
+ writer.write(OPERATION_INSERT);
+ else if (operation.equals(StorageOperation.UPDATE))
+ writer.write(OPERATION_UPDATE);
+ else if (operation.equals(StorageOperation.DELETE))
+ writer.write(OPERATION_DELETE);
+ writer.write(META_DATA_SEPARATOR);
+ }
+
+
+
+
+}
Added: lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/recover/package.html
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/recover/package.html?rev=417565&view=auto
==============================================================================
--- lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/recover/package.html (added)
+++ lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/recover/package.html Tue Jun 27 12:31:20 2006
@@ -0,0 +1,10 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="Author" content="Simon Willnauer">
+</head>
+<body>
+Recovering component for the lucene storage
+</body>
+</html>
Added: lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/utils/DateFormater.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/utils/DateFormater.java?rev=417565&view=auto
==============================================================================
--- lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/utils/DateFormater.java (added)
+++ lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/utils/DateFormater.java Tue Jun 27 12:31:20 2006
@@ -0,0 +1,125 @@
+/**
+ * Copyright 2004 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.lucene.gdata.utils;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Stack;
+
+/**
+ * This class uses the {@link java.text.SimpleDateFormat} class to format dates
+ * into strings according to given date pattern.
+ * <p>
+ * As the creation of <tt>SimpleDateFormat</tt> objects is quiet expensive and
+ * formating dates is used quiet fequently the objects will be cached and reused
+ * in subsequent calls.
+ * </p>
+ * <p>
+ * This implementation is thread safe as it uses {@link java.util.Stack} as a
+ * cache
+ * </p>
+ *
+ * @author Simon Willnauer
+ *
+ */
+public class DateFormater {
+ private final Stack<SimpleDateFormat> objectStack = new Stack<SimpleDateFormat>();
+
+ private static final DateFormater formater = new DateFormater();
+
+ /**
+ * Date format as it is used in Http Last modified header (Tue, 15 Nov 1994
+ * 12:45:26 GMT)
+ */
+ public static String HTTP_HEADER_DATE_FORMAT = "EEE, d MMM yyyy HH:mm:ss z";
+ /**
+ * Date format as it is used in Http Last modified header (Tue, 15 Nov 1994
+ * 12:45:26 +0000)
+ */
+ public static String HTTP_HEADER_DATE_FORMAT_TIME_OFFSET = "EEE, d MMM yyyy HH:mm:ss Z";
+
+ private DateFormater() {
+ super();
+ }
+
+ /**
+ * Formats the given Date into the given date pattern.
+ *
+ * @param date -
+ * the date to format
+ * @param format -
+ * date pattern
+ * @return - the string representation of the given <tt>Date</tt>
+ * according to the given pattern
+ */
+ public static String formatDate(final Date date, String format) {
+ if (date == null || format == null)
+ throw new IllegalArgumentException(
+ "given parameters must not be null");
+ SimpleDateFormat inst = formater.getFormater();
+ inst.applyPattern(format);
+ formater.returnFomater(inst);
+ return inst.format(date);
+ }
+ /**
+ * Parses the given string into one of the specified formates
+ * @param date - the string to parse
+ * @param formates - formates
+ * @return a {@link Date} instance representing the given string
+ * @throws ParseException - if the string can not be parsed
+ */
+ public static Date parseDate(final String date, final String...formates) throws ParseException{
+ for (int i = 0; i < formates.length; i++) {
+ try {
+ return parseDate(date,formates[i]);
+ } catch (ParseException e) {
+ //
+ }
+ }
+ throw new ParseException("Unparseable date: "+date,0);
+
+ }
+
+ /**
+ * Parses the given string into the specified formate
+ * @param dateString - the string to parse
+ * @param pattern - the expected formate
+ * @return a {@link Date} instance representing the given string
+ * @throws ParseException - if the string can not be parsed
+ */
+ public static Date parseDate(final String dateString,String pattern) throws ParseException{
+ if(dateString == null|| pattern == null)
+ throw new IllegalArgumentException(
+ "given parameters must not be null");
+ SimpleDateFormat inst = formater.getFormater();
+ inst.applyPattern(pattern);
+ return inst.parse(dateString);
+ }
+
+ private SimpleDateFormat getFormater() {
+ if (this.objectStack.empty())
+ return new SimpleDateFormat();
+ return this.objectStack.pop();
+ }
+
+ private void returnFomater(final SimpleDateFormat format) {
+ if (this.objectStack.size() <= 25)
+ this.objectStack.push(format);
+ }
+
+}
Added: lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/utils/package.html
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/utils/package.html?rev=417565&view=auto
==============================================================================
--- lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/utils/package.html (added)
+++ lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/utils/package.html Tue Jun 27 12:31:20 2006
@@ -0,0 +1,10 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="Author" content="Simon Willnauer">
+</head>
+<body>
+Utils package
+</body>
+</html>
Added: lucene/java/trunk/contrib/gdata-server/src/test/gdata-config.xml
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/src/test/gdata-config.xml?rev=417565&view=auto
==============================================================================
--- lucene/java/trunk/contrib/gdata-server/src/test/gdata-config.xml (added)
+++ lucene/java/trunk/contrib/gdata-server/src/test/gdata-config.xml Tue Jun 27 12:31:20 2006
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gdata>
+ <service name="feed" public="true">
+ <feed-class>com.google.gdata.data.Feed</feed-class>
+ <entry-class>com.google.gdata.data.Entry</entry-class>
+ <extension-profile>
+ com.google.gdata.data.ExtensionProfile
+ </extension-profile>
+ </service>
+ <service name="calendar" public="true">
+ <feed-class>
+ com.google.gdata.data.extensions.EventFeed
+ </feed-class>
+ <entry-class>
+ com.google.gdata.data.extensions.EventEntry
+ </entry-class>
+ <extension-profile>
+ com.google.gdata.data.ExtensionProfile
+ </extension-profile>
+ </service>
+ <server-components>
+ <component>
+ org.apache.lucene.gdata.storage.lucenestorage.StorageCoreController
+ </component>
+ <component>
+ org.apache.lucene.gdata.servlet.handler.DefaultRequestHandlerFactory
+ </component>
+ <component>
+ org.apache.lucene.gdata.server.ServiceFactory
+ </component>
+ <component>
+ org.apache.lucene.gdata.server.authentication.BlowfishAuthenticationController
+ </component>
+ </server-components>
+</gdata>
\ No newline at end of file
Added: lucene/java/trunk/contrib/gdata-server/src/test/lucenestorage.properties.xml
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/src/test/lucenestorage.properties.xml?rev=417565&view=auto
==============================================================================
--- lucene/java/trunk/contrib/gdata-server/src/test/lucenestorage.properties.xml (added)
+++ lucene/java/trunk/contrib/gdata-server/src/test/lucenestorage.properties.xml Tue Jun 27 12:31:20 2006
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
+<properties>
+<comment>Lucene Storage Properties</comment>
+<entry key="gdata.server.storage.lucene.buffersize">20</entry>
+<entry key="gdata.server.storage.lucene.optimizeInterval">20</entry>
+<entry key="gdata.server.storage.lucene.persistFactor">20</entry>
+<entry key="gdata.server.storage.lucene.directory.ramDirectory">true</entry>
+<entry key="gdata.server.storage.lucene.directory">/tmp/storage/</entry>
+<entry key="gdata.server.storage.lucene.recover">true</entry>
+<entry key="gdata.server.storage.lucene.recover.keepFiles">false</entry>
+</properties>
Added: lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/data/TestGDataUser.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/data/TestGDataUser.java?rev=417565&view=auto
==============================================================================
--- lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/data/TestGDataUser.java (added)
+++ lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/data/TestGDataUser.java Tue Jun 27 12:31:20 2006
@@ -0,0 +1,65 @@
+package org.apache.lucene.gdata.data;
+
+import org.apache.lucene.gdata.data.GDataAccount.AccountRole;
+
+import junit.framework.TestCase;
+
+public class TestGDataUser extends TestCase {
+ private GDataAccount user;
+ @Override
+ protected void setUp() throws Exception {
+ this.user = new GDataAccount();
+ this.user.setName("simon");
+ super.setUp();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+
+ super.tearDown();
+ }
+
+ /*
+ * Test method for 'org.apache.lucene.gdata.data.GDataUser.isUserInRole(UserRole)'
+ */
+ public void testIsUserInRole() {
+ assertTrue(this.user.isUserInRole(AccountRole.USER));
+ assertFalse(this.user.isUserInRole(AccountRole.ENTRYAMINISTRATOR));
+ this.user.setRole(AccountRole.ENTRYAMINISTRATOR);
+ assertTrue(this.user.isUserInRole(AccountRole.ENTRYAMINISTRATOR));
+ }
+
+ /*
+ * Test method for 'org.apache.lucene.gdata.data.GDataUser.getRolesAsInt()'
+ */
+ public void testGetRolesAsInt() {
+ assertEquals(1,this.user.getRolesAsInt());
+ this.user.setRole(AccountRole.ENTRYAMINISTRATOR);
+ assertEquals(3,this.user.getRolesAsInt());
+ this.user.setRole(AccountRole.FEEDAMINISTRATOR);
+ assertEquals(7,this.user.getRolesAsInt());
+ this.user.setRole(AccountRole.USERADMINISTRATOR);
+ assertEquals(15,this.user.getRolesAsInt());
+
+ }
+
+ /*
+ * Test method for 'org.apache.lucene.gdata.data.GDataUser.setRolesAsInt(int)'
+ */
+ public void testSetRolesAsInt() {
+ this.user.setRolesAsInt(2);
+ this.user.setRolesAsInt(4);
+ this.user.setRolesAsInt(8);
+ assertEquals(4,this.user.getRoles().size());
+ this.user.setRolesAsInt(15);
+ assertEquals(4,this.user.getRoles().size());
+ this.user = new GDataAccount();
+ this.user.setName("simon");
+ this.user.setRolesAsInt(15);
+ assertEquals(4,this.user.getRoles().size());
+
+ }
+
+
+
+}
Added: lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/server/administration/TestAccountBuilder.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/server/administration/TestAccountBuilder.java?rev=417565&view=auto
==============================================================================
--- lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/server/administration/TestAccountBuilder.java (added)
+++ lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/server/administration/TestAccountBuilder.java Tue Jun 27 12:31:20 2006
@@ -0,0 +1,54 @@
+package org.apache.lucene.gdata.server.administration;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.net.URL;
+
+import junit.framework.TestCase;
+
+import org.apache.lucene.gdata.data.GDataAccount;
+import org.apache.lucene.gdata.data.GDataAccount.AccountRole;
+import org.xml.sax.SAXException;
+
+public class TestAccountBuilder extends TestCase {
+ private StringReader reader;
+ private String inputXML;
+ protected void setUp() throws Exception {
+ this.inputXML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
+ "<account>" +
+ "<account-name>simon</account-name>" +
+ "<password>simon</password>" +
+ "<account-role>6</account-role>" +
+ "<account-owner>" +
+ "<name>simon willnauer</name>" +
+ "<email-address>simon@gmail.com</email-address>" +
+ "<url>http://www.javawithchopsticks.de</url>" +
+ "</account-owner>" +
+ "</account>";
+
+ this.reader = new StringReader(this.inputXML);
+
+ }
+
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ /*
+ * Test method for 'org.apache.lucene.gdata.server.administration.AdminEntityBuilder.buildUser(Reader)'
+ */
+ public void testBuildUser() throws IOException, SAXException {
+
+ GDataAccount user = AccountBuilder.buildAccount(this.reader);
+ assertEquals("simon",user.getName());
+ assertEquals("simon willnauer",user.getAuthorname());
+ assertEquals("simon@gmail.com",user.getAuthorMail());
+ assertEquals("simon",user.getPassword());
+ assertEquals(new URL("http://www.javawithchopsticks.de"),user.getAuthorLink());
+ assertTrue(user.isUserInRole(AccountRole.ENTRYAMINISTRATOR));
+ assertTrue(user.isUserInRole(AccountRole.FEEDAMINISTRATOR));
+ assertFalse(user.isUserInRole(AccountRole.USERADMINISTRATOR));
+
+ }
+
+}
Added: lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/server/authentication/TestBlowfishAuthenticationController.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/server/authentication/TestBlowfishAuthenticationController.java?rev=417565&view=auto
==============================================================================
--- lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/server/authentication/TestBlowfishAuthenticationController.java (added)
+++ lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/server/authentication/TestBlowfishAuthenticationController.java Tue Jun 27 12:31:20 2006
@@ -0,0 +1,94 @@
+/**
+ * Copyright 2004 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.lucene.gdata.server.authentication;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.IllegalBlockSizeException;
+
+import org.apache.lucene.gdata.data.GDataAccount;
+import org.apache.lucene.gdata.data.GDataAccount.AccountRole;
+
+import junit.framework.TestCase;
+
+/**
+ * @author Simon Willnauer
+ *
+ */
+public class TestBlowfishAuthenticationController extends TestCase {
+ private BlowfishAuthenticationController controller;
+ private String key = "myKey";
+ private String accountName = "simon";
+
+ private String clientIp = "192.168.0.127";
+ protected void setUp() throws Exception {
+ this.controller = new BlowfishAuthenticationController();
+ this.controller.setKey(this.key);
+
+ this.controller.initialize();
+ }
+
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ /*
+ * Test method for 'org.apache.lucene.gdata.server.authentication.AuthenticationController.authenticatAccount(HttpServletRequest)'
+ */
+ public void testAuthenticatAccount() throws IllegalBlockSizeException, BadPaddingException, AuthenticationException, IOException {
+ GDataAccount account = new GDataAccount();
+ account.setName(accountName);
+ account.setPassword("testme");
+ account.setRole(AccountRole.ENTRYAMINISTRATOR);
+
+ String token = this.controller.authenticatAccount(account,this.clientIp);
+ String notSame = this.controller.calculateAuthToken("192.168.0",Integer.toString(account.getRolesAsInt()),this.accountName);
+ assertNotSame(notSame,token);
+ String authString = "192.168.0#"+this.accountName +"#"+account.getRolesAsInt()+"#";
+ assertTrue(this.controller.deCryptAuthToken(token).startsWith(authString));
+ assertTrue(this.controller.deCryptAuthToken(notSame).startsWith(authString));
+ }
+
+ /*
+ * Test method for 'org.apache.lucene.gdata.server.authentication.AuthenticationController.authenticateToken(String)'
+ */
+ public void testAuthenticateToken() throws IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException, AuthenticationException {
+ GDataAccount account = new GDataAccount();
+ account.setName("simon");
+ account.setPassword("testme");
+ account.setRole(AccountRole.ENTRYAMINISTRATOR);
+ String token = this.controller.calculateAuthToken("192.168.0",Integer.toString(account.getRolesAsInt()),this.accountName);
+
+ assertTrue(this.controller.authenticateToken(token,this.clientIp,AccountRole.ENTRYAMINISTRATOR,this.accountName));
+ assertTrue(this.controller.authenticateToken(token,this.clientIp,AccountRole.USER,this.accountName));
+ assertFalse(this.controller.authenticateToken(token,this.clientIp,AccountRole.USERADMINISTRATOR,"someOtherAccount"));
+ try{
+ this.controller.authenticateToken(token+"test",this.clientIp,AccountRole.ENTRYAMINISTRATOR,this.accountName);
+ fail("exception expected");
+ }catch (Exception e) {
+ // TODO: handle exception
+ }
+ this.controller.setMinuteOffset(0);
+ assertFalse(this.controller.authenticateToken(token,this.clientIp,AccountRole.ENTRYAMINISTRATOR,this.accountName));
+
+ }
+
+
+
+}
Added: lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/servlet/handler/TestAbstractFeedHandler.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/servlet/handler/TestAbstractFeedHandler.java?rev=417565&view=auto
==============================================================================
--- lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/servlet/handler/TestAbstractFeedHandler.java (added)
+++ lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/servlet/handler/TestAbstractFeedHandler.java Tue Jun 27 12:31:20 2006
@@ -0,0 +1,213 @@
+/**
+ * Copyright 2004 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.lucene.gdata.servlet.handler;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import junit.framework.TestCase;
+
+import org.apache.lucene.gdata.data.GDataAccount;
+import org.apache.lucene.gdata.data.ServerBaseFeed;
+import org.apache.lucene.gdata.server.ServiceException;
+import org.apache.lucene.gdata.server.ServiceFactory;
+import org.apache.lucene.gdata.server.administration.AdminService;
+import org.apache.lucene.gdata.server.registry.ComponentType;
+import org.apache.lucene.gdata.server.registry.GDataServerRegistry;
+import org.apache.lucene.gdata.server.registry.RegistryException;
+import org.apache.lucene.gdata.servlet.handler.AbstractFeedHandler.FeedHandlerException;
+import org.apache.lucene.gdata.utils.ProvidedServiceStub;
+import org.apache.lucene.gdata.utils.ServiceFactoryStub;
+import org.apache.lucene.gdata.utils.StorageStub;
+import org.easymock.MockControl;
+
+import com.google.gdata.util.ParseException;
+
+/**
+ * @author Simon Willnauer
+ *
+ */
+public class TestAbstractFeedHandler extends TestCase {
+ private MockControl requestMockControl;
+
+ private HttpServletRequest mockRequest = null;
+
+ private String accountName = "acc";
+ private MockControl adminServiceMockControl;
+ private AdminService adminService = null;
+ private ServiceFactoryStub stub;
+ private String serviceName = StorageStub.SERVICE_TYPE_RETURN;
+ private static File incomingFeed = new File("src/test/org/apache/lucene/gdata/server/registry/TestEntityBuilderIncomingFeed.xml");
+ BufferedReader reader;
+ static{
+
+ try {
+
+ GDataServerRegistry.getRegistry().registerComponent(StorageStub.class);
+ GDataServerRegistry.getRegistry().registerComponent(ServiceFactoryStub.class);
+ } catch (RegistryException e) {
+
+ e.printStackTrace();
+ }
+ }
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ GDataServerRegistry.getRegistry().registerService(new ProvidedServiceStub());
+ this.requestMockControl = MockControl.createControl(HttpServletRequest.class);
+ this.adminServiceMockControl = MockControl.createControl(AdminService.class);
+ this.adminService = (AdminService)this.adminServiceMockControl.getMock();
+ this.mockRequest = (HttpServletRequest)this.requestMockControl.getMock();
+ this.stub = (ServiceFactoryStub)GDataServerRegistry.getRegistry().lookup(ServiceFactory.class,ComponentType.SERVICEFACTORY);
+ this.stub.setAdminService(this.adminService);
+ this.reader = new BufferedReader(new FileReader(incomingFeed));
+ }
+
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ /*
+ * Test method for 'org.apache.lucene.gdata.servlet.handler.AbstractFeedHandler.createFeedFromRequest(HttpServletRequest)'
+ */
+ public void testCreateFeedFromRequest() throws ParseException, IOException, FeedHandlerException {
+
+ this.requestMockControl.expectAndDefaultReturn(this.mockRequest
+ .getParameter("service"), this.serviceName);
+ this.requestMockControl.expectAndReturn(this.mockRequest.getReader(),this.reader);
+ this.requestMockControl.replay();
+ AbstractFeedHandler handler = new InsertFeedHandler();
+ try{
+ ServerBaseFeed feed = handler.createFeedFromRequest(this.mockRequest);
+ assertNotNull(feed.getId());
+
+ }catch (Exception e) {
+ e.printStackTrace();
+ fail("unexpected exception -- "+e.getMessage());
+
+ }
+ this.requestMockControl.verify();
+ this.requestMockControl.reset();
+ /*
+ * Test for not registered service
+ */
+ this.requestMockControl.expectAndDefaultReturn(this.mockRequest
+ .getParameter("service"), "some other service");
+ this.requestMockControl.replay();
+ handler = new InsertFeedHandler();
+ try{
+ ServerBaseFeed feed = handler.createFeedFromRequest(this.mockRequest);
+
+ fail(" exception expected");
+ }catch (FeedHandlerException e) {
+ e.printStackTrace();
+ assertEquals(HttpServletResponse.SC_NOT_FOUND,handler.getErrorCode());
+ }
+ this.requestMockControl.verify();
+
+ this.requestMockControl.reset();
+ /*
+ * Test for IOException
+ */
+ this.requestMockControl.expectAndDefaultReturn(this.mockRequest
+ .getParameter("service"), this.serviceName);
+ this.reader.close();
+ this.requestMockControl.expectAndReturn(this.mockRequest.getReader(),this.reader);
+ this.requestMockControl.replay();
+ handler = new InsertFeedHandler();
+ try{
+ ServerBaseFeed feed = handler.createFeedFromRequest(this.mockRequest);
+
+ fail(" exception expected");
+ }catch (IOException e) {
+ e.printStackTrace();
+ assertEquals(HttpServletResponse.SC_BAD_REQUEST,handler.getErrorCode());
+ }
+ this.requestMockControl.verify();
+
+
+
+
+ }
+
+ /*
+ * Test method for 'org.apache.lucene.gdata.servlet.handler.AbstractFeedHandler.createRequestedAccount(HttpServletRequest)'
+ */
+ public void testCreateRequestedAccount() throws IOException, ParseException, ServiceException {
+ this.requestMockControl.expectAndDefaultReturn(this.mockRequest
+ .getParameter(AbstractFeedHandler.PARAMETER_ACCOUNT), this.accountName);
+ GDataAccount a = new GDataAccount();
+ a.setName("helloworld");
+ this.adminServiceMockControl.expectAndReturn(this.adminService.getAccount(this.accountName),a );
+ this.requestMockControl.replay();
+ this.adminServiceMockControl.replay();
+ AbstractFeedHandler handler = new InsertFeedHandler();
+ try{
+
+ GDataAccount account = handler.createRequestedAccount(this.mockRequest);
+
+ assertEquals(a,account);
+
+ }catch (Exception e) {
+ e.printStackTrace();
+ fail("unexpected exception -- "+e.getMessage());
+
+ }
+ this.requestMockControl.verify();
+ this.requestMockControl.reset();
+ this.adminServiceMockControl.verify();
+ this.adminServiceMockControl.reset();
+
+ /*
+ *Test for service exception
+ */
+
+ this.requestMockControl.expectAndDefaultReturn(this.mockRequest
+ .getParameter(AbstractFeedHandler.PARAMETER_ACCOUNT), this.accountName);
+
+ a.setName("helloworld");
+ this.adminServiceMockControl.expectAndDefaultThrow(this.adminService.getAccount(this.accountName),new ServiceException() );
+ this.requestMockControl.replay();
+ this.adminServiceMockControl.replay();
+ handler = new InsertFeedHandler();
+ try{
+
+ GDataAccount account = handler.createRequestedAccount(this.mockRequest);
+
+ fail(" exception expected ");
+
+ }catch (Exception e) {
+ e.printStackTrace();
+ assertEquals(HttpServletResponse.SC_BAD_REQUEST,handler.getErrorCode());
+
+ }
+ this.requestMockControl.verify();
+ this.requestMockControl.reset();
+ this.adminServiceMockControl.verify();
+ this.adminServiceMockControl.reset();
+
+
+
+
+
+ }
+
+}
Added: lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/servlet/handler/TestRequestAuthenticator.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/servlet/handler/TestRequestAuthenticator.java?rev=417565&view=auto
==============================================================================
--- lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/servlet/handler/TestRequestAuthenticator.java (added)
+++ lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/servlet/handler/TestRequestAuthenticator.java Tue Jun 27 12:31:20 2006
@@ -0,0 +1,79 @@
+package org.apache.lucene.gdata.servlet.handler;
+
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+
+import junit.framework.TestCase;
+
+import org.apache.lucene.gdata.server.authentication.AuthenticationController;
+import org.apache.lucene.gdata.server.registry.GDataServerRegistry;
+import org.easymock.MockControl;
+
+public class TestRequestAuthenticator extends TestCase {
+ private MockControl requestMock;
+ private HttpServletRequest request;
+ private RequestAuthenticator authenticator;
+ private String tokenHeader;
+ private String token;
+ private Cookie authCookie;
+
+ protected void setUp() throws Exception {
+ createMocks();
+ this.authenticator = new RequestAuthenticator();
+ this.token = "myToken";
+ this.tokenHeader = "GoogleLogin auth="+this.token;
+ this.authCookie = new Cookie("Auth",this.token);
+ }
+ protected void createMocks() {
+ this.requestMock = MockControl.createControl(HttpServletRequest.class);
+ this.request = (HttpServletRequest)this.requestMock.getMock();
+
+ }
+ protected void tearDown() throws Exception {
+ GDataServerRegistry.getRegistry().destroy();
+ }
+ /*
+ * Test method for 'org.apache.lucene.gdata.servlet.handler.RequestAuthenticator.authenticateAccount(GDataRequest, AccountRole)'
+ */
+ public void testGetTokenFromRequest() {
+ // test token present
+ this.requestMock.expectAndDefaultReturn(this.request.getHeader(AuthenticationController.AUTHORIZATION_HEADER), this.tokenHeader);
+ this.requestMock.replay();
+ assertEquals(this.token,this.authenticator.getTokenFromRequest(this.request));
+ this.requestMock.verify();
+ this.requestMock.reset();
+
+ // test token null / cookie present
+ this.requestMock.expectAndDefaultReturn(this.request.getHeader(AuthenticationController.AUTHORIZATION_HEADER), null);
+ this.requestMock.expectAndDefaultReturn(this.request.getCookies(), new Cookie[]{this.authCookie});
+ this.requestMock.replay();
+ assertEquals(this.token,this.authenticator.getTokenFromRequest(this.request));
+ this.requestMock.verify();
+ this.requestMock.reset();
+
+ // test token null / cookie not present
+ this.requestMock.expectAndDefaultReturn(this.request.getHeader(AuthenticationController.AUTHORIZATION_HEADER), null);
+ this.requestMock.expectAndDefaultReturn(this.request.getCookies(), new Cookie[]{new Cookie("somekey","someValue")});
+ this.requestMock.replay();
+ assertNull(this.authenticator.getTokenFromRequest(this.request));
+ this.requestMock.verify();
+ this.requestMock.reset();
+
+// test token null / cookie array emtpy
+ this.requestMock.expectAndDefaultReturn(this.request.getHeader(AuthenticationController.AUTHORIZATION_HEADER), null);
+ this.requestMock.expectAndDefaultReturn(this.request.getCookies(), new Cookie[]{});
+ this.requestMock.replay();
+ assertNull(this.authenticator.getTokenFromRequest(this.request));
+ this.requestMock.verify();
+ this.requestMock.reset();
+
+// test token null / cookie array null
+ this.requestMock.expectAndDefaultReturn(this.request.getHeader(AuthenticationController.AUTHORIZATION_HEADER), null);
+ this.requestMock.expectAndDefaultReturn(this.request.getCookies(), null);
+ this.requestMock.replay();
+ assertNull(this.authenticator.getTokenFromRequest(this.request));
+ this.requestMock.verify();
+ this.requestMock.reset();
+ }
+
+}
Added: lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/storage/lucenestorage/StorageModifierStub.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/storage/lucenestorage/StorageModifierStub.java?rev=417565&view=auto
==============================================================================
--- lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/storage/lucenestorage/StorageModifierStub.java (added)
+++ lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/storage/lucenestorage/StorageModifierStub.java Tue Jun 27 12:31:20 2006
@@ -0,0 +1,153 @@
+/**
+ * Copyright 2004 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.lucene.gdata.storage.lucenestorage;
+
+import java.io.IOException;
+
+import org.apache.lucene.analysis.standard.StandardAnalyzer;
+import org.apache.lucene.gdata.storage.StorageException;
+import org.apache.lucene.gdata.storage.lucenestorage.StorageBuffer;
+import org.apache.lucene.gdata.storage.lucenestorage.StorageCoreController;
+import org.apache.lucene.gdata.storage.lucenestorage.StorageModifier;
+import org.apache.lucene.gdata.utils.StorageControllerStub;
+import org.apache.lucene.index.IndexModifier;
+import org.apache.lucene.store.RAMDirectory;
+
+/**
+ * @author Simon Willnauer
+ *
+ */
+public class StorageModifierStub extends StorageModifier {
+
+ /**
+ * @param controller
+ * @param modifier
+ * @param buffer
+ * @param persitsFactor
+ * @param optimizeInterval
+ * @throws IOException
+ * @throws StorageException
+ */
+ public StorageModifierStub(StorageCoreController controller,
+ IndexModifier modifier, StorageBuffer buffer, int persitsFactor,
+ int optimizeInterval) throws IOException, StorageException {
+
+ super(new StorageCoreController(), new IndexModifier(new RAMDirectory(),new StandardAnalyzer(),true), new StorageBuffer(1),1, 1);
+
+ // TODO Auto-generated constructor stub
+ }
+
+ /**
+ * @see org.apache.lucene.gdata.storage.lucenestorage.StorageModifier#close()
+ */
+ @Override
+ protected void close() throws IOException {
+
+
+ }
+
+ /**
+ * @see org.apache.lucene.gdata.storage.lucenestorage.StorageModifier#createAccount(org.apache.lucene.gdata.storage.lucenestorage.StorageAccountWrapper)
+ */
+ @Override
+ public void createAccount(StorageAccountWrapper account) throws StorageException {
+
+
+ }
+
+ /**
+ * @see org.apache.lucene.gdata.storage.lucenestorage.StorageModifier#createFeed(org.apache.lucene.gdata.storage.lucenestorage.StorageFeedWrapper)
+ */
+ @Override
+ public void createFeed(StorageFeedWrapper wrapper) throws StorageException {
+
+
+ }
+
+ /**
+ * @see org.apache.lucene.gdata.storage.lucenestorage.StorageModifier#deleteAccount(java.lang.String)
+ */
+ @Override
+ public void deleteAccount(String accountName) throws StorageException {
+
+
+ }
+
+ /**
+ * @see org.apache.lucene.gdata.storage.lucenestorage.StorageModifier#deleteEntry(org.apache.lucene.gdata.storage.lucenestorage.StorageEntryWrapper)
+ */
+ @Override
+ public void deleteEntry(StorageEntryWrapper wrapper) throws StorageException {
+
+
+ }
+
+ /**
+ * @see org.apache.lucene.gdata.storage.lucenestorage.StorageModifier#deleteFeed(java.lang.String)
+ */
+ @Override
+ public void deleteFeed(String feedId) throws StorageException {
+
+
+ }
+
+ /**
+ * @see org.apache.lucene.gdata.storage.lucenestorage.StorageModifier#forceWrite()
+ */
+ @Override
+ protected void forceWrite() throws IOException {
+
+
+ }
+
+ /**
+ * @see org.apache.lucene.gdata.storage.lucenestorage.StorageModifier#insertEntry(org.apache.lucene.gdata.storage.lucenestorage.StorageEntryWrapper)
+ */
+ @Override
+ public void insertEntry(StorageEntryWrapper wrapper) throws StorageException {
+
+
+ }
+
+ /**
+ * @see org.apache.lucene.gdata.storage.lucenestorage.StorageModifier#updateAccount(org.apache.lucene.gdata.storage.lucenestorage.StorageAccountWrapper)
+ */
+ @Override
+ public void updateAccount(StorageAccountWrapper user) throws StorageException {
+
+
+ }
+
+ /**
+ * @see org.apache.lucene.gdata.storage.lucenestorage.StorageModifier#updateEntry(org.apache.lucene.gdata.storage.lucenestorage.StorageEntryWrapper)
+ */
+ @Override
+ public void updateEntry(StorageEntryWrapper wrapper) throws StorageException {
+
+
+ }
+
+ /**
+ * @see org.apache.lucene.gdata.storage.lucenestorage.StorageModifier#updateFeed(org.apache.lucene.gdata.storage.lucenestorage.StorageFeedWrapper)
+ */
+ @Override
+ public void updateFeed(StorageFeedWrapper wrapper) throws StorageException {
+
+
+ }
+
+}
Added: lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/storage/lucenestorage/recover/TestRecoverController.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/storage/lucenestorage/recover/TestRecoverController.java?rev=417565&view=auto
==============================================================================
--- lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/storage/lucenestorage/recover/TestRecoverController.java (added)
+++ lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/storage/lucenestorage/recover/TestRecoverController.java Tue Jun 27 12:31:20 2006
@@ -0,0 +1,105 @@
+package org.apache.lucene.gdata.storage.lucenestorage.recover;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.rmi.registry.Registry;
+
+import org.apache.lucene.gdata.data.ServerBaseEntry;
+import org.apache.lucene.gdata.server.registry.GDataServerRegistry;
+import org.apache.lucene.gdata.storage.StorageException;
+import org.apache.lucene.gdata.storage.lucenestorage.StorageEntryWrapper;
+import org.apache.lucene.gdata.storage.lucenestorage.StorageModifier;
+import org.apache.lucene.gdata.storage.lucenestorage.StorageModifierStub;
+import org.apache.lucene.gdata.storage.lucenestorage.StorageEntryWrapper.StorageOperation;
+import org.apache.lucene.gdata.utils.ProvidedServiceStub;
+import org.easymock.MockControl;
+
+import com.google.gdata.data.DateTime;
+
+import junit.framework.TestCase;
+
+public class TestRecoverController extends TestCase {
+ private RecoverController writeController;
+ private RecoverController readController;
+ private File recDir = new File("./temp/");
+ private String feedId = "feedid";
+ private String entryId = "entryId";
+
+ protected void setUp() throws Exception {
+ if(!this.recDir.exists())
+ this.recDir.mkdir();
+ GDataServerRegistry.getRegistry().registerService(new ProvidedServiceStub());
+ this.writeController = new RecoverController(this.recDir,false,false);
+ this.readController = new RecoverController(this.recDir,true,false);
+
+
+
+
+ }
+
+ protected void tearDown() throws Exception {
+
+
+
+ File[] files = this.recDir.listFiles();
+ for (int i = 0; i < files.length; i++) {
+ files[i].delete();
+ }
+ this.recDir.delete();
+ GDataServerRegistry.getRegistry().destroy();
+ }
+
+ /*
+ * Test method for 'org.apache.lucene.gdata.storage.lucenestorage.recover.RecoverController.storageModified(StorageEntryWrapper)'
+ */
+ public void testStorageModified() throws IOException, RecoverException {
+ this.writeController.initialize();
+ ServerBaseEntry entry = new ServerBaseEntry();
+ entry.setFeedId(this.feedId);
+ entry.setId(entryId);
+ entry.setUpdated(DateTime.now());
+ entry.setServiceConfig(new ProvidedServiceStub());
+ StorageEntryWrapper wrapper = new StorageEntryWrapper(entry,StorageOperation.INSERT);
+ this.writeController.storageModified(wrapper);
+ assertEquals(1,this.recDir.listFiles().length);
+ this.writeController.destroy();
+ }
+
+ /*
+ * Test method for 'org.apache.lucene.gdata.storage.lucenestorage.recover.RecoverController.recoverEntries(StorageModifier)'
+ */
+ public void testRecoverEntries() throws IOException, StorageException, RecoverException {
+ testStorageModified();
+
+ int length = this.recDir.listFiles().length;
+ assertEquals(1,length);
+
+ this.readController.initialize();
+ try{
+ this.readController.recoverEntries(new StorageModifierStub(null,null,null,0,0));
+ }catch (Exception e) {
+ fail("unexpected exception"+e.getMessage());
+ }
+ this.readController.destroy();
+ assertEquals(0,this.recDir.listFiles().length);
+ assertNotSame(length,this.recDir.listFiles().length);
+ createCorruptedFile();
+ this.readController.initialize();
+ try{
+ this.readController.recoverEntries(new StorageModifierStub(null,null,null,0,0));
+ }catch (Exception e) {
+ fail("unexpected exception"+e.getMessage());
+ }
+ this.readController.destroy();
+ assertEquals(1,this.recDir.listFiles().length);
+ }
+
+
+ private void createCorruptedFile() throws IOException{
+ FileWriter writer = new FileWriter(new File(this.recDir,"somefile.rec"));
+ writer.write("someString\nSomeOtherString");
+ writer.close();
+ }
+
+}
Added: lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/storage/lucenestorage/recover/TestRecoverWriter.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/storage/lucenestorage/recover/TestRecoverWriter.java?rev=417565&view=auto
==============================================================================
--- lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/storage/lucenestorage/recover/TestRecoverWriter.java (added)
+++ lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/storage/lucenestorage/recover/TestRecoverWriter.java Tue Jun 27 12:31:20 2006
@@ -0,0 +1,75 @@
+package org.apache.lucene.gdata.storage.lucenestorage.recover;
+
+import java.io.IOException;
+import java.io.StringWriter;
+
+import junit.framework.TestCase;
+
+import org.apache.lucene.gdata.data.ServerBaseEntry;
+import org.apache.lucene.gdata.server.registry.ProvidedService;
+import org.apache.lucene.gdata.storage.lucenestorage.StorageEntryWrapper;
+import org.apache.lucene.gdata.storage.lucenestorage.StorageEntryWrapper.StorageOperation;
+import org.apache.lucene.gdata.utils.ProvidedServiceStub;
+
+import com.google.gdata.data.DateTime;
+import com.google.gdata.data.Entry;
+import com.google.gdata.data.PlainTextConstruct;
+
+public class TestRecoverWriter extends TestCase {
+ private static final String ENTRYID = "myID";
+ private static final String TITLE = "title";
+ private static final String FEEDID = "myFeed";
+
+ private static final Long TIMESTAMP = 132326657L;
+ private DateTime dateTime = new DateTime(TIMESTAMP,0);
+ String compareEntry = "I;"+FEEDID+";"+ENTRYID+";"+TIMESTAMP+";" +ProvidedServiceStub.SERVICE_NAME+";"+RecoverWriter.META_DATA_ENTRY_SEPARATOR+
+ "<atom:entry xmlns:atom='http://www.w3.org/2005/Atom'><atom:id>"+ENTRYID+"</atom:id><atom:updated>"+this.dateTime.toString()+"</atom:updated><atom:title type='text'>" + TITLE+
+ "</atom:title></atom:entry>"+RecoverWriter.META_DATA_ENTRY_SEPARATOR+RecoverWriter.STORAGE_OPERATION_SEPARATOR+RecoverWriter.META_DATA_ENTRY_SEPARATOR;
+ String compareDelete = "D;"+FEEDID+";"+ENTRYID+";"+TIMESTAMP+";"+RecoverWriter.META_DATA_ENTRY_SEPARATOR+RecoverWriter.STORAGE_OPERATION_SEPARATOR+RecoverWriter.META_DATA_ENTRY_SEPARATOR;
+ StorageEntryWrapper wrapper;
+ StorageEntryWrapper deleteWrapper;
+
+ protected void setUp() throws Exception {
+ ServerBaseEntry entry = new ServerBaseEntry(new Entry());
+ entry.setId(ENTRYID);
+
+ entry.setUpdated(new DateTime(TIMESTAMP,0));
+ entry.setTitle(new PlainTextConstruct(TITLE));
+ ProvidedService config = new ProvidedServiceStub();
+ entry.setFeedId(FEEDID);
+ entry.setServiceConfig(config);
+ this.wrapper = new StorageEntryWrapper(entry,StorageOperation.INSERT);
+ this.deleteWrapper = new StorageEntryWrapper(entry,StorageOperation.DELETE);
+
+
+ }
+
+ protected void tearDown() throws Exception {
+ super.tearDown();
+
+ }
+
+ /*
+ * Test method for 'org.apache.lucene.gdata.storage.lucenestorage.recover.RecoverWriter.writeEntry(StorageEntryWrapper, Writer)'
+ */
+ public void testWriteEntry() throws IOException {
+ RecoverWriter wr = new RecoverWriter();
+ StringWriter writer = new StringWriter();
+ wr.writeEntry(this.wrapper,writer);
+ assertEquals(compareEntry,writer.toString());
+ writer.close();
+ }
+
+ /*
+ * Test method for 'org.apache.lucene.gdata.storage.lucenestorage.recover.RecoverWriter.writeDelete(String, String, Writer)'
+ */
+ public void testWriteDelete() throws IOException {
+ RecoverWriter wr = new RecoverWriter();
+ StringWriter writer = new StringWriter();
+ wr.writeEntry(this.deleteWrapper,writer);
+ System.out.println(writer.toString());
+ assertEquals(compareDelete,writer.toString());
+ writer.close();
+ }
+
+}
Added: lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/storage/lucenestorage/recover/TestRevocerReader.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/storage/lucenestorage/recover/TestRevocerReader.java?rev=417565&view=auto
==============================================================================
--- lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/storage/lucenestorage/recover/TestRevocerReader.java (added)
+++ lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/storage/lucenestorage/recover/TestRevocerReader.java Tue Jun 27 12:31:20 2006
@@ -0,0 +1,82 @@
+package org.apache.lucene.gdata.storage.lucenestorage.recover;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.apache.lucene.gdata.server.registry.GDataServerRegistry;
+import org.apache.lucene.gdata.server.registry.ProvidedService;
+import org.apache.lucene.gdata.storage.lucenestorage.StorageEntryWrapper;
+import org.apache.lucene.gdata.storage.lucenestorage.StorageEntryWrapper.StorageOperation;
+import org.apache.lucene.gdata.utils.ProvidedServiceStub;
+
+import com.google.gdata.data.DateTime;
+
+public class TestRevocerReader extends TestCase {
+ private RecoverReader recReader;
+ private static final String feedId = "myFeed";
+ private static final String entryId = "myID";
+ private static final Long timestamp = System.currentTimeMillis();
+ private String title = "myTitle";
+ private static final DateTime dateTime = DateTime.now();
+ private String delete = "D;"+feedId+";"+entryId+";"+timestamp+";\n###########\n";
+ private String insert = "I;"+feedId+";"+entryId+";"+timestamp+";" +ProvidedServiceStub.SERVICE_NAME+";"+RecoverWriter.META_DATA_ENTRY_SEPARATOR+
+ "<atom:entry xmlns:atom='http://www.w3.org/2005/Atom'><atom:id>"+entryId+"</atom:id><atom:updated>"+dateTime.toString()+"</atom:updated><atom:title type='text'>" + this.title+
+ "</atom:title></atom:entry>"+RecoverWriter.META_DATA_ENTRY_SEPARATOR+RecoverWriter.STORAGE_OPERATION_SEPARATOR+RecoverWriter.META_DATA_ENTRY_SEPARATOR;
+ protected void setUp() throws Exception {
+ this.recReader = new RecoverReader();
+ GDataServerRegistry.getRegistry().registerService(new ProvidedServiceStub());
+
+ }
+
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ /*
+ * Test method for 'org.apache.lucene.gdata.storage.lucenestorage.recover.RecoverReader.getNonDeleteEntries(Reader)'
+ */
+ public void testRecoverDeletedEntries() throws IOException {
+ StringReader reader = new StringReader(this.delete);
+ assertNotNull(this.recReader.recoverEntries(new BufferedReader(reader)));
+ reader = new StringReader(this.delete);
+ List<StorageEntryWrapper> recList = this.recReader.recoverEntries(new BufferedReader(reader));
+ assertEquals(1,recList.size());
+ StorageEntryWrapper delWrapper = recList.get(0);
+ assertEquals(StorageOperation.DELETE,delWrapper.getOperation());
+ assertEquals(feedId,delWrapper.getFeedId());
+ assertEquals(entryId,delWrapper.getEntryId());
+
+ }
+ public void testRecoverInsertedEntries() throws IOException {
+
+ StringReader reader = new StringReader(this.insert);
+ List<StorageEntryWrapper> recList = this.recReader.recoverEntries(new BufferedReader(reader));
+ assertEquals(1,recList.size());
+ StorageEntryWrapper insWrapper = recList.get(0);
+ assertEquals(StorageOperation.INSERT,insWrapper.getOperation());
+ assertEquals(feedId,insWrapper.getFeedId());
+ assertEquals(entryId,insWrapper.getEntryId());
+ assertEquals(dateTime,insWrapper.getEntry().getUpdated());
+ assertEquals(this.title,insWrapper.getEntry().getTitle().getPlainText());
+
+
+ }
+
+ public void testRecoverReader()throws IOException{
+ StringReader reader = new StringReader(this.insert+this.delete);
+ List<StorageEntryWrapper> recList = this.recReader.recoverEntries(new BufferedReader(reader));
+ assertEquals(2,recList.size());
+ assertEquals(StorageOperation.INSERT,recList.get(0).getOperation());
+ assertEquals(StorageOperation.DELETE,recList.get(1).getOperation());
+
+ reader = new StringReader("some corrupted\n###########\n"+this.insert);
+ recList = this.recReader.recoverEntries(new BufferedReader(reader));
+ assertEquals(1,recList.size());
+ assertEquals(StorageOperation.INSERT,recList.get(0).getOperation());
+
+ }
+}