Поиск неиспользуемых значений в файле ресурсов сообщения - PullRequest
3 голосов
/ 10 ноября 2011

Я работаю над проектом, который прошел через несколько рук с иногда спешной разработкой.Со временем файл message.properties стал не синхронизирован с jsps, который его использует.Теперь я не знаю, какие свойства используются, а какие нет.Есть ли инструмент (возможно, плагин eclipse), который может выкорчевать мертвые сообщения?

Ответы [ 4 ]

1 голос
/ 11 ноября 2011

В качестве альтернативы вы можете скрыть функциональность ResourceBundle за другим фасадом ResourceBundle, который, как правило, должен направлять все вызовы на исходный, но с добавлением регистрации и / или сбора статистики сверху.

Пример может быть следующим:

import java.util.Collection;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.NoSuchElementException;
import java.util.ResourceBundle;

public class WrapResourceBundle {

    static class LoggingResourceBundle extends ResourceBundle {
        private Collection<String> usedKeys = new HashSet<String>();

        public LoggingResourceBundle(ResourceBundle parentResourceBundle) {
            setParent(parentResourceBundle);
        }

        @Override
        protected Object handleGetObject(String key) {
            Object value = parent.getObject(key);

            if (value != null) {
                usedKeys.add(key);
                return value;
            }

            return null;
        }

        @Override
        public Enumeration<String> getKeys() {
            return EMPTY_ENUMERATOR;
        }

        public Collection<String> getUsedKeys() {
            return usedKeys;
        }

        private static EmptyEnumerator EMPTY_ENUMERATOR = new EmptyEnumerator();

        private static class EmptyEnumerator implements Enumeration<String> {

            EmptyEnumerator() {
            }

            public boolean hasMoreElements() {
                return false;
            }

            public String nextElement() {
                throw new NoSuchElementException("Empty Enumerator");
            }
        }
    }

    public static void main(String[] args) {
        LoggingResourceBundle bundle = new LoggingResourceBundle(ResourceBundle.getBundle("test"));

        bundle.getString("key1");

        System.out.println("Used keys: " + bundle.getUsedKeys());
    }
}
1 голос
/ 10 ноября 2011

Проблема заключается в том, что сообщения могут быть доступны с помощью JSP или Java, а имена ресурсов могут быть созданы, а не литеральные строки.

Простой grep ping может идентифицировать «очевидный» доступ к ресурсам. Другое решение, механизм поиска ресурсов, который отслеживает то, что используется, также является лишь полунадежным, так как пути кода могут определять, какие ресурсы используются, и если каждый путь не пройден, вы можете пропустить некоторые.

Комбинация из двух будет ловить почти все (со временем).

0 голосов
/ 31 января 2012

Учитывая, что некоторые из ваших ключей генерируются во время выполнения, я не думаю, что вы когда-либо сможете найти инструмент для проверки того, какие ключи используются, а какие нет.

Учитывая проблему, которую вы поставили, я, вероятно, напишу аспект AOP, который оборачивает реализацию MessageSource.getMessage () и регистрирует все запрошенные коды, которые извлекаются из пакета ресурсов. Учитывая, что MessageSource является интерфейсом, вам необходимо знать, какую реализацию вы используете, но я подозреваю, что вы уже должны это знать.

Учитывая, что вы пишете аспект самостоятельно, вы можете создать формат, который будет легко коррелировать с вашим комплектом ресурсов, и как только вы убедитесь, что он содержит все необходимые ключи, это становится тривиальной задачей для сравнения двух файлов и устранить любые лишние линии.

Если вы действительно хотите тщательно разобраться с этим, если у вас уже настроен Spring для сканирования аннотаций, вы можете даже упаковать свой аспект в свой собственный jar (или .class) и поместить его в рабочий WEB-INF / lib. (WEB-INF / classes), перезапустите веб-приложение и дайте ему некоторое время поработать. Самое замечательное в аннотациях заключается в том, что все они могут быть автономными. Если вы уверены, что накопили достаточно данных, просто удалите банку (.class) и все готово.

0 голосов
/ 30 января 2012

Я знаю, что по крайней мере две из основных IDE Java могут предложить эту функцию.

  • IntelliJ IDEA имеет (отключено, по умолчанию) проверку, которую можно использовать для этого:

    перейдите в Настройки -> Проверки -> Свойства файлов ->... и включите «Неиспользуемое свойство»

    .. Единственная проблема, с которой я столкнулся, заключалась в том, что он не брал некоторые использования свойства из библиотеки пользовательских тегов, которую я написал, которую я использовал в нескольких случаях.JSPs.

  • Eclipse также имеет что-то вроде этого (http://help.eclipse.org/helios/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Ftasks%2Ftasks-202.htm), но я не исчерпал, насколько хорошо он работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...