Показаны сообщения с ярлыком java. Показать все сообщения
Показаны сообщения с ярлыком java. Показать все сообщения

пятница, 28 октября 2016 г.

Как понимать javax.cache.expiry.ExpiryPolicy

 
interface ExpiryPolicy
идея интерфейса - определять время через которое запись в кэше устареет, в зависимости от операций, производимых с объектом в кэше. Каждая операция может продлевать время жизни объекта в кэше - устанавливая новое время, до которого объект считается доступным.
В Reference Implementation устанавливается время жизни относительно текущего времени. При чем при использовании всех правил устаревания - не указано как время жизни должно перезаписываться, в каком порядке или меньшее/большее.

Each of the functions return a new Duration that specifies the amount of time that must pass before a cache entry is considered expired. Duration has constants defined for useful durations.
Каждая функция возвращает новый промежуток времени через который должен пройти перед тем как запись в кэше устареет.

Для всех методов справедливо, что
  • если возвращен ZERO (т.е. нулевой отрезок времени) то запись сразу считается устаревшей
  • если возвращен NULL - не нужно изменять время, когда запись устареет


Duration getExpiryForCreation()
This method is called by a caching implementation after a Cache.Entry is created, but before a Cache.Entry is added to a cache, to determine the Duration before an entry expires. 
Этот метод должен быть вызван кодом реализаций после того, как запись будет сделана, но перед тем как запись будет добавлена в кэш, чтобы определить время когда запись устареет. Вероятна ситуация, что к этому моменту запись уже устарела.

Duration getExpiryForAccess()
This method is called by a caching implementation after a Cache.Entry is accessed to determine the Duration before an entry expires.
Этот метод должен быть вызван кодом реализации после того, как запись будет получена из кэша, чтобы определить время, когда запись устареет.

Duration getExpiryForUpdate()
This method is called by the caching implementation after a Cache.Entry is updated to determine the Duration before the updated entry expires.
Этот метод должен быть вызван кодом реализации после того, как запись будет изменена, чтобы определить время, когда запись устареет.



пример реализации обработчика ExpiryPolicy
https://gist.github.com/kostapc/727489139e876b7ca391483e3a18a5f3

понедельник, 27 июля 2015 г.

Project tag cannot be selected if version is not yet mapped

Project tag cannot be selected if version is not yet mapped



[ERROR] Failed to execute goal org.apache.maven.plugins:maven-release-plugin:2.3.2:prepare (default-cli) on project commons-all: Project tag cannot be selected if version is not yet mapped -> [Help 1]

org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-release-plugin:2.3.2:prepare (default-cli) on project commons-all: Project tag cannot be selected if version is not yet mapped
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:216)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:307)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:193)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:106)
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:862)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:286)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:197)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
Caused by: org.apache.maven.plugin.MojoExecutionException: Project tag cannot be selected if version is not yet mapped
at org.apache.maven.plugins.release.PrepareReleaseMojo.prepareRelease(PrepareReleaseMojo.java:295)
at org.apache.maven.plugins.release.PrepareReleaseMojo.execute(PrepareReleaseMojo.java:247)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
... 20 more
Caused by: org.apache.maven.shared.release.ReleaseExecutionException: Project tag cannot be selected if version is not yet mapped
at org.apache.maven.shared.release.phase.InputVariablesPhase.execute(InputVariablesPhase.java:114)
at org.apache.maven.shared.release.DefaultReleaseManager.prepare(DefaultReleaseManager.java:234)
at org.apache.maven.shared.release.DefaultReleaseManager.prepare(DefaultReleaseManager.java:169)
at org.apache.maven.shared.release.DefaultReleaseManager.prepare(DefaultReleaseManager.java:146)
at org.apache.maven.shared.release.DefaultReleaseManager.prepare(DefaultReleaseManager.java:107)
at org.apache.maven.plugins.release.PrepareReleaseMojo.prepareRelease(PrepareReleaseMojo.java:291)
... 23 more


while you get this message just renew your release iteration

-Dresume=false
mvn -Dresume=false release:prepare

четверг, 5 марта 2015 г.

custom class loader

https://github.com/kostapc/CustomClassLoader

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

Сама структура организации скомпилированного кода (байт-кода) достаточно проста и уже сама по себе может дать какую-то информацию о приложении без декомпиляции - будь то jar (zip папки, по сути) или просто файлы классов. Более того, даже код, прошедший обфускацию, содержит в скомпилированном виде паттерны, которые могут быть использованы, например, антивирусами.

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

Тут приведен самый простой вариант такого загрузчика. Код состоит из 2-х частей:
криптограф - класс, который шифрует байт-код и упаковывает в файл дополнительную информацию, необходимую для загрузки класса.
загрузчик - класс, который загружает закриптованный файл, расшифровывает и запускает метод main(). Таким образом, зашифрованный класс будет запускаться точно также, как и без шифрования.

В качестве шифрования сугубо для примера используется BASE64. Такая пара криптограф-загрузчик позволяет зашифровать и загружать любой скомпилированный класс-файл. Несложная доработка позволит, таким образом, паковать в единый файл целую структуру классов.

---
Изначально статья была написана для interception e-zine
inception e-zine en
inception e-zine ru