1. Java / Говнокод #14401

    +69

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    String response = HttpLoader.loadString(params[0]);
    Gson gson = new GsonBuilder().registerTypeAdapter(ArrayList.class,
        new JsonCollectionSerializer<ArrayList<MyClass>>()).
        create();
    
    ArrayList<MyClass> items_generic = new ArrayList<MyClass>() { };
    ArrayList<MyClass> items = gson.fromJson(response, items_generic.getClass().getGenericSuperclass());
    return items;
    
    
    public class JsonCollectionSerializer<E> implements
            JsonSerializer<Collection<E>>, JsonDeserializer<Collection<E>> {
    
        @SuppressWarnings("unchecked")
        public Collection<E> deserialize(JsonElement element, Type type,
                                         JsonDeserializationContext context) throws JsonParseException {
            JsonArray items = element.getAsJsonArray();
            ParameterizedType deserializationCollectionType = ((ParameterizedType) type);
            Type collectionItemType = deserializationCollectionType.getActualTypeArguments()[0];
            Collection<E> list = null;
    
            try {
                list = (Collection<E>) ((Class<?>) deserializationCollectionType.getRawType()).newInstance();
                for (JsonElement e : items) {
                    list.add((E) context.deserialize(e, collectionItemType));
                }
            } catch (InstantiationException e) {
                throw new JsonParseException(e);
            } catch (IllegalAccessException e) {
                throw new JsonParseException(e);
            }
    
            return list;
        }
    }

    Жабоблядство и шаблоны и генерики:
    Чтение из json в коллекцию с шаблонным параметризованным типом.

    chtulhu, 23 Января 2014

    Комментарии (23)
  2. Java / Говнокод #14399

    +71

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    private byte[] readBytes(InputStream pInputStream, int pLength, int pRetryCounter) throws IOException, WhateverException
    {
        byte[] bytes = new byte[pLength];
        int bytesRead= pInputStream.read(bytes, 0,pLength);
    
        if (bytesRead == -1)
        {
            throw new WhateverException("End of InputStream has been reached");
        }
    
        if (pLength != bytesRead)
        {
            byte[] bytesReadNextAttempt = readBytes(pInputStream, pLength-bytesRead, pRetryCounter + 1);
            if (pLength != bytesRead + bytesReadNextAttempt.length)
            {
                // less bytes available; connection was closed
                throw new WhateverException( ... );
            }
            System.arraycopy(bytesReadNextAttempt, 0, bytes, bytesRead, bytesReadNextAttempt.length);
        }
        return bytes;
    }

    поддержка паршиал ресив. такого "метода" я еще не видел.

    ЗЫ а че в жабе нету никакого MSG_WAITALL?

    Dummy00001, 22 Января 2014

    Комментарии (250)
  3. Java / Говнокод #14375

    +80

    1. 1
    2. 2
    if (!getBaseContext().getResources().getConfiguration().locale.getLanguage().equals(((ApplicationController)getApplication()).lang) )
    ((ApplicationController)getApplication()).setLocale(((ApplicationController)getApplication()).lang);

    Ехал дроид через дроид, видит дроид дроид дроид

    govnozmey, 16 Января 2014

    Комментарии (8)
  4. Java / Говнокод #14371

    +79

    1. 1
    2. 2
    3. 3
    4. 4
    if(VovaJSONparser.ParseText(d, text))
    {
    	return d;
    }

    Вова, фас!

    arbuzz, 16 Января 2014

    Комментарии (17)
  5. Java / Говнокод #14337

    +73

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    public enum Action {
    
        ADD, DELETE, UPDATE, REFRESH;
    
        public static Action getEnum(String value) {
            for (Action current : values()) {
                if (current.name().equalsIgnoreCase(value)) {
                    return current;
                }
            }
            throw new IllegalArgumentException("Unknown input value. Input value is '" + value + "'");
        }
    
        @Override
        public String toString() {
            return this.name().toLowerCase();
        }
    }
    
    public enum Manager {
    
        USER, ROLE, SERVICE;
    
        public static Manager getEnum(String value) {
            for (Manager current : values()) {
                if (current.name().equalsIgnoreCase(value)) {
                    return current;
                }
            }
            throw new IllegalArgumentException("Unknown input value. Input value is '" + value + "'");
        }
    
        @Override
        public String toString() {
            return this.name().toLowerCase();
        }
    
        public boolean isUser() {
            return this == USER;
        }
    
        public boolean isRole() {
            return this == ROLE;
        }
    
        public boolean isService() {
            return this == SERVICE ;
        }
    }
    
    public class StringToEnumConverterFactory implements ConverterFactory<String, Enum> {
        @Override
        public <T extends Enum> Converter<String, T> getConverter(Class<T> targetType) {
            return new StringToEnumConverter<T>(targetType);
        }
    
        private final class StringToEnumConverter<T extends Enum> implements Converter<String, T> {
    
            private Class<T> enumType;
    
            private StringToEnumConverter(Class<T> enumType) {
                this.enumType = enumType;
            }
    
            @Override
            public T convert(String source) {
                if (enumType.getName().equalsIgnoreCase("com.finder.enumerator.manager")) {
                    return (T) Manager.getEnum(source);
                }
                if (enumType.getName().equalsIgnoreCase("com.finder.enumerator.action")) {
                    return (T) Action.getEnum(source);
                }
                return (T) Enum.valueOf(this.enumType, source);
            }
        }
    }
    
    /* -- Mapping -- */
    @RequestMapping(value = "manage/index/{manager}/{action}", method = RequestMethod.GET)
    public String addValueToEntity(@PathVariable("manager") Manager manager, @PathVariable("action") Action action) {
    ...
    
    @RequestMapping(value = "/manage/index", method = RequestMethod.GET)
    public String indexPage(ModelMap model, @RequestParam(value = "manager", required = true) Manager manager) {
    ...

    Spring MVC. Проблема в том что строка lovercase а значения Enum-ов uppercase

    govnoacc, 10 Января 2014

    Комментарии (14)
  6. Java / Говнокод #14305

    +142

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    public class PDFVPage
    {
    
    ....
    
        public int GetX()
        {
            return m_x;
        }
    
        public int GetY()
        {
            return m_y;
        }

    Либа Android PDF :)

    kovel, 31 Декабря 2013

    Комментарии (128)
  7. Java / Говнокод #14258

    +70

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    package gargoyle.heartsong.pages.test;
    
    import gargoyle.heartsong.annotations.model.InjectDAO;
    import gargoyle.heartsong.model.UserEntity;
    import gargoyle.heartsong.services.model.i.DAO;
    
    import java.util.List;
    
    public class TestDAO2 {
    	@InjectDAO(key = Integer.class, value = UserEntity.class)
    	private DAO<Integer, UserEntity> users;
    
    	public List<UserEntity> getUsers() {
    		return this.users.all();
    	}
    }

    дай Люру в руки Tapestry, так он станет программировать на аннотациях.
    это вам уже не программирование "на стрелочках", болезнь прогрессирует.

    да, аннотация @CommitAfter оборачивает тело метода в транзакцию с коммитом и роллбэком при исключении;
    есть аннотация @Notify, которая показывает уведомление, если была ошибка, и меняет возвращаемое значение;
    по аннотациям @AdminPage строится меню админки;
    и наконец, @RolesRequired ограничивает доступ к странице.

    в итоге в классах одни собачки торчат вместо фунциональности. вот, убедитесь сами:
    https://github.com/lure0xaos/HeartSong.git

    Lure Of Chaos, 22 Декабря 2013

    Комментарии (8)
  8. Java / Говнокод #14254

    +83

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    // java.io.FilterOutputStream
    public void close() throws IOException {
        try {
            flush();
        } catch (IOException ignored) {
        }
        out.close();
    }
    
    // тестовый код
    try (OutputStream os = new BufferedOutputStream(new FileOutputStream("/tmp/little_virtual_fs/1.txt"))) {
        byte[] buf = new byte[2028544];
        os.write(buf, 0, 2028544); // максимальный размер файла, который влезает на нашу фс
        os.write(buf, 0, 5); // и еще немножко
        //os.flush();
    }

    А сейчас, на арене нашего цирка - очередная жабопроблема!

    Как думаете, каков результат выполнения тестовой программы?

    Запишет 2028549 байт? Хрен там, места маловато.
    Выдаст IOException на write()? Хрен там, буферизация.
    Выдаст IOException на close()? Хрен там, его сожрала реализация FilterOutputStream.

    Результат: файл не дописался, исключения нет.
    Решение: всегда дергать flush() перед close() самому или не юзать буферизованный поток.

    bormand, 21 Декабря 2013

    Комментарии (37)
  9. Java / Говнокод #14251

    +71

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    @Override
        List search(Long ownerId, Long projectId, String docnumber, String ctr1, String ctr2, Long dateFrom, Long dateTo, String contract,
                    Double amountFrom, Double amountTo, Double vatAmountFrom, Double vatAmountTo, Double withVatAmountFrom,
                    Double withVatAmountTo, Boolean defect, DocumentDefect d, Long vatId, Integer limit, String sortField, String order, String docType) {
    
            // доступные проекты
            List projects = projectDAO.findAll(ownerId)
            
            if(!projects){
                logger.warn("Ошибка отображения списка документов: нет доступных проектов: ownerId:$ownerId")
                return []
            }
            
            Criteria criteria = currentSession.createCriteria(DocumentView)
                .createAlias("document", "d")//
                .createAlias("d.project", "p")//
                .add(Restrictions.in("p.id", projects.id))//
    
    //            if(projectId)
    //                criteria.add(Restrictions.eq("d.project.id", projectId))
    
            if (docnumber)
                criteria.add(Restrictions.ilike("docNumber", docnumber, MatchMode.ANYWHERE))
            if (ctr1)
                criteria.add(Restrictions.ilike("supplierName", ctr1, MatchMode.ANYWHERE))
            if (ctr2)
                criteria.add(Restrictions.ilike("customerName", ctr2, MatchMode.ANYWHERE))
            if (dateFrom) {
                Calendar date1 = Calendar.instance
                date1.setTime(new Date(dateFrom))
                criteria.add(Restrictions.ge("docDate", date1))
            }
            if (dateTo) {
                Calendar date1 = Calendar.instance
                date1.setTime(new Date(dateTo))
                date1.add(Calendar.DAY_OF_MONTH, 1)
                criteria.add(Restrictions.lt("docDate", date1))
            }
            if (contract)
                criteria.add(Restrictions.ilike("contract", contract, MatchMode.ANYWHERE))
            if (amountFrom)
                criteria.add(Restrictions.ge("amount", amountFrom))
            if (amountTo)
                criteria.add(Restrictions.le("amount", amountTo))
            if (vatAmountFrom)
                criteria.add(Restrictions.ge("vatAmount", vatAmountFrom))
            if (vatAmountTo)
                criteria.add(Restrictions.le("vatAmount", vatAmountTo))
            if (withVatAmountFrom)
                criteria.add(Restrictions.ge("totalAmount", withVatAmountFrom))
            if (withVatAmountTo)
                criteria.add(Restrictions.le("totalAmount", withVatAmountTo))
            if (defect) {
                criteria.add(Restrictions.isNotNull("defect"))
                if (d)
                    criteria.add(Restrictions.eq("defect", d))
            }
    //        if (vatId)
    //            criteria.add(Restrictions.eq("d.", withVatAmountTo))
    
            if (docType) {
                def dt = DocumentType.values().find { it.link == docType || it.code == docType }
                if (dt)
                    criteria.add(Restrictions.like("docLink", dt.code, MatchMode.START))
                else
                    logger.error("Неправильное значение параметра фильтрации по виду документа [d_t:$docType]. Допустимые значения ${DocumentType.values().code}")
            }
    
            // получаем общее кол-во записей без ограничений по странице
            def rowCount = criteria.setProjection(Projections.rowCount()).uniqueResult() as Integer
    
            List result = criteria.setProjection(null)//
                    .setResultTransformer(Criteria.ROOT_ENTITY)//
                    .addOrder(Order."$order"(sortField))//
                    .setMaxResults(limit)//
                    .list()
    
            [rowCount, result]
    
        }

    поиск ?!

    floppy, 20 Декабря 2013

    Комментарии (23)
  10. Java / Говнокод #14246

    +79

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    import java.util.Random
    
    def random = new Random()
    def latitude = ''
    def longitude = ''
    def validDigits = 1..9
    
    for(def i in 1..16) {
    	if(i == 3){
    		latitude += '.'
    		longitude += '.'
    	}
    	latitude += validDigits[random.nextInt(validDigits.size())]
    	longitude += validDigits[random.nextInt(validDigits.size())]
    }
    
    testRunner.testCase.testSuite.setPropertyValue('soapuiclient.user.coordinates.latitude', latitude)
    testRunner.testCase.testSuite.setPropertyValue('soapuiclient.user.coordinates.longitude', longitude)

    Есть у нас монга, на ней хранятся в координаты. Проиндексировано всё, поиск быстрый, все дела... Ну и на это дело тест есть в SoapUI. Генерятся случайные координаты, сохраняются и вычитываются. Всё работало до поры до времени..

    И тут тест упал. На ровном месте регрессия. Лезу в логи, нахожу ошибку: координаты: [ 51.16344233595981, 94.45587248671733 ]. Ага, думаю, долгота больше 90 градусов... Проверил - так и есть, умняшка монга валидирует координаты. Ну понятно, рандом подкачал, ща поправим. Но там был не просто рандом...

    madhead, 19 Декабря 2013

    Комментарии (11)