Latest commit

History

102 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

JavaFF: Java Facade/Factories

Build StatusMaven Central

We all know the Golden Object Oriented rule Don't talk to strangers

We all know that you will never find the API/frameworks defects or magic or limitations at the beginning of the development.

Imagine yourself using API in all your projects for years. Everybody else is using it as well, it is famous and mature. Suddenly you have a huge production issue. Changing that API is too hard and costly at this stage!

What now?

Or you decided to change any API/framework for new requirments. Lets take logging as an example, now we have log4j, logback, JDK logging. At the beginning of the project you decide to go with the logback since it's so famous and faster than log4j and it's bundled with Spring, etc.

After 1 year of the project you got a new requirements for the logging which are:

  • All logs should be localized
  • FATAL errors should be sent to a specific email

Disaster, right?!

Examples for famous bugs in very famous frameworks

Memory Leak

Performance

Deadlocks

So, we should always protect our project and noy use a framework or API directly and this is the main idea here

Main Features

  • This project offers a standard/clear API for the most used API's in the Java Applications like: Exceptions, Locale, Beans, Formatter's, Json Handlers, Loggers, ReflectionHelpers, etc.

  • You can control the implementations through the class path without changing line of code

The below example shows how the implementation will be changed without changing the code: Now I have the below dependencies in my pom.xml

 <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>${slf4.version}</version>
<scope>provided</scope>
</dependency>

So when I call

LogFactory.getLogger(LogFactory.class).info("LOCALIZED_MSG", "Kiswani"); Output:
Nov22, 20166:54:07PMio.github.rhkiswani.javaff.log.Slf4jLoginfoINFO: thisislocalizedmsgfrommessages_en.propertiesthanksforMrKiswani

When I remove the dependencies from the pom.xml and run the same code I will get

LogFactory.getLogger(LogFactory.class).info("LOCALIZED_MSG", "Kiswani");
Output:
Nov22, 20167:00:15PMio.github.rhkiswani.javaff.log.DefaultLoginfoINFO: thisislocalizedmsgfrommessages_en.propertiesthanksforMrKiswani
  • Transparent localization for logs, strings, exceptions

  • Centralized and Configurable Exception Handling by the class type. See below a full example:

packageio.github.rhkiswani.javaff;
importio.github.rhkiswani.javaff.exceptions.ExceptionHandler;
importio.github.rhkiswani.javaff.exceptions.ExceptionHandlersFactory;
importio.github.rhkiswani.javaff.exceptions.ExceptionUtil;
publicclassTestMain {
publicstaticvoidmain(String[] args) {
//Any instance of ConsoleException will be handled hereExceptionHandlersFactory.instance().add(ConsoleException.class, newExceptionHandler() {
@Overridepublicvoidhandle(Throwablet) {
System.out.println("ConsoleException handler");
}
});
//Any instance of MailException will be handled hereExceptionHandlersFactory.instance().add(MailException.class, newExceptionHandler() {
@Overridepublicvoidhandle(Throwablet) {
System.out.println("MailException handler");
}
});
ExceptionUtil.handle(newConsoleException());
ExceptionUtil.handle(newSubConsoleException());
ExceptionUtil.handle(newMailException());
ExceptionUtil.handle(newSubMailException());
//Null is not related to any class from the previous class's, it will be handled by the default handler for Throwable.class//which is printing the stack trace by defaultExceptionUtil.handle(newNullPointerException());
//We decided to override the default implantation for Throwable.classExceptionHandlersFactory.instance().overrideImp(Throwable.class, newExceptionHandler() {
@Overridepublicvoidhandle(Throwablet) {
System.out.println("Overridden handler");
}
});
ExceptionUtil.handle(newNullPointerException());
}
privatestaticclassConsoleExceptionextendsRuntimeException {
}
privatestaticclassSubConsoleExceptionextendsConsoleException {
}
privatestaticclassMailExceptionextendsRuntimeException {
}
privatestaticclassSubMailExceptionextendsMailException {
}
}
  • Logging with localization out of the box
LogFactory.getLogger(LogFactory.class).info("LOCALIZED_MSG", "Kiswani");
Output : INFO: thisislocalizedmsgfrommessages_en.propertiesthanksforMrKiswani
LogFactory.getLogger(LogFactory.class).info("normal msg num {0} date {1}", Integer.MAX_VALUE, newDate());
Output:
INFO: normalmsgnum2,147,483,647date11/22/166:06PM
  • Many Utilities, see below just a few examples:

    • Formatter's
    System.out.println(FormatUtil.format("Mr {0} {1}", "Mohamed", "Kiswani"));
    System.out.println(FormatUtil.format(newDate()));
    System.out.println(FormatUtil.format(newDate(), "yyyy-MM-dd"));
    System.out.println(FormatUtil.format(Integer.MAX_VALUE));
    Output:
    MrMohamedKiswani11/22/166:16PM2016-11-222,147,483,647
    • Json Handlers
      packagejavaff.samples.beans;
      importio.github.rhkiswani.javaff.json.JsonHandler;
      importio.github.rhkiswani.javaff.json.JsonHandlerFactory;
      publicclassMain {
      publicstaticvoidmain(String[] args) {
      Employeeemp = newEmployee();
      emp.setId(100);
      emp.setName("Kiswani");
      emp.setEmpId(1000);
      // comment jakson in pom.xmlSystem.out.println("\n======================= Default based on class path ========================");
      // default json handler gsonSystem.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).toJson(emp));
      System.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).getImplementation());
      // when you uncomment jakson from the pom.xmlSystem.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).toJson(emp));
      System.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).getImplementation());
      System.out.println("\n======================= Force to use Gson By annotation ========================");
      // you want to have jakson for all the classes except the student , student should use Gson// you need to add @GsonBeanStudentstd = newStudent();
      std.setId(100);
      std.setName("Kiswani");
      std.setStdId(1000);
      System.out.println(JsonHandlerFactory.getJsonHandler(Student.class).toJson(emp));
      System.out.println(JsonHandlerFactory.getJsonHandler(Student.class).getImplementation());
      System.out.println("\n======================= Custom Json Handler ========================");
      // you want to add your custom implantation// Note : if you set your custom it will be used everywhereJsonHandlerFactory.instance().setDefault(newMyJsonHandler());
      System.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).toJson(emp));
      System.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).getImplementation());
      System.out.println(JsonHandlerFactory.getJsonHandler(Student.class).toJson(emp));
      System.out.println(JsonHandlerFactory.getJsonHandler(Student.class).getImplementation());
      }
      privatestaticclassMyJsonHandlerimplementsJsonHandler {
      public <T> TfromJson(Strings, ClassaClass) {
      returnnull;
      }
      publicStringtoJson(Objecto) {
      returno.toString();
      }
      publicObjectgetImplementation() {
      returnMyJsonHandler.class;
      }
      }
      packagejavaff.samples.beans;
      importio.github.rhkiswani.javaff.json.annotations.GsonBean;
      @GsonBeanpublicclassStudentextendsPerson{
      privateintstdId;
      publicintgetStdId() {
      returnstdId;
      }
      publicvoidsetStdId(intstdId) {
      this.stdId = stdId;
      }
      }
      }

Prerequisites

Requires JDK 1.7 or higher.

Usage & Examples

Usage & Examples

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

