Changeset a3fb49a


Ignore:
Timestamp:
Feb 27, 2011 2:49:04 PM (9 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
ad24f14
Parents:
c269546c
Message:

add missing files; new API in blockfile NS

Location:
core/java/src/net/i2p/client/naming
Files:
2 added
2 edited

Legend:

Unmodified
Added
Removed
  • core/java/src/net/i2p/client/naming/BlockfileNamingService.java

    rc269546c ra3fb49a  
    2020import java.util.Collections;
    2121import java.util.Date;
     22import java.util.HashMap;
    2223import java.util.List;
     24import java.util.Map;
    2325import java.util.Properties;
    2426import java.util.StringTokenizer;
     
    336338    }
    337339   
     340    /**
     341     *  Caller must synchronize
     342     *  @return removed object or null
     343     *  @throws RuntimeException
     344     */
     345    private static Object removeEntry(SkipList sl, String key) {
     346        return sl.remove(key);
     347    }
     348
     349    ////////// Start NamingService API
     350
     351    @Override
    338352    public Destination lookup(String hostname, Properties lookupOptions, Properties storedOptions) {
    339353        Destination d = super.lookup(hostname);
     
    350364                    if (de != null) {
    351365                        d = de.dest;
     366                        if (storedOptions != null)
     367                            storedOptions.putAll(de.props);
    352368                        break;
    353369                    }
     
    361377        return d;
    362378    }
     379
     380    /**
     381     * @param options If non-null and contains the key "list", add to that list
     382     *                (default "hosts.txt")
     383     *                Use the key "s" for the source
     384     */
     385    @Override
     386    public boolean put(String hostname, Destination d, Properties options) {
     387        return put(hostname, d, options, false);
     388    }
     389
     390    /**
     391     * @param options If non-null and contains the key "list", add to that list
     392     *                (default "hosts.txt")
     393     *                Use the key "s" for the source
     394     */
     395    @Override
     396    public boolean putIfAbsent(String hostname, Destination d, Properties options) {
     397        return put(hostname, d, options, true);
     398    }
     399
     400    private boolean put(String hostname, Destination d, Properties options, boolean checkExisting) {
     401        String key = hostname.toLowerCase();
     402        String listname = FALLBACK_LIST;
     403        Properties props = new Properties();
     404        if (options != null) {
     405            props.putAll(options);
     406            String list = options.getProperty("list");
     407            if (list != null) {
     408                listname = list;
     409                props.remove("list");
     410            }
     411        }
     412        props.setProperty(PROP_ADDED, Long.toString(_context.clock().now()));
     413        synchronized(_bf) {
     414            try {
     415                SkipList sl = _bf.getIndex(listname, _stringSerializer, _destSerializer);
     416                if (sl == null)
     417                    sl = _bf.makeIndex(listname, _stringSerializer, _destSerializer);
     418                boolean changed =  (checkExisting || !_listeners.isEmpty()) && sl.get(key) != null;
     419                if (changed && checkExisting)
     420                        return false;
     421                addEntry(sl, key, d, props);
     422                for (NamingServiceListener nsl : _listeners) {
     423                    if (changed)
     424                        nsl.entryChanged(this, hostname, d, options);
     425                    else
     426                        nsl.entryAdded(this, hostname, d, options);
     427                }
     428                return true;
     429            } catch (IOException re) {
     430                return false;
     431            } catch (RuntimeException re) {
     432                return false;
     433            }
     434        }
     435    }
     436
     437    /**
     438     * @param options If non-null and contains the key "list", remove
     439     *                from that list (default "hosts.txt", NOT all lists)
     440     */
     441    @Override
     442    public boolean remove(String hostname, Properties options) {
     443        String key = hostname.toLowerCase();
     444        String listname = FALLBACK_LIST;
     445        if (options != null) {
     446            String list = options.getProperty("list");
     447            if (list != null) {
     448                listname = list;
     449            }
     450        }
     451        synchronized(_bf) {
     452            try {
     453                SkipList sl = _bf.getIndex(listname, _stringSerializer, _destSerializer);
     454                if (sl == null)
     455                    return false;
     456                boolean rv = removeEntry(sl, key) != null;
     457                if (rv) {
     458                    for (NamingServiceListener nsl : _listeners) {
     459                        nsl.entryRemoved(this, key);
     460                    }
     461                }
     462                return rv;
     463            } catch (IOException re) {
     464                return false;
     465            } catch (RuntimeException re) {
     466                return false;
     467            }
     468        }
     469    }
     470
     471    /**
     472     * @param options If non-null and contains the key "list", get
     473     *                from that list (default "hosts.txt", NOT all lists)
     474     *                Key "limit": max number to return
     475     *                Key "startsWith": return only those starting with
     476     *                Key "beginWith": start here in the iteration
     477     *                Don't use both
     478     */
     479    @Override
     480    public Map<String, Destination> getEntries(Properties options) {
     481        String listname = FALLBACK_LIST;
     482        String startsWith = null;
     483        String beginWith = null;
     484        int limit = Integer.MAX_VALUE;
     485        if (options != null) {
     486            listname = options.getProperty("list");
     487            startsWith = options.getProperty("startsWith");
     488            beginWith = options.getProperty("beginWith");
     489            if (beginWith == null)
     490                beginWith = startsWith;
     491            String lim = options.getProperty("limit");
     492            try {
     493                limit = Integer.parseInt(lim);
     494            } catch (NumberFormatException nfe) {}
     495        }
     496        synchronized(_bf) {
     497            try {
     498                SkipList sl = _bf.getIndex(listname, _stringSerializer, _destSerializer);
     499                if (sl == null)
     500                    return Collections.EMPTY_MAP;
     501                SkipIterator iter;
     502                if (startsWith != null)
     503                    iter = sl.find(beginWith);
     504                else
     505                    iter = sl.iterator();
     506                Map<String, Destination> rv = new HashMap();
     507                for (int i = 0; i < limit && iter.hasNext(); i++) {
     508                     String key = (String) iter.nextKey();
     509                     if (startsWith != null && !key.startsWith(startsWith))
     510                         break;
     511                     DestEntry de = (DestEntry) iter.next();
     512                     rv.put(key, de.dest);
     513                }
     514                return rv;
     515            } catch (IOException re) {
     516                return Collections.EMPTY_MAP;
     517            } catch (RuntimeException re) {
     518                return Collections.EMPTY_MAP;
     519            }
     520        }
     521    }
     522
     523    /**
     524     * @param options If non-null and contains the key "list", return the
     525     *                size of that list (default "hosts.txt", NOT all lists)
     526     */
     527    @Override
     528    public int size(Properties options) {
     529        String listname = FALLBACK_LIST;
     530        if (options != null) {
     531            String list = options.getProperty("list");
     532            if (list != null) {
     533                listname = list;
     534            }
     535        }
     536        synchronized(_bf) {
     537            try {
     538                SkipList sl = _bf.getIndex(listname, _stringSerializer, _destSerializer);
     539                if (sl == null)
     540                    return 0;
     541                return sl.size();
     542            } catch (IOException re) {
     543                return 0;
     544            } catch (RuntimeException re) {
     545                return 0;
     546            }
     547        }
     548    }
     549
     550    ////////// End NamingService API
    363551
    364552    private void dumpDB() {
  • core/java/src/net/i2p/client/naming/MetaNamingService.java

    rc269546c ra3fb49a  
    6666    @Override
    6767    public List<NamingService> getNamingServices() {
    68         return new Collections.unmodifiableList(_services);
     68        return Collections.unmodifiableList(_services);
    6969    }
    7070
Note: See TracChangeset for help on using the changeset viewer.