/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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.waveprotocol.box.webclient.search.testing; import com.google.common.base.Joiner; import com.google.gwt.http.client.Request; import org.waveprotocol.box.webclient.search.SearchService; import org.waveprotocol.wave.client.scheduler.Scheduler.Task; import org.waveprotocol.wave.client.scheduler.SchedulerInstance; import org.waveprotocol.wave.client.scheduler.TimerService; import org.waveprotocol.wave.model.id.WaveId; import org.waveprotocol.wave.model.util.CollectionUtils; import org.waveprotocol.wave.model.wave.ParticipantId; import java.util.Arrays; import java.util.List; import java.util.Random; /** * Serves up fake search results. * * @author hearnden@google.com (David Hearnden) */ public final class FakeSearchService implements SearchService { private static final int FAKE_DELAY_MS = 300; private final TimerService timer; private final List<DigestSnapshot> canned; public static class Factory { private final static int FAKE_DIGEST_COUNT = 50; /** A bunch of random words. */ private final static String[] FAKE_WORDS = {"alien", "bellies", "cherry", "dustiest", "effected", "family", "milkweed", "sniffs", "tunnel", "unofficially", "virtually", "withdrawal", "x-ray", "zippy"}; public static List<DigestSnapshot> createCanned(ParticipantId me) { String domain = me.getDomain(); Random r = new Random(); double now = SchedulerInstance.getLowPriorityTimer().currentTimeMillis(); double week = 7 * 24 * 60 * 60 * 1000; List<DigestSnapshot> digests = CollectionUtils.newArrayList(); List<ParticipantId> allParticipants = Arrays.asList(me, ParticipantId.ofUnsafe("john@" + domain), ParticipantId.ofUnsafe("jane@" + domain), ParticipantId.ofUnsafe("jill@" + domain)); for (int i = 0; i < FAKE_DIGEST_COUNT; i++) { String title = randomSentence(r, 4); String snippet = randomSentence(r, 15); int msgs = Math.min(5, r.nextInt(20)); int unread = Math.max(0, r.nextInt(msgs + 5) - 5); ParticipantId author = allParticipants.get(r.nextInt(allParticipants.size())); List<ParticipantId> participants = randomSubsequence(r, allParticipants); participants.remove(author); WaveId wid = WaveId.of(domain, "fake" + i); double lmt = now - r.nextDouble() * week; digests.add(new DigestSnapshot(title, snippet, wid, author, participants, lmt, unread, msgs)); } return digests; } private static String randomSentence(Random r, int wordCount) { String[] words = new String[wordCount]; for (int j = 0; j < words.length; j++) { words[j] = FAKE_WORDS[r.nextInt(FAKE_WORDS.length)]; } return Joiner.on(' ').join(words); } private static <T> List<T> randomSubsequence(Random r, List<T> items) { List<T> sub = CollectionUtils.newArrayList(); int length = r.nextInt(items.size()); for (int i = 0; i < length; i++) { sub.add(items.get(r.nextInt(items.size()))); } return sub; } public static FakeSearchService create(ParticipantId me) { return new FakeSearchService(SchedulerInstance.getLowPriorityTimer(), createCanned(me)); } } public FakeSearchService(TimerService timer, List<DigestSnapshot> canned) { this.timer = timer; this.canned = canned; } @Override public Request search(String query, final int index, final int numResults, final Callback callback) { timer.scheduleDelayed(new Task() { @Override public void execute() { int from = Math.min(index, canned.size() - 1); int to = Math.max(index + numResults, canned.size()); callback.onSuccess(canned.size(), canned.subList(from, to)); } }, FAKE_DELAY_MS); return null; } }