102 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

JavaFF: Java Facade/Factories

Build StatusMaven Central

We all know the Golden Object Oriented rule Don't talk to strangers

We all know that you will never find the API/frameworks defects or magic or limitations at the beginning of the development.

Imagine yourself using API in all your projects for years. Everybody else is using it as well, it is famous and mature. Suddenly you have a huge production issue. Changing that API is too hard and costly at this stage!

What now?

Or you decided to change any API/framework for new requirments. Lets take logging as an example, now we have log4j, logback, JDK logging. At the beginning of the project you decide to go with the logback since it's so famous and faster than log4j and it's bundled with Spring, etc.

After 1 year of the project you got a new requirements for the logging which are:

  • All logs should be localized
  • FATAL errors should be sent to a specific email

Disaster, right?!

Examples for famous bugs in very famous frameworks

Memory Leak

Performance

Deadlocks

So, we should always protect our project and noy use a framework or API directly and this is the main idea here

Main Features

  • This project offers a standard/clear API for the most used API's in the Java Applications like: Exceptions, Locale, Beans, Formatter's, Json Handlers, Loggers, ReflectionHelpers, etc.

  • You can control the implementations through the class path without changing line of code

The below example shows how the implementation will be changed without changing the code: Now I have the below dependencies in my pom.xml

 <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>${slf4.version}</version>
<scope>provided</scope>
</dependency>

So when I call

LogFactory.getLogger(LogFactory.class).info("LOCALIZED_MSG", "Kiswani"); Output:
Nov22, 20166:54:07PMio.github.rhkiswani.javaff.log.Slf4jLoginfoINFO: thisislocalizedmsgfrommessages_en.propertiesthanksforMrKiswani

When I remove the dependencies from the pom.xml and run the same code I will get

LogFactory.getLogger(LogFactory.class).info("LOCALIZED_MSG", "Kiswani");
Output:
Nov22, 20167:00:15PMio.github.rhkiswani.javaff.log.DefaultLoginfoINFO: thisislocalizedmsgfrommessages_en.propertiesthanksforMrKiswani
  • Transparent localization for logs, strings, exceptions

  • Centralized and Configurable Exception Handling by the class type. See below a full example:

packageio.github.rhkiswani.javaff;
importio.github.rhkiswani.javaff.exceptions.ExceptionHandler;
importio.github.rhkiswani.javaff.exceptions.ExceptionHandlersFactory;
importio.github.rhkiswani.javaff.exceptions.ExceptionUtil;
publicclassTestMain {
publicstaticvoidmain(String[] args) {
//Any instance of ConsoleException will be handled hereExceptionHandlersFactory.instance().add(ConsoleException.class, newExceptionHandler() {
@Overridepublicvoidhandle(Throwablet) {
System.out.println("ConsoleException handler");
}
});
//Any instance of MailException will be handled hereExceptionHandlersFactory.instance().add(MailException.class, newExceptionHandler() {
@Overridepublicvoidhandle(Throwablet) {
System.out.println("MailException handler");
}
});
ExceptionUtil.handle(newConsoleException());
ExceptionUtil.handle(newSubConsoleException());
ExceptionUtil.handle(newMailException());
ExceptionUtil.handle(newSubMailException());
//Null is not related to any class from the previous class's, it will be handled by the default handler for Throwable.class//which is printing the stack trace by defaultExceptionUtil.handle(newNullPointerException());
//We decided to override the default implantation for Throwable.classExceptionHandlersFactory.instance().overrideImp(Throwable.class, newExceptionHandler() {
@Overridepublicvoidhandle(Throwablet) {
System.out.println("Overridden handler");
}
});
ExceptionUtil.handle(newNullPointerException());
}
privatestaticclassConsoleExceptionextendsRuntimeException {
}
privatestaticclassSubConsoleExceptionextendsConsoleException {
}
privatestaticclassMailExceptionextendsRuntimeException {
}
privatestaticclassSubMailExceptionextendsMailException {
}
}
  • Logging with localization out of the box
LogFactory.getLogger(LogFactory.class).info("LOCALIZED_MSG", "Kiswani");
Output : INFO: thisislocalizedmsgfrommessages_en.propertiesthanksforMrKiswani
LogFactory.getLogger(LogFactory.class).info("normal msg num {0} date {1}", Integer.MAX_VALUE, newDate());
Output:
INFO: normalmsgnum2,147,483,647date11/22/166:06PM
  • Many Utilities, see below just a few examples:

    • Formatter's
    System.out.println(FormatUtil.format("Mr {0} {1}", "Mohamed", "Kiswani"));
    System.out.println(FormatUtil.format(newDate()));
    System.out.println(FormatUtil.format(newDate(), "yyyy-MM-dd"));
    System.out.println(FormatUtil.format(Integer.MAX_VALUE));
    Output:
    MrMohamedKiswani11/22/166:16PM2016-11-222,147,483,647
    • Json Handlers
      packagejavaff.samples.beans;
      importio.github.rhkiswani.javaff.json.JsonHandler;
      importio.github.rhkiswani.javaff.json.JsonHandlerFactory;
      publicclassMain {
      publicstaticvoidmain(String[] args) {
      Employeeemp = newEmployee();
      emp.setId(100);
      emp.setName("Kiswani");
      emp.setEmpId(1000);
      // comment jakson in pom.xmlSystem.out.println("\n======================= Default based on class path ========================");
      // default json handler gsonSystem.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).toJson(emp));
      System.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).getImplementation());
      // when you uncomment jakson from the pom.xmlSystem.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).toJson(emp));
      System.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).getImplementation());
      System.out.println("\n======================= Force to use Gson By annotation ========================");
      // you want to have jakson for all the classes except the student , student should use Gson// you need to add @GsonBeanStudentstd = newStudent();
      std.setId(100);
      std.setName("Kiswani");
      std.setStdId(1000);
      System.out.println(JsonHandlerFactory.getJsonHandler(Student.class).toJson(emp));
      System.out.println(JsonHandlerFactory.getJsonHandler(Student.class).getImplementation());
      System.out.println("\n======================= Custom Json Handler ========================");
      // you want to add your custom implantation// Note : if you set your custom it will be used everywhereJsonHandlerFactory.instance().setDefault(newMyJsonHandler());
      System.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).toJson(emp));
      System.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).getImplementation());
      System.out.println(JsonHandlerFactory.getJsonHandler(Student.class).toJson(emp));
      System.out.println(JsonHandlerFactory.getJsonHandler(Student.class).getImplementation());
      }
      privatestaticclassMyJsonHandlerimplementsJsonHandler {
      public <T> TfromJson(Strings, ClassaClass) {
      returnnull;
      }
      publicStringtoJson(Objecto) {
      returno.toString();
      }
      publicObjectgetImplementation() {
      returnMyJsonHandler.class;
      }
      }
      packagejavaff.samples.beans;
      importio.github.rhkiswani.javaff.json.annotations.GsonBean;
      @GsonBeanpublicclassStudentextendsPerson{
      privateintstdId;
      publicintgetStdId() {
      returnstdId;
      }
      publicvoidsetStdId(intstdId) {
      this.stdId = stdId;
      }
      }
      }

Prerequisites

Requires JDK 1.7 or higher.

Usage & Examples

Usage & Examples

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

