Changeset de815e2


Ignore:
Timestamp:
Mar 10, 2011 11:06:13 PM (9 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
7edbd3a
Parents:
ad24f14
Message:
  • Blockfile:
    • More query options
    • More exception logging
    • Fix lookup infinite loop
    • Fix lookup NPE
  • SusiDNS:
    • Refactoring for new NamingService? API
    • Initial conversion to new NamingService? API (still needs work)
    • Fix lots of HTML warnings
    • Some Java 5 cleanup
Files:
1 added
6 edited

Legend:

Unmodified
Added
Removed
  • apps/susidns/src/java/src/i2p/susi/dns/AddressByNameSorter.java

    rad24f14 rde815e2  
    2727import java.util.Comparator;
    2828
    29 public  class AddressByNameSorter implements Comparator
     29public  class AddressByNameSorter implements Comparator<AddressBean>
    3030{
    31         public int compare(Object arg0, Object arg1)
     31        public int compare(AddressBean a, AddressBean b)
    3232        {
    33                 AddressBean a = (AddressBean)arg0;
    34                 AddressBean b = (AddressBean)arg1;
    35                
    3633                if( a == null )
    3734                        return 1;
  • apps/susidns/src/java/src/i2p/susi/dns/AddressbookBean.java

    rad24f14 rde815e2  
    4343public class AddressbookBean
    4444{
    45         private String book, action, serial, lastSerial, filter, search, hostname, destination;
    46         private int beginIndex, endIndex;
    47         private Properties properties, addressbook;
     45        protected String book, action, serial, lastSerial, filter, search, hostname, destination;
     46        protected int beginIndex, endIndex;
     47        protected final Properties properties;
     48        private Properties addressbook;
    4849        private int trClass;
    49         private LinkedList deletionMarks;
    50         private static Comparator sorter;
     50        protected final LinkedList<String> deletionMarks;
     51        protected static final Comparator<AddressBean> sorter;
    5152        private static final int DISPLAY_SIZE=100;
    5253
     
    8990        private static final String PRIVATE_BOOK = "private_addressbook";
    9091        private static final String DEFAULT_PRIVATE_BOOK = "../privatehosts.txt";
    91         private void loadConfig()
     92        protected void loadConfig()
    9293        {
    9394                long currentTime = System.currentTimeMillis();
     
    124125                return filename;
    125126        }
    126         private Object[] entries;
    127         public Object[] getEntries()
     127
     128        protected AddressBean[] entries;
     129
     130        public AddressBean[] getEntries()
    128131        {
    129132                return entries;
    130133        }
     134
    131135        public String getAction() {
    132136                return action;
     
    168172                        fis =  new FileInputStream( getFileName() );
    169173                        addressbook.load( fis );
    170                         LinkedList list = new LinkedList();
     174                        LinkedList<AddressBean> list = new LinkedList();
    171175                        Enumeration e = addressbook.keys();
    172176                        while( e.hasMoreElements() ) {
     
    190194                                list.addLast( new AddressBean( name, destination ) );
    191195                        }
    192                         Object array[] = list.toArray();
     196                        AddressBean array[] = list.toArray(new AddressBean[list.size()]);
    193197                        Arrays.sort( array, sorter );
    194198                        entries = array;
    195199
    196                         // Format a message about filtered addressbook size, and the number of displayed entries
    197                         // addressbook.jsp catches the case where the whole book is empty.
    198                         String filterArg = "";
    199                         if( search != null && search.length() > 0 ) {
    200                                 message = _("Search") + ' ';
    201                         }
    202                         if( filter != null && filter.length() > 0 ) {
    203                                 if( search != null && search.length() > 0 )
    204                                         message = _("Search within filtered list") + ' ';
    205                                 else
    206                                         message = _("Filtered list") + ' ';
    207                                 filterArg = "&filter=" + filter;
    208                         }
    209                         if (entries.length == 0) {
    210                                 message += "- " + _("no matches") + '.';
    211                         } else if (getBeginInt() == 0 && getEndInt() == entries.length - 1) {
    212                                 if (message.length() == 0)
    213                                         message = _("Addressbook") + ' ';
    214                                 if (entries.length <= 0)
    215                                         message += _("contains no entries");
    216                                 else if (entries.length == 1)
    217                                         message += _("contains 1 entry");
    218                                 else
    219                                         message += _("contains {0} entries", entries.length);
    220                                 message += '.';
    221                         } else {
    222                                 if (getBeginInt() > 0) {
    223                                         int newBegin = Math.max(0, getBeginInt() - DISPLAY_SIZE);
    224                                         int newEnd = Math.max(0, getBeginInt() - 1);
    225                                         message += "<a href=\"addressbook.jsp?book=" + getBook() + filterArg +
    226                                                    "&begin=" + newBegin + "&end=" + newEnd + "\">" + newBegin +
    227                                                    '-' + newEnd + "</a> | ";
    228                                 }
    229                                 message += _("Showing {0} of {1}", "" + getBegin() + '-' + getEnd(), entries.length);
    230                                 if (getEndInt() < entries.length - 1) {
    231                                         int newBegin = Math.min(entries.length - 1, getEndInt() + 1);
    232                                         int newEnd = Math.min(entries.length, getEndInt() + DISPLAY_SIZE);
    233                                         message += " | <a href=\"addressbook.jsp?book=" + getBook() + filterArg +
    234                                                    "&begin=" + newBegin + "&end=" + newEnd + "\">" + newBegin +
    235                                                    '-' + newEnd + "</a>";
    236                                 }
    237                         }
     200                        message = generateLoadMessage();
    238201                }
    239202                catch (Exception e) {
     
    247210                return message;
    248211        }
     212
     213        /**
     214         *  Format a message about filtered addressbook size, and the number of displayed entries
     215         *  addressbook.jsp catches the case where the whole book is empty.
     216         */
     217        protected String generateLoadMessage() {
     218                String message = "";
     219                String filterArg = "";
     220                if( search != null && search.length() > 0 ) {
     221                        message = _("Search") + ' ';
     222                }
     223                if( filter != null && filter.length() > 0 ) {
     224                        if( search != null && search.length() > 0 )
     225                                message = _("Search within filtered list") + ' ';
     226                        else
     227                                message = _("Filtered list") + ' ';
     228                        filterArg = "&amp;filter=" + filter;
     229                }
     230                if (entries.length == 0) {
     231                        message += "- " + _("no matches") + '.';
     232                } else if (getBeginInt() == 0 && getEndInt() == entries.length - 1) {
     233                        if (message.length() == 0)
     234                                message = _("Addressbook") + ' ';
     235                        if (entries.length <= 0)
     236                                message += _("contains no entries");
     237                        else
     238                                message += _(entries.length, "contains 1 entry", "contains {0} entries");
     239                        message += '.';
     240                } else {
     241                        if (getBeginInt() > 0) {
     242                                int newBegin = Math.max(0, getBeginInt() - DISPLAY_SIZE);
     243                                int newEnd = Math.max(0, getBeginInt() - 1);
     244                                message += "<a href=\"addressbook.jsp?book=" + getBook() + filterArg +
     245                                           "&amp;begin=" + newBegin + "&amp;end=" + newEnd + "\">" + newBegin +
     246                                           '-' + newEnd + "</a> | ";
     247                        }
     248                        message += _("Showing {0} of {1}", "" + getBegin() + '-' + getEnd(), entries.length);
     249                        if (getEndInt() < entries.length - 1) {
     250                                int newBegin = Math.min(entries.length - 1, getEndInt() + 1);
     251                                int newEnd = Math.min(entries.length, getEndInt() + DISPLAY_SIZE);
     252                                message += " | <a href=\"addressbook.jsp?book=" + getBook() + filterArg +
     253                                           "&amp;begin=" + newBegin + "&amp;end=" + newEnd + "\">" + newBegin +
     254                                           '-' + newEnd + "</a>";
     255                        }
     256                }
     257                return message;
     258        }
     259
    249260        /** Perform actions, returning messages about this. */
    250261        public String getMessages()
     
    256267                        if( lastSerial != null && serial != null && serial.compareTo( lastSerial ) == 0 ) {
    257268                                boolean changed = false;
    258                                 int deleted = 0;
    259                                 String name = null;
    260269                                if (action.equals(_("Add")) || action.equals(_("Replace"))) {
    261270                                        if( addressbook != null && hostname != null && destination != null ) {
     
    292301                                        search = null;
    293302                                } else if (action.equals(_("Delete Selected"))) {
    294                                         Iterator it = deletionMarks.iterator();
    295                                         while( it.hasNext() ) {
    296                                                 name = (String)it.next();
    297                                                 addressbook.remove( name );
    298                                                 changed = true;
    299                                                 deleted++;
     303                                        String name = null;
     304                                        int deleted = 0;
     305                                        for (String n : deletionMarks) {
     306                                                addressbook.remove(n);
     307                                                if (deleted++ == 0) {
     308                                                        changed = true;
     309                                                        name = n;
     310                                                }
    300311                                        }
    301312                                        if( changed ) {
     
    338349                } catch (IOException ioe) {}
    339350        }
     351
    340352        public String getFilter() {
    341353                return filter;
     
    383395                this.hostname = DataHelper.stripHTML(hostname).trim();  // XSS
    384396        }
    385         private int getBeginInt() {
     397        protected int getBeginInt() {
    386398                return Math.max(0, Math.min(entries.length - 1, beginIndex));
    387399        }
     
    394406                } catch (NumberFormatException nfe) {}
    395407        }
    396         private int getEndInt() {
     408        protected int getEndInt() {
    397409                return Math.max(0, Math.max(getBeginInt(), Math.min(entries.length - 1, endIndex)));
    398410        }
     
    407419
    408420        /** translate */
    409         private static String _(String s) {
     421        protected static String _(String s) {
    410422                return Messages.getString(s);
    411423        }
    412424
    413425        /** translate */
    414         private static String _(String s, Object o) {
     426        protected static String _(String s, Object o) {
    415427                return Messages.getString(s, o);
    416428        }
    417429
    418430        /** translate */
    419         private static String _(String s, Object o, Object o2) {
     431        protected static String _(String s, Object o, Object o2) {
    420432                return Messages.getString(s, o, o2);
    421433        }
     434
     435        /** translate (ngettext) @since 0.8.6 */
     436        protected static String _(int n, String s, String p) {
     437                return Messages.getString(n, s, p);
     438        }
    422439}
  • apps/susidns/src/java/src/i2p/susi/dns/Messages.java

    rad24f14 rde815e2  
    3232        return Translate.getString(s, o, o2, I2PAppContext.getGlobalContext(), BUNDLE_NAME);
    3333    }
     34
     35    /** translate (ngettext) @since 0.8.6 */
     36    public static String getString(int n, String s, String p) {
     37        return Translate.getString(n, s, p, I2PAppContext.getGlobalContext(), BUNDLE_NAME);
     38    }
    3439}
  • apps/susidns/src/jsp/addressbook.jsp

    rad24f14 rde815e2  
    3333<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    3434<jsp:useBean id="version" class="i2p.susi.dns.VersionBean" scope="application" />
    35 <jsp:useBean id="book" class="i2p.susi.dns.AddressbookBean" scope="session" />
     35<jsp:useBean id="book" class="i2p.susi.dns.NamingServiceBean" scope="session" />
    3636<jsp:useBean id="intl" class="i2p.susi.dns.Messages" scope="application" />
    3737<jsp:setProperty name="book" property="*" />
     
    5656<p>
    5757<%=intl._("addressbooks")%>
    58 <a href="addressbook.jsp?book=private&filter=none&begin=0&end=99"><%=intl._("private")%></a> |
    59 <a href="addressbook.jsp?book=master&filter=none&begin=0&end=99"><%=intl._("master")%></a> |
    60 <a href="addressbook.jsp?book=router&filter=none&begin=0&end=99"><%=intl._("router")%></a> |
    61 <a href="addressbook.jsp?book=published&filter=none&begin=0&end=99"><%=intl._("published")%></a> *
     58<a href="addressbook.jsp?book=private&amp;filter=none&amp;begin=0&amp;end=99"><%=intl._("private")%></a> |
     59<a href="addressbook.jsp?book=master&amp;filter=none&amp;begin=0&amp;end=99"><%=intl._("master")%></a> |
     60<a href="addressbook.jsp?book=router&amp;filter=none&amp;begin=0&amp;end=99"><%=intl._("router")%></a> |
     61<a href="addressbook.jsp?book=published&amp;filter=none&amp;begin=0&amp;end=99"><%=intl._("published")%></a> *
    6262<a href="subscriptions.jsp"><%=intl._("subscriptions")%></a> *
    6363<a href="config.jsp"><%=intl._("configuration")%></a> *
     
    7272<div id="messages">${book.messages}</div>
    7373
    74 <span>${book.loadBookMessages}</span>
     74${book.loadBookMessages}
    7575
    7676<c:if test="${book.notEmpty}">
    7777<div id="filter">
    7878<p><%=intl._("Filter")%>:
    79 <a href="addressbook.jsp?filter=a&begin=0&end=99">a</a>
    80 <a href="addressbook.jsp?filter=b&begin=0&end=99">b</a>
    81 <a href="addressbook.jsp?filter=c&begin=0&end=99">c</a>
    82 <a href="addressbook.jsp?filter=d&begin=0&end=99">d</a>
    83 <a href="addressbook.jsp?filter=e&begin=0&end=99">e</a>
    84 <a href="addressbook.jsp?filter=f&begin=0&end=99">f</a>
    85 <a href="addressbook.jsp?filter=g&begin=0&end=99">g</a>
    86 <a href="addressbook.jsp?filter=h&begin=0&end=99">h</a>
    87 <a href="addressbook.jsp?filter=i&begin=0&end=99">i</a>
    88 <a href="addressbook.jsp?filter=j&begin=0&end=99">j</a>
    89 <a href="addressbook.jsp?filter=k&begin=0&end=99">k</a>
    90 <a href="addressbook.jsp?filter=l&begin=0&end=99">l</a>
    91 <a href="addressbook.jsp?filter=m&begin=0&end=99">m</a>
    92 <a href="addressbook.jsp?filter=n&begin=0&end=99">n</a>
    93 <a href="addressbook.jsp?filter=o&begin=0&end=99">o</a>
    94 <a href="addressbook.jsp?filter=p&begin=0&end=99">p</a>
    95 <a href="addressbook.jsp?filter=q&begin=0&end=99">q</a>
    96 <a href="addressbook.jsp?filter=r&begin=0&end=99">r</a>
    97 <a href="addressbook.jsp?filter=s&begin=0&end=99">s</a>
    98 <a href="addressbook.jsp?filter=t&begin=0&end=99">t</a>
    99 <a href="addressbook.jsp?filter=u&begin=0&end=99">u</a>
    100 <a href="addressbook.jsp?filter=v&begin=0&end=99">v</a>
    101 <a href="addressbook.jsp?filter=w&begin=0&end=99">w</a>
    102 <a href="addressbook.jsp?filter=x&begin=0&end=99">x</a>
    103 <a href="addressbook.jsp?filter=y&begin=0&end=99">y</a>
    104 <a href="addressbook.jsp?filter=z&begin=0&end=99">z</a>
    105 <a href="addressbook.jsp?filter=0-9&begin=0&end=99">0-9</a>
    106 <a href="addressbook.jsp?filter=none&begin=0&end=99"><%=intl._("all")%></a></p>
     79<a href="addressbook.jsp?filter=a&amp;begin=0&amp;end=99">a</a>
     80<a href="addressbook.jsp?filter=b&amp;begin=0&amp;end=99">b</a>
     81<a href="addressbook.jsp?filter=c&amp;begin=0&amp;end=99">c</a>
     82<a href="addressbook.jsp?filter=d&amp;begin=0&amp;end=99">d</a>
     83<a href="addressbook.jsp?filter=e&amp;begin=0&amp;end=99">e</a>
     84<a href="addressbook.jsp?filter=f&amp;begin=0&amp;end=99">f</a>
     85<a href="addressbook.jsp?filter=g&amp;begin=0&amp;end=99">g</a>
     86<a href="addressbook.jsp?filter=h&amp;begin=0&amp;end=99">h</a>
     87<a href="addressbook.jsp?filter=i&amp;begin=0&amp;end=99">i</a>
     88<a href="addressbook.jsp?filter=j&amp;begin=0&amp;end=99">j</a>
     89<a href="addressbook.jsp?filter=k&amp;begin=0&amp;end=99">k</a>
     90<a href="addressbook.jsp?filter=l&amp;begin=0&amp;end=99">l</a>
     91<a href="addressbook.jsp?filter=m&amp;begin=0&amp;end=99">m</a>
     92<a href="addressbook.jsp?filter=n&amp;begin=0&amp;end=99">n</a>
     93<a href="addressbook.jsp?filter=o&amp;begin=0&amp;end=99">o</a>
     94<a href="addressbook.jsp?filter=p&amp;begin=0&amp;end=99">p</a>
     95<a href="addressbook.jsp?filter=q&amp;begin=0&amp;end=99">q</a>
     96<a href="addressbook.jsp?filter=r&amp;begin=0&amp;end=99">r</a>
     97<a href="addressbook.jsp?filter=s&amp;begin=0&amp;end=99">s</a>
     98<a href="addressbook.jsp?filter=t&amp;begin=0&amp;end=99">t</a>
     99<a href="addressbook.jsp?filter=u&amp;begin=0&amp;end=99">u</a>
     100<a href="addressbook.jsp?filter=v&amp;begin=0&amp;end=99">v</a>
     101<a href="addressbook.jsp?filter=w&amp;begin=0&amp;end=99">w</a>
     102<a href="addressbook.jsp?filter=x&amp;begin=0&amp;end=99">x</a>
     103<a href="addressbook.jsp?filter=y&amp;begin=0&amp;end=99">y</a>
     104<a href="addressbook.jsp?filter=z&amp;begin=0&amp;end=99">z</a>
     105<a href="addressbook.jsp?filter=0-9&amp;begin=0&amp;end=99">0-9</a>
     106<a href="addressbook.jsp?filter=none&amp;begin=0&amp;end=99"><%=intl._("all")%></a></p>
    107107<c:if test="${book.hasFilter}">
    108108<p><%=intl._("Current filter")%>: ${book.filter}
    109 (<a href="addressbook.jsp?filter=none&begin=0&end=99"><%=intl._("clear filter")%></a>)</p>
     109(<a href="addressbook.jsp?filter=none&amp;begin=0&amp;end=99"><%=intl._("clear filter")%></a>)</p>
    110110</c:if>
    111111</div>
     
    177177
    178178<div id="add">
     179<h3><%=intl._("Add new destination")%>:</h3>
    179180<p class="add">
    180 <h3><%=intl._("Add new destination")%>:</h3>
    181181<b><%=intl._("Hostname")%>:</b> <input type="text" name="hostname" value="${book.hostname}" size="20">
    182182<b><%=intl._("Destination")%>:</b> <textarea name="destination" rows="1" style="height: 3em;" cols="40" wrap="off" >${book.destination}</textarea><br/>
  • core/java/src/net/i2p/client/naming/BlockfileNamingService.java

    rad24f14 rde815e2  
    6868 * </pre>
    6969 *
     70 * All host names are converted to lower case.
    7071 */
    7172public class BlockfileNamingService extends DummyNamingService {
     
    351352    @Override
    352353    public Destination lookup(String hostname, Properties lookupOptions, Properties storedOptions) {
    353         Destination d = super.lookup(hostname);
     354        Destination d = super.lookup(hostname, null, null);
    354355        if (d != null)
    355356            return d;
     
    461462                }
    462463                return rv;
    463             } catch (IOException re) {
     464            } catch (IOException ioe) {
     465                _log.error("DB remove error", ioe);
    464466                return false;
    465467            } catch (RuntimeException re) {
     468                _log.error("DB remove error", re);
    466469                return false;
    467470            }
     
    472475     * @param options If non-null and contains the key "list", get
    473476     *                from that list (default "hosts.txt", NOT all lists)
     477     *                Key "skip": skip that many entries
    474478     *                Key "limit": max number to return
    475479     *                Key "startsWith": return only those starting with
     
    483487        String beginWith = null;
    484488        int limit = Integer.MAX_VALUE;
     489        int skip = 0;
    485490        if (options != null) {
    486             listname = options.getProperty("list");
     491            String ln = options.getProperty("list");
     492            if (ln != null)
     493                listname = ln;
    487494            startsWith = options.getProperty("startsWith");
    488495            beginWith = options.getProperty("beginWith");
     
    493500                limit = Integer.parseInt(lim);
    494501            } catch (NumberFormatException nfe) {}
    495         }
     502            String sk = options.getProperty("skip");
     503            try {
     504                skip = Integer.parseInt(sk);
     505            } catch (NumberFormatException nfe) {}
     506        }
     507        if (_log.shouldLog(Log.DEBUG))
     508            _log.debug("Searching " + listname + " beginning with " + beginWith + " starting with " + startsWith + " limit=" + limit + " skip=" + skip);
    496509        synchronized(_bf) {
    497510            try {
    498511                SkipList sl = _bf.getIndex(listname, _stringSerializer, _destSerializer);
    499                 if (sl == null)
     512                if (sl == null) {
     513                    if (_log.shouldLog(Log.WARN))
     514                        _log.warn("No skiplist found for lookup in " + listname);
    500515                    return Collections.EMPTY_MAP;
     516                }
    501517                SkipIterator iter;
    502                 if (startsWith != null)
     518                if (beginWith != null)
    503519                    iter = sl.find(beginWith);
    504520                else
    505521                    iter = sl.iterator();
    506522                Map<String, Destination> rv = new HashMap();
     523                for (int i = 0; i < skip && iter.hasNext(); i++) {
     524                    iter.next();
     525                }
    507526                for (int i = 0; i < limit && iter.hasNext(); i++) {
    508527                     String key = (String) iter.nextKey();
     
    513532                }
    514533                return rv;
    515             } catch (IOException re) {
     534            } catch (IOException ioe) {
     535                _log.error("DB lookup error", ioe);
    516536                return Collections.EMPTY_MAP;
    517537            } catch (RuntimeException re) {
     538                _log.error("DB lookup error", re);
    518539                return Collections.EMPTY_MAP;
    519540            }
     
    540561                    return 0;
    541562                return sl.size();
    542             } catch (IOException re) {
     563            } catch (IOException ioe) {
     564                _log.error("DB size error", ioe);
    543565                return 0;
    544566            } catch (RuntimeException re) {
     567                _log.error("DB size error", re);
    545568                return 0;
    546569            }
     
    709732        }
    710733
     734        System.out.println("size() reports " + bns.size());
     735        System.out.println("getEntries() returns " + bns.getEntries().size());
     736
    711737        System.out.println("Testing with " + names.size() + " hostnames");
    712738        int found = 0;
  • core/java/src/net/i2p/client/naming/NamingService.java

    rad24f14 rde815e2  
    8484            return null;
    8585        }
     86    }
     87
     88    @Override
     89    public String toString() {
     90        return getClass().getSimpleName();
    8691    }
    8792
Note: See TracChangeset for help on using the changeset viewer.