102 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

JavaFF: Java Facade/Factories

Build StatusMaven Central

We all know the Golden Object Oriented rule Don't talk to strangers

We all know that you will never find the API/frameworks defects or magic or limitations at the beginning of the development.

Imagine yourself using API in all your projects for years. Everybody else is using it as well, it is famous and mature. Suddenly you have a huge production issue. Changing that API is too hard and costly at this stage!

What now?

Or you decided to change any API/framework for new requirments. Lets take logging as an example, now we have log4j, logback, JDK logging. At the beginning of the project you decide to go with the logback since it's so famous and faster than log4j and it's bundled with Spring, etc.

After 1 year of the project you got a new requirements for the logging which are:

  • All logs should be localized
  • FATAL errors should be sent to a specific email

Disaster, right?!

Examples for famous bugs in very famous frameworks

Memory Leak

Performance

Deadlocks

So, we should always protect our project and noy use a framework or API directly and this is the main idea here

Main Features

  • This project offers a standard/clear API for the most used API's in the Java Applications like: Exceptions, Locale, Beans, Formatter's, Json Handlers, Loggers, ReflectionHelpers, etc.

  • You can control the implementations through the class path without changing line of code

The below example shows how the implementation will be changed without changing the code: Now I have the below dependencies in my pom.xml

 <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>${slf4.version}</version>
<scope>provided</scope>
</dependency>

So when I call

LogFactory.getLogger(LogFactory.class).info("LOCALIZED_MSG", "Kiswani"); Output:
Nov22, 20166:54:07PMio.github.rhkiswani.javaff.log.Slf4jLoginfoINFO: thisislocalizedmsgfrommessages_en.propertiesthanksforMrKiswani

When I remove the dependencies from the pom.xml and run the same code I will get

LogFactory.getLogger(LogFactory.class).info("LOCALIZED_MSG", "Kiswani");
Output:
Nov22, 20167:00:15PMio.github.rhkiswani.javaff.log.DefaultLoginfoINFO: thisislocalizedmsgfrommessages_en.propertiesthanksforMrKiswani
  • Transparent localization for logs, strings, exceptions

  • Centralized and Configurable Exception Handling by the class type. See below a full example:

packageio.github.rhkiswani.javaff;
importio.github.rhkiswani.javaff.exceptions.ExceptionHandler;
importio.github.rhkiswani.javaff.exceptions.ExceptionHandlersFactory;
importio.github.rhkiswani.javaff.exceptions.ExceptionUtil;
publicclassTestMain {
publicstaticvoidmain(String[] args) {
//Any instance of ConsoleException will be handled hereExceptionHandlersFactory.instance().add(ConsoleException.class, newExceptionHandler() {
@Overridepublicvoidhandle(Throwablet) {
System.out.println("ConsoleException handler");
}
});
//Any instance of MailException will be handled hereExceptionHandlersFactory.instance().add(MailException.class, newExceptionHandler() {
@Overridepublicvoidhandle(Throwablet) {
System.out.println("MailException handler");
}
});
ExceptionUtil.handle(newConsoleException());
ExceptionUtil.handle(newSubConsoleException());
ExceptionUtil.handle(newMailException());
ExceptionUtil.handle(newSubMailException());
//Null is not related to any class from the previous class's, it will be handled by the default handler for Throwable.class//which is printing the stack trace by defaultExceptionUtil.handle(newNullPointerException());
//We decided to override the default implantation for Throwable.classExceptionHandlersFactory.instance().overrideImp(Throwable.class, newExceptionHandler() {
@Overridepublicvoidhandle(Throwablet) {
System.out.println("Overridden handler");
}
});
ExceptionUtil.handle(newNullPointerException());
}
privatestaticclassConsoleExceptionextendsRuntimeException {
}
privatestaticclassSubConsoleExceptionextendsConsoleException {
}
privatestaticclassMailExceptionextendsRuntimeException {
}
privatestaticclassSubMailExceptionextendsMailException {
}
}
  • Logging with localization out of the box
LogFactory.getLogger(LogFactory.class).info("LOCALIZED_MSG", "Kiswani");
Output : INFO: thisislocalizedmsgfrommessages_en.propertiesthanksforMrKiswani
LogFactory.getLogger(LogFactory.class).info("normal msg num {0} date {1}", Integer.MAX_VALUE, newDate());
Output:
INFO: normalmsgnum2,147,483,647date11/22/166:06PM
  • Many Utilities, see below just a few examples:

    • Formatter's
    System.out.println(FormatUtil.format("Mr {0} {1}", "Mohamed", "Kiswani"));
    System.out.println(FormatUtil.format(newDate()));
    System.out.println(FormatUtil.format(newDate(), "yyyy-MM-dd"));
    System.out.println(FormatUtil.format(Integer.MAX_VALUE));
    Output:
    MrMohamedKiswani11/22/166:16PM2016-11-222,147,483,647
    • Json Handlers
      packagejavaff.samples.beans;
      importio.github.rhkiswani.javaff.json.JsonHandler;
      importio.github.rhkiswani.javaff.json.JsonHandlerFactory;
      publicclassMain {
      publicstaticvoidmain(String[] args) {
      Employeeemp = newEmployee();
      emp.setId(100);
      emp.setName("Kiswani");
      emp.setEmpId(1000);
      // comment jakson in pom.xmlSystem.out.println("\n======================= Default based on class path ========================");
      // default json handler gsonSystem.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).toJson(emp));
      System.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).getImplementation());
      // when you uncomment jakson from the pom.xmlSystem.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).toJson(emp));
      System.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).getImplementation());
      System.out.println("\n======================= Force to use Gson By annotation ========================");
      // you want to have jakson for all the classes except the student , student should use Gson// you need to add @GsonBeanStudentstd = newStudent();
      std.setId(100);
      std.setName("Kiswani");
      std.setStdId(1000);
      System.out.println(JsonHandlerFactory.getJsonHandler(Student.class).toJson(emp));
      System.out.println(JsonHandlerFactory.getJsonHandler(Student.class).getImplementation());
      System.out.println("\n======================= Custom Json Handler ========================");
      // you want to add your custom implantation// Note : if you set your custom it will be used everywhereJsonHandlerFactory.instance().setDefault(newMyJsonHandler());
      System.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).toJson(emp));
      System.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).getImplementation());
      System.out.println(JsonHandlerFactory.getJsonHandler(Student.class).toJson(emp));
      System.out.println(JsonHandlerFactory.getJsonHandler(Student.class).getImplementation());
      }
      privatestaticclassMyJsonHandlerimplementsJsonHandler {
      public <T> TfromJson(Strings, ClassaClass) {
      returnnull;
      }
      publicStringtoJson(Objecto) {
      returno.toString();
      }
      publicObjectgetImplementation() {
      returnMyJsonHandler.class;
      }
      }
      packagejavaff.samples.beans;
      importio.github.rhkiswani.javaff.json.annotations.GsonBean;
      @GsonBeanpublicclassStudentextendsPerson{
      privateintstdId;
      publicintgetStdId() {
      returnstdId;
      }
      publicvoidsetStdId(intstdId) {
      this.stdId = stdId;
      }
      }
      }

Prerequisites

Requires JDK 1.7 or higher.

Usage & Examples

Usage & Examples

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

102 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

JavaFF: Java Facade/Factories

Build StatusMaven Central

We all know the Golden Object Oriented rule Don't talk to strangers

We all know that you will never find the API/frameworks defects or magic or limitations at the beginning of the development.

Imagine yourself using API in all your projects for years. Everybody else is using it as well, it is famous and mature. Suddenly you have a huge production issue. Changing that API is too hard and costly at this stage!

What now?

Or you decided to change any API/framework for new requirments. Lets take logging as an example, now we have log4j, logback, JDK logging. At the beginning of the project you decide to go with the logback since it's so famous and faster than log4j and it's bundled with Spring, etc.

After 1 year of the project you got a new requirements for the logging which are:

  • All logs should be localized
  • FATAL errors should be sent to a specific email

Disaster, right?!

Examples for famous bugs in very famous frameworks

Memory Leak

Performance

Deadlocks

So, we should always protect our project and noy use a framework or API directly and this is the main idea here

Main Features

  • This project offers a standard/clear API for the most used API's in the Java Applications like: Exceptions, Locale, Beans, Formatter's, Json Handlers, Loggers, ReflectionHelpers, etc.

  • You can control the implementations through the class path without changing line of code

The below example shows how the implementation will be changed without changing the code: Now I have the below dependencies in my pom.xml

 <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>${slf4.version}</version>
<scope>provided</scope>
</dependency>

So when I call

LogFactory.getLogger(LogFactory.class).info("LOCALIZED_MSG", "Kiswani"); Output:
Nov22, 20166:54:07PMio.github.rhkiswani.javaff.log.Slf4jLoginfoINFO: thisislocalizedmsgfrommessages_en.propertiesthanksforMrKiswani

When I remove the dependencies from the pom.xml and run the same code I will get

LogFactory.getLogger(LogFactory.class).info("LOCALIZED_MSG", "Kiswani");
Output:
Nov22, 20167:00:15PMio.github.rhkiswani.javaff.log.DefaultLoginfoINFO: thisislocalizedmsgfrommessages_en.propertiesthanksforMrKiswani
  • Transparent localization for logs, strings, exceptions

  • Centralized and Configurable Exception Handling by the class type. See below a full example:

packageio.github.rhkiswani.javaff;
importio.github.rhkiswani.javaff.exceptions.ExceptionHandler;
importio.github.rhkiswani.javaff.exceptions.ExceptionHandlersFactory;
importio.github.rhkiswani.javaff.exceptions.ExceptionUtil;
publicclassTestMain {
publicstaticvoidmain(String[] args) {
//Any instance of ConsoleException will be handled hereExceptionHandlersFactory.instance().add(ConsoleException.class, newExceptionHandler() {
@Overridepublicvoidhandle(Throwablet) {
System.out.println("ConsoleException handler");
}
});
//Any instance of MailException will be handled hereExceptionHandlersFactory.instance().add(MailException.class, newExceptionHandler() {
@Overridepublicvoidhandle(Throwablet) {
System.out.println("MailException handler");
}
});
ExceptionUtil.handle(newConsoleException());
ExceptionUtil.handle(newSubConsoleException());
ExceptionUtil.handle(newMailException());
ExceptionUtil.handle(newSubMailException());
//Null is not related to any class from the previous class's, it will be handled by the default handler for Throwable.class//which is printing the stack trace by defaultExceptionUtil.handle(newNullPointerException());
//We decided to override the default implantation for Throwable.classExceptionHandlersFactory.instance().overrideImp(Throwable.class, newExceptionHandler() {
@Overridepublicvoidhandle(Throwablet) {
System.out.println("Overridden handler");
}
});
ExceptionUtil.handle(newNullPointerException());
}
privatestaticclassConsoleExceptionextendsRuntimeException {
}
privatestaticclassSubConsoleExceptionextendsConsoleException {
}
privatestaticclassMailExceptionextendsRuntimeException {
}
privatestaticclassSubMailExceptionextendsMailException {
}
}
  • Logging with localization out of the box
LogFactory.getLogger(LogFactory.class).info("LOCALIZED_MSG", "Kiswani");
Output : INFO: thisislocalizedmsgfrommessages_en.propertiesthanksforMrKiswani
LogFactory.getLogger(LogFactory.class).info("normal msg num {0} date {1}", Integer.MAX_VALUE, newDate());
Output:
INFO: normalmsgnum2,147,483,647date11/22/166:06PM
  • Many Utilities, see below just a few examples:

    • Formatter's
    System.out.println(FormatUtil.format("Mr {0} {1}", "Mohamed", "Kiswani"));
    System.out.println(FormatUtil.format(newDate()));
    System.out.println(FormatUtil.format(newDate(), "yyyy-MM-dd"));
    System.out.println(FormatUtil.format(Integer.MAX_VALUE));
    Output:
    MrMohamedKiswani11/22/166:16PM2016-11-222,147,483,647
    • Json Handlers
      packagejavaff.samples.beans;
      importio.github.rhkiswani.javaff.json.JsonHandler;
      importio.github.rhkiswani.javaff.json.JsonHandlerFactory;
      publicclassMain {
      publicstaticvoidmain(String[] args) {
      Employeeemp = newEmployee();
      emp.setId(100);
      emp.setName("Kiswani");
      emp.setEmpId(1000);
      // comment jakson in pom.xmlSystem.out.println("\n======================= Default based on class path ========================");
      // default json handler gsonSystem.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).toJson(emp));
      System.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).getImplementation());
      // when you uncomment jakson from the pom.xmlSystem.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).toJson(emp));
      System.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).getImplementation());
      System.out.println("\n======================= Force to use Gson By annotation ========================");
      // you want to have jakson for all the classes except the student , student should use Gson// you need to add @GsonBeanStudentstd = newStudent();
      std.setId(100);
      std.setName("Kiswani");
      std.setStdId(1000);
      System.out.println(JsonHandlerFactory.getJsonHandler(Student.class).toJson(emp));
      System.out.println(JsonHandlerFactory.getJsonHandler(Student.class).getImplementation());
      System.out.println("\n======================= Custom Json Handler ========================");
      // you want to add your custom implantation// Note : if you set your custom it will be used everywhereJsonHandlerFactory.instance().setDefault(newMyJsonHandler());
      System.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).toJson(emp));
      System.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).getImplementation());
      System.out.println(JsonHandlerFactory.getJsonHandler(Student.class).toJson(emp));
      System.out.println(JsonHandlerFactory.getJsonHandler(Student.class).getImplementation());
      }
      privatestaticclassMyJsonHandlerimplementsJsonHandler {
      public <T> TfromJson(Strings, ClassaClass) {
      returnnull;
      }
      publicStringtoJson(Objecto) {
      returno.toString();
      }
      publicObjectgetImplementation() {
      returnMyJsonHandler.class;
      }
      }
      packagejavaff.samples.beans;
      importio.github.rhkiswani.javaff.json.annotations.GsonBean;
      @GsonBeanpublicclassStudentextendsPerson{
      privateintstdId;
      publicintgetStdId() {
      returnstdId;
      }
      publicvoidsetStdId(intstdId) {
      this.stdId = stdId;
      }
      }
      }

Prerequisites

Requires JDK 1.7 or higher.

Usage & Examples

Usage & Examples

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

102 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

JavaFF: Java Facade/Factories

Build StatusMaven Central

We all know the Golden Object Oriented rule Don't talk to strangers

We all know that you will never find the API/frameworks defects or magic or limitations at the beginning of the development.

Imagine yourself using API in all your projects for years. Everybody else is using it as well, it is famous and mature. Suddenly you have a huge production issue. Changing that API is too hard and costly at this stage!

What now?

Or you decided to change any API/framework for new requirments. Lets take logging as an example, now we have log4j, logback, JDK logging. At the beginning of the project you decide to go with the logback since it's so famous and faster than log4j and it's bundled with Spring, etc.

After 1 year of the project you got a new requirements for the logging which are:

  • All logs should be localized
  • FATAL errors should be sent to a specific email

Disaster, right?!

Examples for famous bugs in very famous frameworks

Memory Leak

Performance

Deadlocks

So, we should always protect our project and noy use a framework or API directly and this is the main idea here

Main Features

  • This project offers a standard/clear API for the most used API's in the Java Applications like: Exceptions, Locale, Beans, Formatter's, Json Handlers, Loggers, ReflectionHelpers, etc.

  • You can control the implementations through the class path without changing line of code

The below example shows how the implementation will be changed without changing the code: Now I have the below dependencies in my pom.xml

 <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>${slf4.version}</version>
<scope>provided</scope>
</dependency>

So when I call

LogFactory.getLogger(LogFactory.class).info("LOCALIZED_MSG", "Kiswani"); Output:
Nov22, 20166:54:07PMio.github.rhkiswani.javaff.log.Slf4jLoginfoINFO: thisislocalizedmsgfrommessages_en.propertiesthanksforMrKiswani

When I remove the dependencies from the pom.xml and run the same code I will get

LogFactory.getLogger(LogFactory.class).info("LOCALIZED_MSG", "Kiswani");
Output:
Nov22, 20167:00:15PMio.github.rhkiswani.javaff.log.DefaultLoginfoINFO: thisislocalizedmsgfrommessages_en.propertiesthanksforMrKiswani
  • Transparent localization for logs, strings, exceptions

  • Centralized and Configurable Exception Handling by the class type. See below a full example:

packageio.github.rhkiswani.javaff;
importio.github.rhkiswani.javaff.exceptions.ExceptionHandler;
importio.github.rhkiswani.javaff.exceptions.ExceptionHandlersFactory;
importio.github.rhkiswani.javaff.exceptions.ExceptionUtil;
publicclassTestMain {
publicstaticvoidmain(String[] args) {
//Any instance of ConsoleException will be handled hereExceptionHandlersFactory.instance().add(ConsoleException.class, newExceptionHandler() {
@Overridepublicvoidhandle(Throwablet) {
System.out.println("ConsoleException handler");
}
});
//Any instance of MailException will be handled hereExceptionHandlersFactory.instance().add(MailException.class, newExceptionHandler() {
@Overridepublicvoidhandle(Throwablet) {
System.out.println("MailException handler");
}
});
ExceptionUtil.handle(newConsoleException());
ExceptionUtil.handle(newSubConsoleException());
ExceptionUtil.handle(newMailException());
ExceptionUtil.handle(newSubMailException());
//Null is not related to any class from the previous class's, it will be handled by the default handler for Throwable.class//which is printing the stack trace by defaultExceptionUtil.handle(newNullPointerException());
//We decided to override the default implantation for Throwable.classExceptionHandlersFactory.instance().overrideImp(Throwable.class, newExceptionHandler() {
@Overridepublicvoidhandle(Throwablet) {
System.out.println("Overridden handler");
}
});
ExceptionUtil.handle(newNullPointerException());
}
privatestaticclassConsoleExceptionextendsRuntimeException {
}
privatestaticclassSubConsoleExceptionextendsConsoleException {
}
privatestaticclassMailExceptionextendsRuntimeException {
}
privatestaticclassSubMailExceptionextendsMailException {
}
}
  • Logging with localization out of the box
LogFactory.getLogger(LogFactory.class).info("LOCALIZED_MSG", "Kiswani");
Output : INFO: thisislocalizedmsgfrommessages_en.propertiesthanksforMrKiswani
LogFactory.getLogger(LogFactory.class).info("normal msg num {0} date {1}", Integer.MAX_VALUE, newDate());
Output:
INFO: normalmsgnum2,147,483,647date11/22/166:06PM
  • Many Utilities, see below just a few examples:

    • Formatter's
    System.out.println(FormatUtil.format("Mr {0} {1}", "Mohamed", "Kiswani"));
    System.out.println(FormatUtil.format(newDate()));
    System.out.println(FormatUtil.format(newDate(), "yyyy-MM-dd"));
    System.out.println(FormatUtil.format(Integer.MAX_VALUE));
    Output:
    MrMohamedKiswani11/22/166:16PM2016-11-222,147,483,647
    • Json Handlers
      packagejavaff.samples.beans;
      importio.github.rhkiswani.javaff.json.JsonHandler;
      importio.github.rhkiswani.javaff.json.JsonHandlerFactory;
      publicclassMain {
      publicstaticvoidmain(String[] args) {
      Employeeemp = newEmployee();
      emp.setId(100);
      emp.setName("Kiswani");
      emp.setEmpId(1000);
      // comment jakson in pom.xmlSystem.out.println("\n======================= Default based on class path ========================");
      // default json handler gsonSystem.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).toJson(emp));
      System.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).getImplementation());
      // when you uncomment jakson from the pom.xmlSystem.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).toJson(emp));
      System.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).getImplementation());
      System.out.println("\n======================= Force to use Gson By annotation ========================");
      // you want to have jakson for all the classes except the student , student should use Gson// you need to add @GsonBeanStudentstd = newStudent();
      std.setId(100);
      std.setName("Kiswani");
      std.setStdId(1000);
      System.out.println(JsonHandlerFactory.getJsonHandler(Student.class).toJson(emp));
      System.out.println(JsonHandlerFactory.getJsonHandler(Student.class).getImplementation());
      System.out.println("\n======================= Custom Json Handler ========================");
      // you want to add your custom implantation// Note : if you set your custom it will be used everywhereJsonHandlerFactory.instance().setDefault(newMyJsonHandler());
      System.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).toJson(emp));
      System.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).getImplementation());
      System.out.println(JsonHandlerFactory.getJsonHandler(Student.class).toJson(emp));
      System.out.println(JsonHandlerFactory.getJsonHandler(Student.class).getImplementation());
      }
      privatestaticclassMyJsonHandlerimplementsJsonHandler {
      public <T> TfromJson(Strings, ClassaClass) {
      returnnull;
      }
      publicStringtoJson(Objecto) {
      returno.toString();
      }
      publicObjectgetImplementation() {
      returnMyJsonHandler.class;
      }
      }
      packagejavaff.samples.beans;
      importio.github.rhkiswani.javaff.json.annotations.GsonBean;
      @GsonBeanpublicclassStudentextendsPerson{
      privateintstdId;
      publicintgetStdId() {
      returnstdId;
      }
      publicvoidsetStdId(intstdId) {
      this.stdId = stdId;
      }
      }
      }

Prerequisites

Requires JDK 1.7 or higher.

Usage & Examples

Usage & Examples

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

102 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

JavaFF: Java Facade/Factories

Build StatusMaven Central

We all know the Golden Object Oriented rule Don't talk to strangers

We all know that you will never find the API/frameworks defects or magic or limitations at the beginning of the development.

Imagine yourself using API in all your projects for years. Everybody else is using it as well, it is famous and mature. Suddenly you have a huge production issue. Changing that API is too hard and costly at this stage!

What now?

Or you decided to change any API/framework for new requirments. Lets take logging as an example, now we have log4j, logback, JDK logging. At the beginning of the project you decide to go with the logback since it's so famous and faster than log4j and it's bundled with Spring, etc.

After 1 year of the project you got a new requirements for the logging which are:

  • All logs should be localized
  • FATAL errors should be sent to a specific email

Disaster, right?!

Examples for famous bugs in very famous frameworks

Memory Leak

Performance

Deadlocks

So, we should always protect our project and noy use a framework or API directly and this is the main idea here

Main Features

  • This project offers a standard/clear API for the most used API's in the Java Applications like: Exceptions, Locale, Beans, Formatter's, Json Handlers, Loggers, ReflectionHelpers, etc.

  • You can control the implementations through the class path without changing line of code

The below example shows how the implementation will be changed without changing the code: Now I have the below dependencies in my pom.xml

 <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>${slf4.version}</version>
<scope>provided</scope>
</dependency>

So when I call

LogFactory.getLogger(LogFactory.class).info("LOCALIZED_MSG", "Kiswani"); Output:
Nov22, 20166:54:07PMio.github.rhkiswani.javaff.log.Slf4jLoginfoINFO: thisislocalizedmsgfrommessages_en.propertiesthanksforMrKiswani

When I remove the dependencies from the pom.xml and run the same code I will get

LogFactory.getLogger(LogFactory.class).info("LOCALIZED_MSG", "Kiswani");
Output:
Nov22, 20167:00:15PMio.github.rhkiswani.javaff.log.DefaultLoginfoINFO: thisislocalizedmsgfrommessages_en.propertiesthanksforMrKiswani
  • Transparent localization for logs, strings, exceptions

  • Centralized and Configurable Exception Handling by the class type. See below a full example:

packageio.github.rhkiswani.javaff;
importio.github.rhkiswani.javaff.exceptions.ExceptionHandler;
importio.github.rhkiswani.javaff.exceptions.ExceptionHandlersFactory;
importio.github.rhkiswani.javaff.exceptions.ExceptionUtil;
publicclassTestMain {
publicstaticvoidmain(String[] args) {
//Any instance of ConsoleException will be handled hereExceptionHandlersFactory.instance().add(ConsoleException.class, newExceptionHandler() {
@Overridepublicvoidhandle(Throwablet) {
System.out.println("ConsoleException handler");
}
});
//Any instance of MailException will be handled hereExceptionHandlersFactory.instance().add(MailException.class, newExceptionHandler() {
@Overridepublicvoidhandle(Throwablet) {
System.out.println("MailException handler");
}
});
ExceptionUtil.handle(newConsoleException());
ExceptionUtil.handle(newSubConsoleException());
ExceptionUtil.handle(newMailException());
ExceptionUtil.handle(newSubMailException());
//Null is not related to any class from the previous class's, it will be handled by the default handler for Throwable.class//which is printing the stack trace by defaultExceptionUtil.handle(newNullPointerException());
//We decided to override the default implantation for Throwable.classExceptionHandlersFactory.instance().overrideImp(Throwable.class, newExceptionHandler() {
@Overridepublicvoidhandle(Throwablet) {
System.out.println("Overridden handler");
}
});
ExceptionUtil.handle(newNullPointerException());
}
privatestaticclassConsoleExceptionextendsRuntimeException {
}
privatestaticclassSubConsoleExceptionextendsConsoleException {
}
privatestaticclassMailExceptionextendsRuntimeException {
}
privatestaticclassSubMailExceptionextendsMailException {
}
}
  • Logging with localization out of the box
LogFactory.getLogger(LogFactory.class).info("LOCALIZED_MSG", "Kiswani");
Output : INFO: thisislocalizedmsgfrommessages_en.propertiesthanksforMrKiswani
LogFactory.getLogger(LogFactory.class).info("normal msg num {0} date {1}", Integer.MAX_VALUE, newDate());
Output:
INFO: normalmsgnum2,147,483,647date11/22/166:06PM
  • Many Utilities, see below just a few examples:

    • Formatter's
    System.out.println(FormatUtil.format("Mr {0} {1}", "Mohamed", "Kiswani"));
    System.out.println(FormatUtil.format(newDate()));
    System.out.println(FormatUtil.format(newDate(), "yyyy-MM-dd"));
    System.out.println(FormatUtil.format(Integer.MAX_VALUE));
    Output:
    MrMohamedKiswani11/22/166:16PM2016-11-222,147,483,647
    • Json Handlers
      packagejavaff.samples.beans;
      importio.github.rhkiswani.javaff.json.JsonHandler;
      importio.github.rhkiswani.javaff.json.JsonHandlerFactory;
      publicclassMain {
      publicstaticvoidmain(String[] args) {
      Employeeemp = newEmployee();
      emp.setId(100);
      emp.setName("Kiswani");
      emp.setEmpId(1000);
      // comment jakson in pom.xmlSystem.out.println("\n======================= Default based on class path ========================");
      // default json handler gsonSystem.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).toJson(emp));
      System.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).getImplementation());
      // when you uncomment jakson from the pom.xmlSystem.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).toJson(emp));
      System.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).getImplementation());
      System.out.println("\n======================= Force to use Gson By annotation ========================");
      // you want to have jakson for all the classes except the student , student should use Gson// you need to add @GsonBeanStudentstd = newStudent();
      std.setId(100);
      std.setName("Kiswani");
      std.setStdId(1000);
      System.out.println(JsonHandlerFactory.getJsonHandler(Student.class).toJson(emp));
      System.out.println(JsonHandlerFactory.getJsonHandler(Student.class).getImplementation());
      System.out.println("\n======================= Custom Json Handler ========================");
      // you want to add your custom implantation// Note : if you set your custom it will be used everywhereJsonHandlerFactory.instance().setDefault(newMyJsonHandler());
      System.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).toJson(emp));
      System.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).getImplementation());
      System.out.println(JsonHandlerFactory.getJsonHandler(Student.class).toJson(emp));
      System.out.println(JsonHandlerFactory.getJsonHandler(Student.class).getImplementation());
      }
      privatestaticclassMyJsonHandlerimplementsJsonHandler {
      public <T> TfromJson(Strings, ClassaClass) {
      returnnull;
      }
      publicStringtoJson(Objecto) {
      returno.toString();
      }
      publicObjectgetImplementation() {
      returnMyJsonHandler.class;
      }
      }
      packagejavaff.samples.beans;
      importio.github.rhkiswani.javaff.json.annotations.GsonBean;
      @GsonBeanpublicclassStudentextendsPerson{
      privateintstdId;
      publicintgetStdId() {
      returnstdId;
      }
      publicvoidsetStdId(intstdId) {
      this.stdId = stdId;
      }
      }
      }

Prerequisites

Requires JDK 1.7 or higher.

Usage & Examples

Usage & Examples

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

102 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

JavaFF: Java Facade/Factories

Build StatusMaven Central

We all know the Golden Object Oriented rule Don't talk to strangers

We all know that you will never find the API/frameworks defects or magic or limitations at the beginning of the development.

Imagine yourself using API in all your projects for years. Everybody else is using it as well, it is famous and mature. Suddenly you have a huge production issue. Changing that API is too hard and costly at this stage!

What now?

Or you decided to change any API/framework for new requirments. Lets take logging as an example, now we have log4j, logback, JDK logging. At the beginning of the project you decide to go with the logback since it's so famous and faster than log4j and it's bundled with Spring, etc.

After 1 year of the project you got a new requirements for the logging which are:

  • All logs should be localized
  • FATAL errors should be sent to a specific email

Disaster, right?!

Examples for famous bugs in very famous frameworks

Memory Leak

Performance

Deadlocks

So, we should always protect our project and noy use a framework or API directly and this is the main idea here

Main Features

  • This project offers a standard/clear API for the most used API's in the Java Applications like: Exceptions, Locale, Beans, Formatter's, Json Handlers, Loggers, ReflectionHelpers, etc.

  • You can control the implementations through the class path without changing line of code

The below example shows how the implementation will be changed without changing the code: Now I have the below dependencies in my pom.xml

 <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>${slf4.version}</version>
<scope>provided</scope>
</dependency>

So when I call

LogFactory.getLogger(LogFactory.class).info("LOCALIZED_MSG", "Kiswani"); Output:
Nov22, 20166:54:07PMio.github.rhkiswani.javaff.log.Slf4jLoginfoINFO: thisislocalizedmsgfrommessages_en.propertiesthanksforMrKiswani

When I remove the dependencies from the pom.xml and run the same code I will get

LogFactory.getLogger(LogFactory.class).info("LOCALIZED_MSG", "Kiswani");
Output:
Nov22, 20167:00:15PMio.github.rhkiswani.javaff.log.DefaultLoginfoINFO: thisislocalizedmsgfrommessages_en.propertiesthanksforMrKiswani
  • Transparent localization for logs, strings, exceptions

  • Centralized and Configurable Exception Handling by the class type. See below a full example:

packageio.github.rhkiswani.javaff;
importio.github.rhkiswani.javaff.exceptions.ExceptionHandler;
importio.github.rhkiswani.javaff.exceptions.ExceptionHandlersFactory;
importio.github.rhkiswani.javaff.exceptions.ExceptionUtil;
publicclassTestMain {
publicstaticvoidmain(String[] args) {
//Any instance of ConsoleException will be handled hereExceptionHandlersFactory.instance().add(ConsoleException.class, newExceptionHandler() {
@Overridepublicvoidhandle(Throwablet) {
System.out.println("ConsoleException handler");
}
});
//Any instance of MailException will be handled hereExceptionHandlersFactory.instance().add(MailException.class, newExceptionHandler() {
@Overridepublicvoidhandle(Throwablet) {
System.out.println("MailException handler");
}
});
ExceptionUtil.handle(newConsoleException());
ExceptionUtil.handle(newSubConsoleException());
ExceptionUtil.handle(newMailException());
ExceptionUtil.handle(newSubMailException());
//Null is not related to any class from the previous class's, it will be handled by the default handler for Throwable.class//which is printing the stack trace by defaultExceptionUtil.handle(newNullPointerException());
//We decided to override the default implantation for Throwable.classExceptionHandlersFactory.instance().overrideImp(Throwable.class, newExceptionHandler() {
@Overridepublicvoidhandle(Throwablet) {
System.out.println("Overridden handler");
}
});
ExceptionUtil.handle(newNullPointerException());
}
privatestaticclassConsoleExceptionextendsRuntimeException {
}
privatestaticclassSubConsoleExceptionextendsConsoleException {
}
privatestaticclassMailExceptionextendsRuntimeException {
}
privatestaticclassSubMailExceptionextendsMailException {
}
}
  • Logging with localization out of the box
LogFactory.getLogger(LogFactory.class).info("LOCALIZED_MSG", "Kiswani");
Output : INFO: thisislocalizedmsgfrommessages_en.propertiesthanksforMrKiswani
LogFactory.getLogger(LogFactory.class).info("normal msg num {0} date {1}", Integer.MAX_VALUE, newDate());
Output:
INFO: normalmsgnum2,147,483,647date11/22/166:06PM
  • Many Utilities, see below just a few examples:

    • Formatter's
    System.out.println(FormatUtil.format("Mr {0} {1}", "Mohamed", "Kiswani"));
    System.out.println(FormatUtil.format(newDate()));
    System.out.println(FormatUtil.format(newDate(), "yyyy-MM-dd"));
    System.out.println(FormatUtil.format(Integer.MAX_VALUE));
    Output:
    MrMohamedKiswani11/22/166:16PM2016-11-222,147,483,647
    • Json Handlers
      packagejavaff.samples.beans;
      importio.github.rhkiswani.javaff.json.JsonHandler;
      importio.github.rhkiswani.javaff.json.JsonHandlerFactory;
      publicclassMain {
      publicstaticvoidmain(String[] args) {
      Employeeemp = newEmployee();
      emp.setId(100);
      emp.setName("Kiswani");
      emp.setEmpId(1000);
      // comment jakson in pom.xmlSystem.out.println("\n======================= Default based on class path ========================");
      // default json handler gsonSystem.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).toJson(emp));
      System.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).getImplementation());
      // when you uncomment jakson from the pom.xmlSystem.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).toJson(emp));
      System.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).getImplementation());
      System.out.println("\n======================= Force to use Gson By annotation ========================");
      // you want to have jakson for all the classes except the student , student should use Gson// you need to add @GsonBeanStudentstd = newStudent();
      std.setId(100);
      std.setName("Kiswani");
      std.setStdId(1000);
      System.out.println(JsonHandlerFactory.getJsonHandler(Student.class).toJson(emp));
      System.out.println(JsonHandlerFactory.getJsonHandler(Student.class).getImplementation());
      System.out.println("\n======================= Custom Json Handler ========================");
      // you want to add your custom implantation// Note : if you set your custom it will be used everywhereJsonHandlerFactory.instance().setDefault(newMyJsonHandler());
      System.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).toJson(emp));
      System.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).getImplementation());
      System.out.println(JsonHandlerFactory.getJsonHandler(Student.class).toJson(emp));
      System.out.println(JsonHandlerFactory.getJsonHandler(Student.class).getImplementation());
      }
      privatestaticclassMyJsonHandlerimplementsJsonHandler {
      public <T> TfromJson(Strings, ClassaClass) {
      returnnull;
      }
      publicStringtoJson(Objecto) {
      returno.toString();
      }
      publicObjectgetImplementation() {
      returnMyJsonHandler.class;
      }
      }
      packagejavaff.samples.beans;
      importio.github.rhkiswani.javaff.json.annotations.GsonBean;
      @GsonBeanpublicclassStudentextendsPerson{
      privateintstdId;
      publicintgetStdId() {
      returnstdId;
      }
      publicvoidsetStdId(intstdId) {
      this.stdId = stdId;
      }
      }
      }

Prerequisites

Requires JDK 1.7 or higher.

Usage & Examples

Usage & Examples

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

102 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

JavaFF: Java Facade/Factories

Build StatusMaven Central

We all know the Golden Object Oriented rule Don't talk to strangers

We all know that you will never find the API/frameworks defects or magic or limitations at the beginning of the development.

Imagine yourself using API in all your projects for years. Everybody else is using it as well, it is famous and mature. Suddenly you have a huge production issue. Changing that API is too hard and costly at this stage!

What now?

Or you decided to change any API/framework for new requirments. Lets take logging as an example, now we have log4j, logback, JDK logging. At the beginning of the project you decide to go with the logback since it's so famous and faster than log4j and it's bundled with Spring, etc.

After 1 year of the project you got a new requirements for the logging which are:

  • All logs should be localized
  • FATAL errors should be sent to a specific email

Disaster, right?!

Examples for famous bugs in very famous frameworks

Memory Leak

Performance

Deadlocks

So, we should always protect our project and noy use a framework or API directly and this is the main idea here

Main Features

  • This project offers a standard/clear API for the most used API's in the Java Applications like: Exceptions, Locale, Beans, Formatter's, Json Handlers, Loggers, ReflectionHelpers, etc.

  • You can control the implementations through the class path without changing line of code

The below example shows how the implementation will be changed without changing the code: Now I have the below dependencies in my pom.xml

 <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>${slf4.version}</version>
<scope>provided</scope>
</dependency>

So when I call

LogFactory.getLogger(LogFactory.class).info("LOCALIZED_MSG", "Kiswani"); Output:
Nov22, 20166:54:07PMio.github.rhkiswani.javaff.log.Slf4jLoginfoINFO: thisislocalizedmsgfrommessages_en.propertiesthanksforMrKiswani

When I remove the dependencies from the pom.xml and run the same code I will get

LogFactory.getLogger(LogFactory.class).info("LOCALIZED_MSG", "Kiswani");
Output:
Nov22, 20167:00:15PMio.github.rhkiswani.javaff.log.DefaultLoginfoINFO: thisislocalizedmsgfrommessages_en.propertiesthanksforMrKiswani
  • Transparent localization for logs, strings, exceptions

  • Centralized and Configurable Exception Handling by the class type. See below a full example:

packageio.github.rhkiswani.javaff;
importio.github.rhkiswani.javaff.exceptions.ExceptionHandler;
importio.github.rhkiswani.javaff.exceptions.ExceptionHandlersFactory;
importio.github.rhkiswani.javaff.exceptions.ExceptionUtil;
publicclassTestMain {
publicstaticvoidmain(String[] args) {
//Any instance of ConsoleException will be handled hereExceptionHandlersFactory.instance().add(ConsoleException.class, newExceptionHandler() {
@Overridepublicvoidhandle(Throwablet) {
System.out.println("ConsoleException handler");
}
});
//Any instance of MailException will be handled hereExceptionHandlersFactory.instance().add(MailException.class, newExceptionHandler() {
@Overridepublicvoidhandle(Throwablet) {
System.out.println("MailException handler");
}
});
ExceptionUtil.handle(newConsoleException());
ExceptionUtil.handle(newSubConsoleException());
ExceptionUtil.handle(newMailException());
ExceptionUtil.handle(newSubMailException());
//Null is not related to any class from the previous class's, it will be handled by the default handler for Throwable.class//which is printing the stack trace by defaultExceptionUtil.handle(newNullPointerException());
//We decided to override the default implantation for Throwable.classExceptionHandlersFactory.instance().overrideImp(Throwable.class, newExceptionHandler() {
@Overridepublicvoidhandle(Throwablet) {
System.out.println("Overridden handler");
}
});
ExceptionUtil.handle(newNullPointerException());
}
privatestaticclassConsoleExceptionextendsRuntimeException {
}
privatestaticclassSubConsoleExceptionextendsConsoleException {
}
privatestaticclassMailExceptionextendsRuntimeException {
}
privatestaticclassSubMailExceptionextendsMailException {
}
}
  • Logging with localization out of the box
LogFactory.getLogger(LogFactory.class).info("LOCALIZED_MSG", "Kiswani");
Output : INFO: thisislocalizedmsgfrommessages_en.propertiesthanksforMrKiswani
LogFactory.getLogger(LogFactory.class).info("normal msg num {0} date {1}", Integer.MAX_VALUE, newDate());
Output:
INFO: normalmsgnum2,147,483,647date11/22/166:06PM
  • Many Utilities, see below just a few examples:

    • Formatter's
    System.out.println(FormatUtil.format("Mr {0} {1}", "Mohamed", "Kiswani"));
    System.out.println(FormatUtil.format(newDate()));
    System.out.println(FormatUtil.format(newDate(), "yyyy-MM-dd"));
    System.out.println(FormatUtil.format(Integer.MAX_VALUE));
    Output:
    MrMohamedKiswani11/22/166:16PM2016-11-222,147,483,647
    • Json Handlers
      packagejavaff.samples.beans;
      importio.github.rhkiswani.javaff.json.JsonHandler;
      importio.github.rhkiswani.javaff.json.JsonHandlerFactory;
      publicclassMain {
      publicstaticvoidmain(String[] args) {
      Employeeemp = newEmployee();
      emp.setId(100);
      emp.setName("Kiswani");
      emp.setEmpId(1000);
      // comment jakson in pom.xmlSystem.out.println("\n======================= Default based on class path ========================");
      // default json handler gsonSystem.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).toJson(emp));
      System.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).getImplementation());
      // when you uncomment jakson from the pom.xmlSystem.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).toJson(emp));
      System.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).getImplementation());
      System.out.println("\n======================= Force to use Gson By annotation ========================");
      // you want to have jakson for all the classes except the student , student should use Gson// you need to add @GsonBeanStudentstd = newStudent();
      std.setId(100);
      std.setName("Kiswani");
      std.setStdId(1000);
      System.out.println(JsonHandlerFactory.getJsonHandler(Student.class).toJson(emp));
      System.out.println(JsonHandlerFactory.getJsonHandler(Student.class).getImplementation());
      System.out.println("\n======================= Custom Json Handler ========================");
      // you want to add your custom implantation// Note : if you set your custom it will be used everywhereJsonHandlerFactory.instance().setDefault(newMyJsonHandler());
      System.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).toJson(emp));
      System.out.println(JsonHandlerFactory.getJsonHandler(Employee.class).getImplementation());
      System.out.println(JsonHandlerFactory.getJsonHandler(Student.class).toJson(emp));
      System.out.println(JsonHandlerFactory.getJsonHandler(Student.class).getImplementation());
      }
      privatestaticclassMyJsonHandlerimplementsJsonHandler {
      public <T> TfromJson(Strings, ClassaClass) {
      returnnull;
      }
      publicStringtoJson(Objecto) {
      returno.toString();
      }
      publicObjectgetImplementation() {
      returnMyJsonHandler.class;
      }
      }
      packagejavaff.samples.beans;
      importio.github.rhkiswani.javaff.json.annotations.GsonBean;
      @GsonBeanpublicclassStudentextendsPerson{
      privateintstdId;
      publicintgetStdId() {
      returnstdId;
      }
      publicvoidsetStdId(intstdId) {
      this.stdId = stdId;
      }
      }
      }

Prerequisites

Requires JDK 1.7 or higher.

Usage & Examples

Usage & Examples

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages