Post on 28-Dec-2015
ASINUS FRAMEWORK
Oumlzguumlr Rahmi Doumlnmez
Infrastructure
Asinus Documentation amp Forum
Asinus Blog Asinus documentation amp distribution
httpturkcell-imturkcellcomtrwordpress
User ttech Password test
Asinus Forum Questions amp Comments here
httpturkcell-imturkcellcomtrphpBB
User ttech Password test
Asinus Eclipse Plugin Video
You can start Asinus from Plugin
Eclipse Plugin
httpturkcell-imturkcellcomtrwordpressp=2410
Eclipse Plugin Video
httpturkcell-imturkcellcomtrwordpresswp-contentuploads201008asinus_eclipse_pluginhtml
Asinus ProjectsLIVE
Gncplay httpgncplaycom Gezenzi httpwwwgezenzicom
Footbo httpmfootbocomtr Turkcellim httpwapturkcell-imcomtr
COMING SOON
Eğitim portal
Turkcell Widgets (LocationMMSSMShellip)
Kristal Project
Push Notificatinos
What is Asinus
Asinus is a Web Application amp Service Development Framework
What is Asinus
Aim
bull To be common and standart infrastructure for Turkcell Turkcell Partnerrsquos WebWap Applications
bull To ease the web app amp service development for web developers
Aim
bull To decrease ldquotime to marketrdquo of changing
requirements
bull To avoid common errors web amp service developers can easily make
Why Asinus Question
Spring is also a complete webservice framework solution
Why would I use Asinus
Our Answer bull Spring is not enough to be modularbull Spring is not enough to be standard
(Spring does not strictly enforce applications to be implemented
in a standard way)bull Spring has no integrated wap solutionbull Many useful pluggable components can be added
Letrsquos CompareFeature Asinus Spring Struts
Modular Development SupportYes Yes
(Only in Osgi platforms)No
WAP Development Support(Device dependent renderingtemplate selection acc to category subcategory device)
Yes No No
AB Testing Support Yes No No
Complete Security Solutions (Encodingcsrf protection)
Yes No No
Pluggable and Standardized Cache Implementations(EhcacheMemcachedNearcache)
Yes No No
Configuration According to Environment
Yes No No
Configuration change on the fly Yes No No
AuthomizedException amp Error Handling
Yes No No
Letrsquos CompareFeature Asinus Spring Struts
Authomized JSON Services
Yes No No
Authomized Module Caching
Yes No No
Distributed Session Management
Yes No No
Authomized Session support for cookie disabled devices
Yes No No
Authomized Resource Management (Close- reopen resources on the fly)
Yes No No
Authomized Performance Management amp Monitoring
Yes No No
Enable debugging for a single request on production
Yes No No
Development Times
bull Implementing a ldquoHello worldldquo application is much faster than Spring
bull Development times are approximately equals for both Asinus and Spring
(Assume Asinus component library is not used)
bull Asinus component library speeds up your development
Another Critical Question
Question
Can I use all other Spring features in Asinus Framework
Our Answer
Yes exactly
High Level Architecture
Asinus as Web App Dev Framework
Asinus hides Servlet API from developer
bull Resolves HttpServletRequest as Asinus RequestContext
bull RequestContext is then propogated as module requests
Asinus as Service Framework
Asinus is also a Service Framework because
bull Covers webservices
bull Supports JSON services
bull Supports RESTFULL services
Asinus Modules
bull Asinus works with modules so you should implement your own modules
bull Module is a reusable component that realizes a business on its own
For eample Weather moduleLocation ModuleCreditCard Modulehellip
Asinus Modulesbull Easy to package
Jar format
bull Reusable in any Asinus Project
Just add to classpath
Freemarker is the right technology Jsp is not
bull Can be loaded on the fly
Dynamic loading using Asinus admin console
Package Structure Module Class
Package Structure ActionController
Package structure views
Package Structure Domain amp Repository
Objects
Package structure MCS Content
Package structure Module Configuration
Package structure Static Content
Creating Modules
bull ManuallyDocument ldquoFirst installationrdquo
httpturkcell-imturkcellcomtrwordpressp=160
Document ldquoDeveloping modulesrdquo
httpturkcell-imturkcellcomtrwordpressp=532
bull Using Eclipse Pluginhttpturkcell-imturkcellcomtrwordpressp=2410
Eclipse PluginCreating New Project
Eclipse Plugin
Eclipse PluginCreating New ActionController
Eclipse PluginCreating New Webservice
Eclipse PluginImporting Asinus-Showcase Application
(Asinus Examples)
Asinus as Dependency Injection Framework
bull Spring ApplicationContext is used
No tight dependencySpring can be replaceable
bull No dependency on Spring annotations
Use ConfiguredBean and Resource annotations
ConfiguredBean Resource
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
AddressService addressService
public void service()
addressServiceservice(hellip)
bull You can fully utilize Spring FrameworkCreate Spring Beans and
define in asinus-beans-ltanyNamegtxml
bull Asinus initializes both
ConfiguredBeanrsquos + Spring Beans
Asinus ampSpring Framework
How Asinus Initalizes
bull Initializes spring beans and ConfiguredBeanrsquos
bull Inject dependencies (Resource)
How Asinus Initalizes
bull Executes Initialize annotated methods
bull Executes SimpleJob and CronJob annotated jobs
Asinus Components
bull CORE COMPONENTS ndash Not pluggable
RequestHandler
ModuleController
ProtocolHandler
ExecutionManager
Request Processors
Response Processors
Asinus Components
bull PLUGGABLE COMPONENTS ndash Pluggable
ConfigurationManagerCacheManagerInMemoryCacheManagerSessionManagerCookieManagerHeaderManagerSanitizerDeviceManagerRequestContextSummaryHolderResourceManagerPerformanceManagerResponseToDeviceAdapterTemplateSelectorSecurityManagerAuthenticationManagerOpenIdAuthenticationManagerFacebookAuthenticationManageri18NManagerhellip
How to Plug any Component bull Implement the Component Interface
ie CacheManagerConfigurationManager
bull Define in ldquoasinuspropertiesrdquo
asinuscacheManager=myCacheManager
Asinus Components
Request Lifecycle RequestContext
bull Holds request information
bull Propogates through all layers
RequestContext
bull RequestContext Summary is bind to ThreadLocalInject RequestContextSummaryHolder component
bull Attributes contextRootmodemoduleactionpathInfooriginalPathInfocookiesrequestCookiesrequestParametersattributeshostnamemachineinstancelocaleuserdeviceuseragentheadersrefererxforwardedformimeRequestmodelBeanmodelBeanValidationErrorshellip
RequestContextAttributes
bull From Action Controller public class ViewActionController implements BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
boolean paramA = requestgetRequestContext()getRequestParameters()
getRequestParamaterValueAsBoolean(a)
String cookieValueA = requestgetRequestContext()
getRequestCookies()get(a)getValue
String clientAddress = requestgetRequestContext()getRemoteAddress()
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Asinus Documentation amp Forum
Asinus Blog Asinus documentation amp distribution
httpturkcell-imturkcellcomtrwordpress
User ttech Password test
Asinus Forum Questions amp Comments here
httpturkcell-imturkcellcomtrphpBB
User ttech Password test
Asinus Eclipse Plugin Video
You can start Asinus from Plugin
Eclipse Plugin
httpturkcell-imturkcellcomtrwordpressp=2410
Eclipse Plugin Video
httpturkcell-imturkcellcomtrwordpresswp-contentuploads201008asinus_eclipse_pluginhtml
Asinus ProjectsLIVE
Gncplay httpgncplaycom Gezenzi httpwwwgezenzicom
Footbo httpmfootbocomtr Turkcellim httpwapturkcell-imcomtr
COMING SOON
Eğitim portal
Turkcell Widgets (LocationMMSSMShellip)
Kristal Project
Push Notificatinos
What is Asinus
Asinus is a Web Application amp Service Development Framework
What is Asinus
Aim
bull To be common and standart infrastructure for Turkcell Turkcell Partnerrsquos WebWap Applications
bull To ease the web app amp service development for web developers
Aim
bull To decrease ldquotime to marketrdquo of changing
requirements
bull To avoid common errors web amp service developers can easily make
Why Asinus Question
Spring is also a complete webservice framework solution
Why would I use Asinus
Our Answer bull Spring is not enough to be modularbull Spring is not enough to be standard
(Spring does not strictly enforce applications to be implemented
in a standard way)bull Spring has no integrated wap solutionbull Many useful pluggable components can be added
Letrsquos CompareFeature Asinus Spring Struts
Modular Development SupportYes Yes
(Only in Osgi platforms)No
WAP Development Support(Device dependent renderingtemplate selection acc to category subcategory device)
Yes No No
AB Testing Support Yes No No
Complete Security Solutions (Encodingcsrf protection)
Yes No No
Pluggable and Standardized Cache Implementations(EhcacheMemcachedNearcache)
Yes No No
Configuration According to Environment
Yes No No
Configuration change on the fly Yes No No
AuthomizedException amp Error Handling
Yes No No
Letrsquos CompareFeature Asinus Spring Struts
Authomized JSON Services
Yes No No
Authomized Module Caching
Yes No No
Distributed Session Management
Yes No No
Authomized Session support for cookie disabled devices
Yes No No
Authomized Resource Management (Close- reopen resources on the fly)
Yes No No
Authomized Performance Management amp Monitoring
Yes No No
Enable debugging for a single request on production
Yes No No
Development Times
bull Implementing a ldquoHello worldldquo application is much faster than Spring
bull Development times are approximately equals for both Asinus and Spring
(Assume Asinus component library is not used)
bull Asinus component library speeds up your development
Another Critical Question
Question
Can I use all other Spring features in Asinus Framework
Our Answer
Yes exactly
High Level Architecture
Asinus as Web App Dev Framework
Asinus hides Servlet API from developer
bull Resolves HttpServletRequest as Asinus RequestContext
bull RequestContext is then propogated as module requests
Asinus as Service Framework
Asinus is also a Service Framework because
bull Covers webservices
bull Supports JSON services
bull Supports RESTFULL services
Asinus Modules
bull Asinus works with modules so you should implement your own modules
bull Module is a reusable component that realizes a business on its own
For eample Weather moduleLocation ModuleCreditCard Modulehellip
Asinus Modulesbull Easy to package
Jar format
bull Reusable in any Asinus Project
Just add to classpath
Freemarker is the right technology Jsp is not
bull Can be loaded on the fly
Dynamic loading using Asinus admin console
Package Structure Module Class
Package Structure ActionController
Package structure views
Package Structure Domain amp Repository
Objects
Package structure MCS Content
Package structure Module Configuration
Package structure Static Content
Creating Modules
bull ManuallyDocument ldquoFirst installationrdquo
httpturkcell-imturkcellcomtrwordpressp=160
Document ldquoDeveloping modulesrdquo
httpturkcell-imturkcellcomtrwordpressp=532
bull Using Eclipse Pluginhttpturkcell-imturkcellcomtrwordpressp=2410
Eclipse PluginCreating New Project
Eclipse Plugin
Eclipse PluginCreating New ActionController
Eclipse PluginCreating New Webservice
Eclipse PluginImporting Asinus-Showcase Application
(Asinus Examples)
Asinus as Dependency Injection Framework
bull Spring ApplicationContext is used
No tight dependencySpring can be replaceable
bull No dependency on Spring annotations
Use ConfiguredBean and Resource annotations
ConfiguredBean Resource
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
AddressService addressService
public void service()
addressServiceservice(hellip)
bull You can fully utilize Spring FrameworkCreate Spring Beans and
define in asinus-beans-ltanyNamegtxml
bull Asinus initializes both
ConfiguredBeanrsquos + Spring Beans
Asinus ampSpring Framework
How Asinus Initalizes
bull Initializes spring beans and ConfiguredBeanrsquos
bull Inject dependencies (Resource)
How Asinus Initalizes
bull Executes Initialize annotated methods
bull Executes SimpleJob and CronJob annotated jobs
Asinus Components
bull CORE COMPONENTS ndash Not pluggable
RequestHandler
ModuleController
ProtocolHandler
ExecutionManager
Request Processors
Response Processors
Asinus Components
bull PLUGGABLE COMPONENTS ndash Pluggable
ConfigurationManagerCacheManagerInMemoryCacheManagerSessionManagerCookieManagerHeaderManagerSanitizerDeviceManagerRequestContextSummaryHolderResourceManagerPerformanceManagerResponseToDeviceAdapterTemplateSelectorSecurityManagerAuthenticationManagerOpenIdAuthenticationManagerFacebookAuthenticationManageri18NManagerhellip
How to Plug any Component bull Implement the Component Interface
ie CacheManagerConfigurationManager
bull Define in ldquoasinuspropertiesrdquo
asinuscacheManager=myCacheManager
Asinus Components
Request Lifecycle RequestContext
bull Holds request information
bull Propogates through all layers
RequestContext
bull RequestContext Summary is bind to ThreadLocalInject RequestContextSummaryHolder component
bull Attributes contextRootmodemoduleactionpathInfooriginalPathInfocookiesrequestCookiesrequestParametersattributeshostnamemachineinstancelocaleuserdeviceuseragentheadersrefererxforwardedformimeRequestmodelBeanmodelBeanValidationErrorshellip
RequestContextAttributes
bull From Action Controller public class ViewActionController implements BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
boolean paramA = requestgetRequestContext()getRequestParameters()
getRequestParamaterValueAsBoolean(a)
String cookieValueA = requestgetRequestContext()
getRequestCookies()get(a)getValue
String clientAddress = requestgetRequestContext()getRemoteAddress()
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Asinus Eclipse Plugin Video
You can start Asinus from Plugin
Eclipse Plugin
httpturkcell-imturkcellcomtrwordpressp=2410
Eclipse Plugin Video
httpturkcell-imturkcellcomtrwordpresswp-contentuploads201008asinus_eclipse_pluginhtml
Asinus ProjectsLIVE
Gncplay httpgncplaycom Gezenzi httpwwwgezenzicom
Footbo httpmfootbocomtr Turkcellim httpwapturkcell-imcomtr
COMING SOON
Eğitim portal
Turkcell Widgets (LocationMMSSMShellip)
Kristal Project
Push Notificatinos
What is Asinus
Asinus is a Web Application amp Service Development Framework
What is Asinus
Aim
bull To be common and standart infrastructure for Turkcell Turkcell Partnerrsquos WebWap Applications
bull To ease the web app amp service development for web developers
Aim
bull To decrease ldquotime to marketrdquo of changing
requirements
bull To avoid common errors web amp service developers can easily make
Why Asinus Question
Spring is also a complete webservice framework solution
Why would I use Asinus
Our Answer bull Spring is not enough to be modularbull Spring is not enough to be standard
(Spring does not strictly enforce applications to be implemented
in a standard way)bull Spring has no integrated wap solutionbull Many useful pluggable components can be added
Letrsquos CompareFeature Asinus Spring Struts
Modular Development SupportYes Yes
(Only in Osgi platforms)No
WAP Development Support(Device dependent renderingtemplate selection acc to category subcategory device)
Yes No No
AB Testing Support Yes No No
Complete Security Solutions (Encodingcsrf protection)
Yes No No
Pluggable and Standardized Cache Implementations(EhcacheMemcachedNearcache)
Yes No No
Configuration According to Environment
Yes No No
Configuration change on the fly Yes No No
AuthomizedException amp Error Handling
Yes No No
Letrsquos CompareFeature Asinus Spring Struts
Authomized JSON Services
Yes No No
Authomized Module Caching
Yes No No
Distributed Session Management
Yes No No
Authomized Session support for cookie disabled devices
Yes No No
Authomized Resource Management (Close- reopen resources on the fly)
Yes No No
Authomized Performance Management amp Monitoring
Yes No No
Enable debugging for a single request on production
Yes No No
Development Times
bull Implementing a ldquoHello worldldquo application is much faster than Spring
bull Development times are approximately equals for both Asinus and Spring
(Assume Asinus component library is not used)
bull Asinus component library speeds up your development
Another Critical Question
Question
Can I use all other Spring features in Asinus Framework
Our Answer
Yes exactly
High Level Architecture
Asinus as Web App Dev Framework
Asinus hides Servlet API from developer
bull Resolves HttpServletRequest as Asinus RequestContext
bull RequestContext is then propogated as module requests
Asinus as Service Framework
Asinus is also a Service Framework because
bull Covers webservices
bull Supports JSON services
bull Supports RESTFULL services
Asinus Modules
bull Asinus works with modules so you should implement your own modules
bull Module is a reusable component that realizes a business on its own
For eample Weather moduleLocation ModuleCreditCard Modulehellip
Asinus Modulesbull Easy to package
Jar format
bull Reusable in any Asinus Project
Just add to classpath
Freemarker is the right technology Jsp is not
bull Can be loaded on the fly
Dynamic loading using Asinus admin console
Package Structure Module Class
Package Structure ActionController
Package structure views
Package Structure Domain amp Repository
Objects
Package structure MCS Content
Package structure Module Configuration
Package structure Static Content
Creating Modules
bull ManuallyDocument ldquoFirst installationrdquo
httpturkcell-imturkcellcomtrwordpressp=160
Document ldquoDeveloping modulesrdquo
httpturkcell-imturkcellcomtrwordpressp=532
bull Using Eclipse Pluginhttpturkcell-imturkcellcomtrwordpressp=2410
Eclipse PluginCreating New Project
Eclipse Plugin
Eclipse PluginCreating New ActionController
Eclipse PluginCreating New Webservice
Eclipse PluginImporting Asinus-Showcase Application
(Asinus Examples)
Asinus as Dependency Injection Framework
bull Spring ApplicationContext is used
No tight dependencySpring can be replaceable
bull No dependency on Spring annotations
Use ConfiguredBean and Resource annotations
ConfiguredBean Resource
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
AddressService addressService
public void service()
addressServiceservice(hellip)
bull You can fully utilize Spring FrameworkCreate Spring Beans and
define in asinus-beans-ltanyNamegtxml
bull Asinus initializes both
ConfiguredBeanrsquos + Spring Beans
Asinus ampSpring Framework
How Asinus Initalizes
bull Initializes spring beans and ConfiguredBeanrsquos
bull Inject dependencies (Resource)
How Asinus Initalizes
bull Executes Initialize annotated methods
bull Executes SimpleJob and CronJob annotated jobs
Asinus Components
bull CORE COMPONENTS ndash Not pluggable
RequestHandler
ModuleController
ProtocolHandler
ExecutionManager
Request Processors
Response Processors
Asinus Components
bull PLUGGABLE COMPONENTS ndash Pluggable
ConfigurationManagerCacheManagerInMemoryCacheManagerSessionManagerCookieManagerHeaderManagerSanitizerDeviceManagerRequestContextSummaryHolderResourceManagerPerformanceManagerResponseToDeviceAdapterTemplateSelectorSecurityManagerAuthenticationManagerOpenIdAuthenticationManagerFacebookAuthenticationManageri18NManagerhellip
How to Plug any Component bull Implement the Component Interface
ie CacheManagerConfigurationManager
bull Define in ldquoasinuspropertiesrdquo
asinuscacheManager=myCacheManager
Asinus Components
Request Lifecycle RequestContext
bull Holds request information
bull Propogates through all layers
RequestContext
bull RequestContext Summary is bind to ThreadLocalInject RequestContextSummaryHolder component
bull Attributes contextRootmodemoduleactionpathInfooriginalPathInfocookiesrequestCookiesrequestParametersattributeshostnamemachineinstancelocaleuserdeviceuseragentheadersrefererxforwardedformimeRequestmodelBeanmodelBeanValidationErrorshellip
RequestContextAttributes
bull From Action Controller public class ViewActionController implements BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
boolean paramA = requestgetRequestContext()getRequestParameters()
getRequestParamaterValueAsBoolean(a)
String cookieValueA = requestgetRequestContext()
getRequestCookies()get(a)getValue
String clientAddress = requestgetRequestContext()getRemoteAddress()
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Asinus ProjectsLIVE
Gncplay httpgncplaycom Gezenzi httpwwwgezenzicom
Footbo httpmfootbocomtr Turkcellim httpwapturkcell-imcomtr
COMING SOON
Eğitim portal
Turkcell Widgets (LocationMMSSMShellip)
Kristal Project
Push Notificatinos
What is Asinus
Asinus is a Web Application amp Service Development Framework
What is Asinus
Aim
bull To be common and standart infrastructure for Turkcell Turkcell Partnerrsquos WebWap Applications
bull To ease the web app amp service development for web developers
Aim
bull To decrease ldquotime to marketrdquo of changing
requirements
bull To avoid common errors web amp service developers can easily make
Why Asinus Question
Spring is also a complete webservice framework solution
Why would I use Asinus
Our Answer bull Spring is not enough to be modularbull Spring is not enough to be standard
(Spring does not strictly enforce applications to be implemented
in a standard way)bull Spring has no integrated wap solutionbull Many useful pluggable components can be added
Letrsquos CompareFeature Asinus Spring Struts
Modular Development SupportYes Yes
(Only in Osgi platforms)No
WAP Development Support(Device dependent renderingtemplate selection acc to category subcategory device)
Yes No No
AB Testing Support Yes No No
Complete Security Solutions (Encodingcsrf protection)
Yes No No
Pluggable and Standardized Cache Implementations(EhcacheMemcachedNearcache)
Yes No No
Configuration According to Environment
Yes No No
Configuration change on the fly Yes No No
AuthomizedException amp Error Handling
Yes No No
Letrsquos CompareFeature Asinus Spring Struts
Authomized JSON Services
Yes No No
Authomized Module Caching
Yes No No
Distributed Session Management
Yes No No
Authomized Session support for cookie disabled devices
Yes No No
Authomized Resource Management (Close- reopen resources on the fly)
Yes No No
Authomized Performance Management amp Monitoring
Yes No No
Enable debugging for a single request on production
Yes No No
Development Times
bull Implementing a ldquoHello worldldquo application is much faster than Spring
bull Development times are approximately equals for both Asinus and Spring
(Assume Asinus component library is not used)
bull Asinus component library speeds up your development
Another Critical Question
Question
Can I use all other Spring features in Asinus Framework
Our Answer
Yes exactly
High Level Architecture
Asinus as Web App Dev Framework
Asinus hides Servlet API from developer
bull Resolves HttpServletRequest as Asinus RequestContext
bull RequestContext is then propogated as module requests
Asinus as Service Framework
Asinus is also a Service Framework because
bull Covers webservices
bull Supports JSON services
bull Supports RESTFULL services
Asinus Modules
bull Asinus works with modules so you should implement your own modules
bull Module is a reusable component that realizes a business on its own
For eample Weather moduleLocation ModuleCreditCard Modulehellip
Asinus Modulesbull Easy to package
Jar format
bull Reusable in any Asinus Project
Just add to classpath
Freemarker is the right technology Jsp is not
bull Can be loaded on the fly
Dynamic loading using Asinus admin console
Package Structure Module Class
Package Structure ActionController
Package structure views
Package Structure Domain amp Repository
Objects
Package structure MCS Content
Package structure Module Configuration
Package structure Static Content
Creating Modules
bull ManuallyDocument ldquoFirst installationrdquo
httpturkcell-imturkcellcomtrwordpressp=160
Document ldquoDeveloping modulesrdquo
httpturkcell-imturkcellcomtrwordpressp=532
bull Using Eclipse Pluginhttpturkcell-imturkcellcomtrwordpressp=2410
Eclipse PluginCreating New Project
Eclipse Plugin
Eclipse PluginCreating New ActionController
Eclipse PluginCreating New Webservice
Eclipse PluginImporting Asinus-Showcase Application
(Asinus Examples)
Asinus as Dependency Injection Framework
bull Spring ApplicationContext is used
No tight dependencySpring can be replaceable
bull No dependency on Spring annotations
Use ConfiguredBean and Resource annotations
ConfiguredBean Resource
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
AddressService addressService
public void service()
addressServiceservice(hellip)
bull You can fully utilize Spring FrameworkCreate Spring Beans and
define in asinus-beans-ltanyNamegtxml
bull Asinus initializes both
ConfiguredBeanrsquos + Spring Beans
Asinus ampSpring Framework
How Asinus Initalizes
bull Initializes spring beans and ConfiguredBeanrsquos
bull Inject dependencies (Resource)
How Asinus Initalizes
bull Executes Initialize annotated methods
bull Executes SimpleJob and CronJob annotated jobs
Asinus Components
bull CORE COMPONENTS ndash Not pluggable
RequestHandler
ModuleController
ProtocolHandler
ExecutionManager
Request Processors
Response Processors
Asinus Components
bull PLUGGABLE COMPONENTS ndash Pluggable
ConfigurationManagerCacheManagerInMemoryCacheManagerSessionManagerCookieManagerHeaderManagerSanitizerDeviceManagerRequestContextSummaryHolderResourceManagerPerformanceManagerResponseToDeviceAdapterTemplateSelectorSecurityManagerAuthenticationManagerOpenIdAuthenticationManagerFacebookAuthenticationManageri18NManagerhellip
How to Plug any Component bull Implement the Component Interface
ie CacheManagerConfigurationManager
bull Define in ldquoasinuspropertiesrdquo
asinuscacheManager=myCacheManager
Asinus Components
Request Lifecycle RequestContext
bull Holds request information
bull Propogates through all layers
RequestContext
bull RequestContext Summary is bind to ThreadLocalInject RequestContextSummaryHolder component
bull Attributes contextRootmodemoduleactionpathInfooriginalPathInfocookiesrequestCookiesrequestParametersattributeshostnamemachineinstancelocaleuserdeviceuseragentheadersrefererxforwardedformimeRequestmodelBeanmodelBeanValidationErrorshellip
RequestContextAttributes
bull From Action Controller public class ViewActionController implements BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
boolean paramA = requestgetRequestContext()getRequestParameters()
getRequestParamaterValueAsBoolean(a)
String cookieValueA = requestgetRequestContext()
getRequestCookies()get(a)getValue
String clientAddress = requestgetRequestContext()getRemoteAddress()
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
What is Asinus
Asinus is a Web Application amp Service Development Framework
What is Asinus
Aim
bull To be common and standart infrastructure for Turkcell Turkcell Partnerrsquos WebWap Applications
bull To ease the web app amp service development for web developers
Aim
bull To decrease ldquotime to marketrdquo of changing
requirements
bull To avoid common errors web amp service developers can easily make
Why Asinus Question
Spring is also a complete webservice framework solution
Why would I use Asinus
Our Answer bull Spring is not enough to be modularbull Spring is not enough to be standard
(Spring does not strictly enforce applications to be implemented
in a standard way)bull Spring has no integrated wap solutionbull Many useful pluggable components can be added
Letrsquos CompareFeature Asinus Spring Struts
Modular Development SupportYes Yes
(Only in Osgi platforms)No
WAP Development Support(Device dependent renderingtemplate selection acc to category subcategory device)
Yes No No
AB Testing Support Yes No No
Complete Security Solutions (Encodingcsrf protection)
Yes No No
Pluggable and Standardized Cache Implementations(EhcacheMemcachedNearcache)
Yes No No
Configuration According to Environment
Yes No No
Configuration change on the fly Yes No No
AuthomizedException amp Error Handling
Yes No No
Letrsquos CompareFeature Asinus Spring Struts
Authomized JSON Services
Yes No No
Authomized Module Caching
Yes No No
Distributed Session Management
Yes No No
Authomized Session support for cookie disabled devices
Yes No No
Authomized Resource Management (Close- reopen resources on the fly)
Yes No No
Authomized Performance Management amp Monitoring
Yes No No
Enable debugging for a single request on production
Yes No No
Development Times
bull Implementing a ldquoHello worldldquo application is much faster than Spring
bull Development times are approximately equals for both Asinus and Spring
(Assume Asinus component library is not used)
bull Asinus component library speeds up your development
Another Critical Question
Question
Can I use all other Spring features in Asinus Framework
Our Answer
Yes exactly
High Level Architecture
Asinus as Web App Dev Framework
Asinus hides Servlet API from developer
bull Resolves HttpServletRequest as Asinus RequestContext
bull RequestContext is then propogated as module requests
Asinus as Service Framework
Asinus is also a Service Framework because
bull Covers webservices
bull Supports JSON services
bull Supports RESTFULL services
Asinus Modules
bull Asinus works with modules so you should implement your own modules
bull Module is a reusable component that realizes a business on its own
For eample Weather moduleLocation ModuleCreditCard Modulehellip
Asinus Modulesbull Easy to package
Jar format
bull Reusable in any Asinus Project
Just add to classpath
Freemarker is the right technology Jsp is not
bull Can be loaded on the fly
Dynamic loading using Asinus admin console
Package Structure Module Class
Package Structure ActionController
Package structure views
Package Structure Domain amp Repository
Objects
Package structure MCS Content
Package structure Module Configuration
Package structure Static Content
Creating Modules
bull ManuallyDocument ldquoFirst installationrdquo
httpturkcell-imturkcellcomtrwordpressp=160
Document ldquoDeveloping modulesrdquo
httpturkcell-imturkcellcomtrwordpressp=532
bull Using Eclipse Pluginhttpturkcell-imturkcellcomtrwordpressp=2410
Eclipse PluginCreating New Project
Eclipse Plugin
Eclipse PluginCreating New ActionController
Eclipse PluginCreating New Webservice
Eclipse PluginImporting Asinus-Showcase Application
(Asinus Examples)
Asinus as Dependency Injection Framework
bull Spring ApplicationContext is used
No tight dependencySpring can be replaceable
bull No dependency on Spring annotations
Use ConfiguredBean and Resource annotations
ConfiguredBean Resource
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
AddressService addressService
public void service()
addressServiceservice(hellip)
bull You can fully utilize Spring FrameworkCreate Spring Beans and
define in asinus-beans-ltanyNamegtxml
bull Asinus initializes both
ConfiguredBeanrsquos + Spring Beans
Asinus ampSpring Framework
How Asinus Initalizes
bull Initializes spring beans and ConfiguredBeanrsquos
bull Inject dependencies (Resource)
How Asinus Initalizes
bull Executes Initialize annotated methods
bull Executes SimpleJob and CronJob annotated jobs
Asinus Components
bull CORE COMPONENTS ndash Not pluggable
RequestHandler
ModuleController
ProtocolHandler
ExecutionManager
Request Processors
Response Processors
Asinus Components
bull PLUGGABLE COMPONENTS ndash Pluggable
ConfigurationManagerCacheManagerInMemoryCacheManagerSessionManagerCookieManagerHeaderManagerSanitizerDeviceManagerRequestContextSummaryHolderResourceManagerPerformanceManagerResponseToDeviceAdapterTemplateSelectorSecurityManagerAuthenticationManagerOpenIdAuthenticationManagerFacebookAuthenticationManageri18NManagerhellip
How to Plug any Component bull Implement the Component Interface
ie CacheManagerConfigurationManager
bull Define in ldquoasinuspropertiesrdquo
asinuscacheManager=myCacheManager
Asinus Components
Request Lifecycle RequestContext
bull Holds request information
bull Propogates through all layers
RequestContext
bull RequestContext Summary is bind to ThreadLocalInject RequestContextSummaryHolder component
bull Attributes contextRootmodemoduleactionpathInfooriginalPathInfocookiesrequestCookiesrequestParametersattributeshostnamemachineinstancelocaleuserdeviceuseragentheadersrefererxforwardedformimeRequestmodelBeanmodelBeanValidationErrorshellip
RequestContextAttributes
bull From Action Controller public class ViewActionController implements BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
boolean paramA = requestgetRequestContext()getRequestParameters()
getRequestParamaterValueAsBoolean(a)
String cookieValueA = requestgetRequestContext()
getRequestCookies()get(a)getValue
String clientAddress = requestgetRequestContext()getRemoteAddress()
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
What is Asinus
Aim
bull To be common and standart infrastructure for Turkcell Turkcell Partnerrsquos WebWap Applications
bull To ease the web app amp service development for web developers
Aim
bull To decrease ldquotime to marketrdquo of changing
requirements
bull To avoid common errors web amp service developers can easily make
Why Asinus Question
Spring is also a complete webservice framework solution
Why would I use Asinus
Our Answer bull Spring is not enough to be modularbull Spring is not enough to be standard
(Spring does not strictly enforce applications to be implemented
in a standard way)bull Spring has no integrated wap solutionbull Many useful pluggable components can be added
Letrsquos CompareFeature Asinus Spring Struts
Modular Development SupportYes Yes
(Only in Osgi platforms)No
WAP Development Support(Device dependent renderingtemplate selection acc to category subcategory device)
Yes No No
AB Testing Support Yes No No
Complete Security Solutions (Encodingcsrf protection)
Yes No No
Pluggable and Standardized Cache Implementations(EhcacheMemcachedNearcache)
Yes No No
Configuration According to Environment
Yes No No
Configuration change on the fly Yes No No
AuthomizedException amp Error Handling
Yes No No
Letrsquos CompareFeature Asinus Spring Struts
Authomized JSON Services
Yes No No
Authomized Module Caching
Yes No No
Distributed Session Management
Yes No No
Authomized Session support for cookie disabled devices
Yes No No
Authomized Resource Management (Close- reopen resources on the fly)
Yes No No
Authomized Performance Management amp Monitoring
Yes No No
Enable debugging for a single request on production
Yes No No
Development Times
bull Implementing a ldquoHello worldldquo application is much faster than Spring
bull Development times are approximately equals for both Asinus and Spring
(Assume Asinus component library is not used)
bull Asinus component library speeds up your development
Another Critical Question
Question
Can I use all other Spring features in Asinus Framework
Our Answer
Yes exactly
High Level Architecture
Asinus as Web App Dev Framework
Asinus hides Servlet API from developer
bull Resolves HttpServletRequest as Asinus RequestContext
bull RequestContext is then propogated as module requests
Asinus as Service Framework
Asinus is also a Service Framework because
bull Covers webservices
bull Supports JSON services
bull Supports RESTFULL services
Asinus Modules
bull Asinus works with modules so you should implement your own modules
bull Module is a reusable component that realizes a business on its own
For eample Weather moduleLocation ModuleCreditCard Modulehellip
Asinus Modulesbull Easy to package
Jar format
bull Reusable in any Asinus Project
Just add to classpath
Freemarker is the right technology Jsp is not
bull Can be loaded on the fly
Dynamic loading using Asinus admin console
Package Structure Module Class
Package Structure ActionController
Package structure views
Package Structure Domain amp Repository
Objects
Package structure MCS Content
Package structure Module Configuration
Package structure Static Content
Creating Modules
bull ManuallyDocument ldquoFirst installationrdquo
httpturkcell-imturkcellcomtrwordpressp=160
Document ldquoDeveloping modulesrdquo
httpturkcell-imturkcellcomtrwordpressp=532
bull Using Eclipse Pluginhttpturkcell-imturkcellcomtrwordpressp=2410
Eclipse PluginCreating New Project
Eclipse Plugin
Eclipse PluginCreating New ActionController
Eclipse PluginCreating New Webservice
Eclipse PluginImporting Asinus-Showcase Application
(Asinus Examples)
Asinus as Dependency Injection Framework
bull Spring ApplicationContext is used
No tight dependencySpring can be replaceable
bull No dependency on Spring annotations
Use ConfiguredBean and Resource annotations
ConfiguredBean Resource
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
AddressService addressService
public void service()
addressServiceservice(hellip)
bull You can fully utilize Spring FrameworkCreate Spring Beans and
define in asinus-beans-ltanyNamegtxml
bull Asinus initializes both
ConfiguredBeanrsquos + Spring Beans
Asinus ampSpring Framework
How Asinus Initalizes
bull Initializes spring beans and ConfiguredBeanrsquos
bull Inject dependencies (Resource)
How Asinus Initalizes
bull Executes Initialize annotated methods
bull Executes SimpleJob and CronJob annotated jobs
Asinus Components
bull CORE COMPONENTS ndash Not pluggable
RequestHandler
ModuleController
ProtocolHandler
ExecutionManager
Request Processors
Response Processors
Asinus Components
bull PLUGGABLE COMPONENTS ndash Pluggable
ConfigurationManagerCacheManagerInMemoryCacheManagerSessionManagerCookieManagerHeaderManagerSanitizerDeviceManagerRequestContextSummaryHolderResourceManagerPerformanceManagerResponseToDeviceAdapterTemplateSelectorSecurityManagerAuthenticationManagerOpenIdAuthenticationManagerFacebookAuthenticationManageri18NManagerhellip
How to Plug any Component bull Implement the Component Interface
ie CacheManagerConfigurationManager
bull Define in ldquoasinuspropertiesrdquo
asinuscacheManager=myCacheManager
Asinus Components
Request Lifecycle RequestContext
bull Holds request information
bull Propogates through all layers
RequestContext
bull RequestContext Summary is bind to ThreadLocalInject RequestContextSummaryHolder component
bull Attributes contextRootmodemoduleactionpathInfooriginalPathInfocookiesrequestCookiesrequestParametersattributeshostnamemachineinstancelocaleuserdeviceuseragentheadersrefererxforwardedformimeRequestmodelBeanmodelBeanValidationErrorshellip
RequestContextAttributes
bull From Action Controller public class ViewActionController implements BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
boolean paramA = requestgetRequestContext()getRequestParameters()
getRequestParamaterValueAsBoolean(a)
String cookieValueA = requestgetRequestContext()
getRequestCookies()get(a)getValue
String clientAddress = requestgetRequestContext()getRemoteAddress()
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Aim
bull To be common and standart infrastructure for Turkcell Turkcell Partnerrsquos WebWap Applications
bull To ease the web app amp service development for web developers
Aim
bull To decrease ldquotime to marketrdquo of changing
requirements
bull To avoid common errors web amp service developers can easily make
Why Asinus Question
Spring is also a complete webservice framework solution
Why would I use Asinus
Our Answer bull Spring is not enough to be modularbull Spring is not enough to be standard
(Spring does not strictly enforce applications to be implemented
in a standard way)bull Spring has no integrated wap solutionbull Many useful pluggable components can be added
Letrsquos CompareFeature Asinus Spring Struts
Modular Development SupportYes Yes
(Only in Osgi platforms)No
WAP Development Support(Device dependent renderingtemplate selection acc to category subcategory device)
Yes No No
AB Testing Support Yes No No
Complete Security Solutions (Encodingcsrf protection)
Yes No No
Pluggable and Standardized Cache Implementations(EhcacheMemcachedNearcache)
Yes No No
Configuration According to Environment
Yes No No
Configuration change on the fly Yes No No
AuthomizedException amp Error Handling
Yes No No
Letrsquos CompareFeature Asinus Spring Struts
Authomized JSON Services
Yes No No
Authomized Module Caching
Yes No No
Distributed Session Management
Yes No No
Authomized Session support for cookie disabled devices
Yes No No
Authomized Resource Management (Close- reopen resources on the fly)
Yes No No
Authomized Performance Management amp Monitoring
Yes No No
Enable debugging for a single request on production
Yes No No
Development Times
bull Implementing a ldquoHello worldldquo application is much faster than Spring
bull Development times are approximately equals for both Asinus and Spring
(Assume Asinus component library is not used)
bull Asinus component library speeds up your development
Another Critical Question
Question
Can I use all other Spring features in Asinus Framework
Our Answer
Yes exactly
High Level Architecture
Asinus as Web App Dev Framework
Asinus hides Servlet API from developer
bull Resolves HttpServletRequest as Asinus RequestContext
bull RequestContext is then propogated as module requests
Asinus as Service Framework
Asinus is also a Service Framework because
bull Covers webservices
bull Supports JSON services
bull Supports RESTFULL services
Asinus Modules
bull Asinus works with modules so you should implement your own modules
bull Module is a reusable component that realizes a business on its own
For eample Weather moduleLocation ModuleCreditCard Modulehellip
Asinus Modulesbull Easy to package
Jar format
bull Reusable in any Asinus Project
Just add to classpath
Freemarker is the right technology Jsp is not
bull Can be loaded on the fly
Dynamic loading using Asinus admin console
Package Structure Module Class
Package Structure ActionController
Package structure views
Package Structure Domain amp Repository
Objects
Package structure MCS Content
Package structure Module Configuration
Package structure Static Content
Creating Modules
bull ManuallyDocument ldquoFirst installationrdquo
httpturkcell-imturkcellcomtrwordpressp=160
Document ldquoDeveloping modulesrdquo
httpturkcell-imturkcellcomtrwordpressp=532
bull Using Eclipse Pluginhttpturkcell-imturkcellcomtrwordpressp=2410
Eclipse PluginCreating New Project
Eclipse Plugin
Eclipse PluginCreating New ActionController
Eclipse PluginCreating New Webservice
Eclipse PluginImporting Asinus-Showcase Application
(Asinus Examples)
Asinus as Dependency Injection Framework
bull Spring ApplicationContext is used
No tight dependencySpring can be replaceable
bull No dependency on Spring annotations
Use ConfiguredBean and Resource annotations
ConfiguredBean Resource
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
AddressService addressService
public void service()
addressServiceservice(hellip)
bull You can fully utilize Spring FrameworkCreate Spring Beans and
define in asinus-beans-ltanyNamegtxml
bull Asinus initializes both
ConfiguredBeanrsquos + Spring Beans
Asinus ampSpring Framework
How Asinus Initalizes
bull Initializes spring beans and ConfiguredBeanrsquos
bull Inject dependencies (Resource)
How Asinus Initalizes
bull Executes Initialize annotated methods
bull Executes SimpleJob and CronJob annotated jobs
Asinus Components
bull CORE COMPONENTS ndash Not pluggable
RequestHandler
ModuleController
ProtocolHandler
ExecutionManager
Request Processors
Response Processors
Asinus Components
bull PLUGGABLE COMPONENTS ndash Pluggable
ConfigurationManagerCacheManagerInMemoryCacheManagerSessionManagerCookieManagerHeaderManagerSanitizerDeviceManagerRequestContextSummaryHolderResourceManagerPerformanceManagerResponseToDeviceAdapterTemplateSelectorSecurityManagerAuthenticationManagerOpenIdAuthenticationManagerFacebookAuthenticationManageri18NManagerhellip
How to Plug any Component bull Implement the Component Interface
ie CacheManagerConfigurationManager
bull Define in ldquoasinuspropertiesrdquo
asinuscacheManager=myCacheManager
Asinus Components
Request Lifecycle RequestContext
bull Holds request information
bull Propogates through all layers
RequestContext
bull RequestContext Summary is bind to ThreadLocalInject RequestContextSummaryHolder component
bull Attributes contextRootmodemoduleactionpathInfooriginalPathInfocookiesrequestCookiesrequestParametersattributeshostnamemachineinstancelocaleuserdeviceuseragentheadersrefererxforwardedformimeRequestmodelBeanmodelBeanValidationErrorshellip
RequestContextAttributes
bull From Action Controller public class ViewActionController implements BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
boolean paramA = requestgetRequestContext()getRequestParameters()
getRequestParamaterValueAsBoolean(a)
String cookieValueA = requestgetRequestContext()
getRequestCookies()get(a)getValue
String clientAddress = requestgetRequestContext()getRemoteAddress()
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Aim
bull To decrease ldquotime to marketrdquo of changing
requirements
bull To avoid common errors web amp service developers can easily make
Why Asinus Question
Spring is also a complete webservice framework solution
Why would I use Asinus
Our Answer bull Spring is not enough to be modularbull Spring is not enough to be standard
(Spring does not strictly enforce applications to be implemented
in a standard way)bull Spring has no integrated wap solutionbull Many useful pluggable components can be added
Letrsquos CompareFeature Asinus Spring Struts
Modular Development SupportYes Yes
(Only in Osgi platforms)No
WAP Development Support(Device dependent renderingtemplate selection acc to category subcategory device)
Yes No No
AB Testing Support Yes No No
Complete Security Solutions (Encodingcsrf protection)
Yes No No
Pluggable and Standardized Cache Implementations(EhcacheMemcachedNearcache)
Yes No No
Configuration According to Environment
Yes No No
Configuration change on the fly Yes No No
AuthomizedException amp Error Handling
Yes No No
Letrsquos CompareFeature Asinus Spring Struts
Authomized JSON Services
Yes No No
Authomized Module Caching
Yes No No
Distributed Session Management
Yes No No
Authomized Session support for cookie disabled devices
Yes No No
Authomized Resource Management (Close- reopen resources on the fly)
Yes No No
Authomized Performance Management amp Monitoring
Yes No No
Enable debugging for a single request on production
Yes No No
Development Times
bull Implementing a ldquoHello worldldquo application is much faster than Spring
bull Development times are approximately equals for both Asinus and Spring
(Assume Asinus component library is not used)
bull Asinus component library speeds up your development
Another Critical Question
Question
Can I use all other Spring features in Asinus Framework
Our Answer
Yes exactly
High Level Architecture
Asinus as Web App Dev Framework
Asinus hides Servlet API from developer
bull Resolves HttpServletRequest as Asinus RequestContext
bull RequestContext is then propogated as module requests
Asinus as Service Framework
Asinus is also a Service Framework because
bull Covers webservices
bull Supports JSON services
bull Supports RESTFULL services
Asinus Modules
bull Asinus works with modules so you should implement your own modules
bull Module is a reusable component that realizes a business on its own
For eample Weather moduleLocation ModuleCreditCard Modulehellip
Asinus Modulesbull Easy to package
Jar format
bull Reusable in any Asinus Project
Just add to classpath
Freemarker is the right technology Jsp is not
bull Can be loaded on the fly
Dynamic loading using Asinus admin console
Package Structure Module Class
Package Structure ActionController
Package structure views
Package Structure Domain amp Repository
Objects
Package structure MCS Content
Package structure Module Configuration
Package structure Static Content
Creating Modules
bull ManuallyDocument ldquoFirst installationrdquo
httpturkcell-imturkcellcomtrwordpressp=160
Document ldquoDeveloping modulesrdquo
httpturkcell-imturkcellcomtrwordpressp=532
bull Using Eclipse Pluginhttpturkcell-imturkcellcomtrwordpressp=2410
Eclipse PluginCreating New Project
Eclipse Plugin
Eclipse PluginCreating New ActionController
Eclipse PluginCreating New Webservice
Eclipse PluginImporting Asinus-Showcase Application
(Asinus Examples)
Asinus as Dependency Injection Framework
bull Spring ApplicationContext is used
No tight dependencySpring can be replaceable
bull No dependency on Spring annotations
Use ConfiguredBean and Resource annotations
ConfiguredBean Resource
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
AddressService addressService
public void service()
addressServiceservice(hellip)
bull You can fully utilize Spring FrameworkCreate Spring Beans and
define in asinus-beans-ltanyNamegtxml
bull Asinus initializes both
ConfiguredBeanrsquos + Spring Beans
Asinus ampSpring Framework
How Asinus Initalizes
bull Initializes spring beans and ConfiguredBeanrsquos
bull Inject dependencies (Resource)
How Asinus Initalizes
bull Executes Initialize annotated methods
bull Executes SimpleJob and CronJob annotated jobs
Asinus Components
bull CORE COMPONENTS ndash Not pluggable
RequestHandler
ModuleController
ProtocolHandler
ExecutionManager
Request Processors
Response Processors
Asinus Components
bull PLUGGABLE COMPONENTS ndash Pluggable
ConfigurationManagerCacheManagerInMemoryCacheManagerSessionManagerCookieManagerHeaderManagerSanitizerDeviceManagerRequestContextSummaryHolderResourceManagerPerformanceManagerResponseToDeviceAdapterTemplateSelectorSecurityManagerAuthenticationManagerOpenIdAuthenticationManagerFacebookAuthenticationManageri18NManagerhellip
How to Plug any Component bull Implement the Component Interface
ie CacheManagerConfigurationManager
bull Define in ldquoasinuspropertiesrdquo
asinuscacheManager=myCacheManager
Asinus Components
Request Lifecycle RequestContext
bull Holds request information
bull Propogates through all layers
RequestContext
bull RequestContext Summary is bind to ThreadLocalInject RequestContextSummaryHolder component
bull Attributes contextRootmodemoduleactionpathInfooriginalPathInfocookiesrequestCookiesrequestParametersattributeshostnamemachineinstancelocaleuserdeviceuseragentheadersrefererxforwardedformimeRequestmodelBeanmodelBeanValidationErrorshellip
RequestContextAttributes
bull From Action Controller public class ViewActionController implements BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
boolean paramA = requestgetRequestContext()getRequestParameters()
getRequestParamaterValueAsBoolean(a)
String cookieValueA = requestgetRequestContext()
getRequestCookies()get(a)getValue
String clientAddress = requestgetRequestContext()getRemoteAddress()
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Why Asinus Question
Spring is also a complete webservice framework solution
Why would I use Asinus
Our Answer bull Spring is not enough to be modularbull Spring is not enough to be standard
(Spring does not strictly enforce applications to be implemented
in a standard way)bull Spring has no integrated wap solutionbull Many useful pluggable components can be added
Letrsquos CompareFeature Asinus Spring Struts
Modular Development SupportYes Yes
(Only in Osgi platforms)No
WAP Development Support(Device dependent renderingtemplate selection acc to category subcategory device)
Yes No No
AB Testing Support Yes No No
Complete Security Solutions (Encodingcsrf protection)
Yes No No
Pluggable and Standardized Cache Implementations(EhcacheMemcachedNearcache)
Yes No No
Configuration According to Environment
Yes No No
Configuration change on the fly Yes No No
AuthomizedException amp Error Handling
Yes No No
Letrsquos CompareFeature Asinus Spring Struts
Authomized JSON Services
Yes No No
Authomized Module Caching
Yes No No
Distributed Session Management
Yes No No
Authomized Session support for cookie disabled devices
Yes No No
Authomized Resource Management (Close- reopen resources on the fly)
Yes No No
Authomized Performance Management amp Monitoring
Yes No No
Enable debugging for a single request on production
Yes No No
Development Times
bull Implementing a ldquoHello worldldquo application is much faster than Spring
bull Development times are approximately equals for both Asinus and Spring
(Assume Asinus component library is not used)
bull Asinus component library speeds up your development
Another Critical Question
Question
Can I use all other Spring features in Asinus Framework
Our Answer
Yes exactly
High Level Architecture
Asinus as Web App Dev Framework
Asinus hides Servlet API from developer
bull Resolves HttpServletRequest as Asinus RequestContext
bull RequestContext is then propogated as module requests
Asinus as Service Framework
Asinus is also a Service Framework because
bull Covers webservices
bull Supports JSON services
bull Supports RESTFULL services
Asinus Modules
bull Asinus works with modules so you should implement your own modules
bull Module is a reusable component that realizes a business on its own
For eample Weather moduleLocation ModuleCreditCard Modulehellip
Asinus Modulesbull Easy to package
Jar format
bull Reusable in any Asinus Project
Just add to classpath
Freemarker is the right technology Jsp is not
bull Can be loaded on the fly
Dynamic loading using Asinus admin console
Package Structure Module Class
Package Structure ActionController
Package structure views
Package Structure Domain amp Repository
Objects
Package structure MCS Content
Package structure Module Configuration
Package structure Static Content
Creating Modules
bull ManuallyDocument ldquoFirst installationrdquo
httpturkcell-imturkcellcomtrwordpressp=160
Document ldquoDeveloping modulesrdquo
httpturkcell-imturkcellcomtrwordpressp=532
bull Using Eclipse Pluginhttpturkcell-imturkcellcomtrwordpressp=2410
Eclipse PluginCreating New Project
Eclipse Plugin
Eclipse PluginCreating New ActionController
Eclipse PluginCreating New Webservice
Eclipse PluginImporting Asinus-Showcase Application
(Asinus Examples)
Asinus as Dependency Injection Framework
bull Spring ApplicationContext is used
No tight dependencySpring can be replaceable
bull No dependency on Spring annotations
Use ConfiguredBean and Resource annotations
ConfiguredBean Resource
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
AddressService addressService
public void service()
addressServiceservice(hellip)
bull You can fully utilize Spring FrameworkCreate Spring Beans and
define in asinus-beans-ltanyNamegtxml
bull Asinus initializes both
ConfiguredBeanrsquos + Spring Beans
Asinus ampSpring Framework
How Asinus Initalizes
bull Initializes spring beans and ConfiguredBeanrsquos
bull Inject dependencies (Resource)
How Asinus Initalizes
bull Executes Initialize annotated methods
bull Executes SimpleJob and CronJob annotated jobs
Asinus Components
bull CORE COMPONENTS ndash Not pluggable
RequestHandler
ModuleController
ProtocolHandler
ExecutionManager
Request Processors
Response Processors
Asinus Components
bull PLUGGABLE COMPONENTS ndash Pluggable
ConfigurationManagerCacheManagerInMemoryCacheManagerSessionManagerCookieManagerHeaderManagerSanitizerDeviceManagerRequestContextSummaryHolderResourceManagerPerformanceManagerResponseToDeviceAdapterTemplateSelectorSecurityManagerAuthenticationManagerOpenIdAuthenticationManagerFacebookAuthenticationManageri18NManagerhellip
How to Plug any Component bull Implement the Component Interface
ie CacheManagerConfigurationManager
bull Define in ldquoasinuspropertiesrdquo
asinuscacheManager=myCacheManager
Asinus Components
Request Lifecycle RequestContext
bull Holds request information
bull Propogates through all layers
RequestContext
bull RequestContext Summary is bind to ThreadLocalInject RequestContextSummaryHolder component
bull Attributes contextRootmodemoduleactionpathInfooriginalPathInfocookiesrequestCookiesrequestParametersattributeshostnamemachineinstancelocaleuserdeviceuseragentheadersrefererxforwardedformimeRequestmodelBeanmodelBeanValidationErrorshellip
RequestContextAttributes
bull From Action Controller public class ViewActionController implements BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
boolean paramA = requestgetRequestContext()getRequestParameters()
getRequestParamaterValueAsBoolean(a)
String cookieValueA = requestgetRequestContext()
getRequestCookies()get(a)getValue
String clientAddress = requestgetRequestContext()getRemoteAddress()
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Letrsquos CompareFeature Asinus Spring Struts
Modular Development SupportYes Yes
(Only in Osgi platforms)No
WAP Development Support(Device dependent renderingtemplate selection acc to category subcategory device)
Yes No No
AB Testing Support Yes No No
Complete Security Solutions (Encodingcsrf protection)
Yes No No
Pluggable and Standardized Cache Implementations(EhcacheMemcachedNearcache)
Yes No No
Configuration According to Environment
Yes No No
Configuration change on the fly Yes No No
AuthomizedException amp Error Handling
Yes No No
Letrsquos CompareFeature Asinus Spring Struts
Authomized JSON Services
Yes No No
Authomized Module Caching
Yes No No
Distributed Session Management
Yes No No
Authomized Session support for cookie disabled devices
Yes No No
Authomized Resource Management (Close- reopen resources on the fly)
Yes No No
Authomized Performance Management amp Monitoring
Yes No No
Enable debugging for a single request on production
Yes No No
Development Times
bull Implementing a ldquoHello worldldquo application is much faster than Spring
bull Development times are approximately equals for both Asinus and Spring
(Assume Asinus component library is not used)
bull Asinus component library speeds up your development
Another Critical Question
Question
Can I use all other Spring features in Asinus Framework
Our Answer
Yes exactly
High Level Architecture
Asinus as Web App Dev Framework
Asinus hides Servlet API from developer
bull Resolves HttpServletRequest as Asinus RequestContext
bull RequestContext is then propogated as module requests
Asinus as Service Framework
Asinus is also a Service Framework because
bull Covers webservices
bull Supports JSON services
bull Supports RESTFULL services
Asinus Modules
bull Asinus works with modules so you should implement your own modules
bull Module is a reusable component that realizes a business on its own
For eample Weather moduleLocation ModuleCreditCard Modulehellip
Asinus Modulesbull Easy to package
Jar format
bull Reusable in any Asinus Project
Just add to classpath
Freemarker is the right technology Jsp is not
bull Can be loaded on the fly
Dynamic loading using Asinus admin console
Package Structure Module Class
Package Structure ActionController
Package structure views
Package Structure Domain amp Repository
Objects
Package structure MCS Content
Package structure Module Configuration
Package structure Static Content
Creating Modules
bull ManuallyDocument ldquoFirst installationrdquo
httpturkcell-imturkcellcomtrwordpressp=160
Document ldquoDeveloping modulesrdquo
httpturkcell-imturkcellcomtrwordpressp=532
bull Using Eclipse Pluginhttpturkcell-imturkcellcomtrwordpressp=2410
Eclipse PluginCreating New Project
Eclipse Plugin
Eclipse PluginCreating New ActionController
Eclipse PluginCreating New Webservice
Eclipse PluginImporting Asinus-Showcase Application
(Asinus Examples)
Asinus as Dependency Injection Framework
bull Spring ApplicationContext is used
No tight dependencySpring can be replaceable
bull No dependency on Spring annotations
Use ConfiguredBean and Resource annotations
ConfiguredBean Resource
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
AddressService addressService
public void service()
addressServiceservice(hellip)
bull You can fully utilize Spring FrameworkCreate Spring Beans and
define in asinus-beans-ltanyNamegtxml
bull Asinus initializes both
ConfiguredBeanrsquos + Spring Beans
Asinus ampSpring Framework
How Asinus Initalizes
bull Initializes spring beans and ConfiguredBeanrsquos
bull Inject dependencies (Resource)
How Asinus Initalizes
bull Executes Initialize annotated methods
bull Executes SimpleJob and CronJob annotated jobs
Asinus Components
bull CORE COMPONENTS ndash Not pluggable
RequestHandler
ModuleController
ProtocolHandler
ExecutionManager
Request Processors
Response Processors
Asinus Components
bull PLUGGABLE COMPONENTS ndash Pluggable
ConfigurationManagerCacheManagerInMemoryCacheManagerSessionManagerCookieManagerHeaderManagerSanitizerDeviceManagerRequestContextSummaryHolderResourceManagerPerformanceManagerResponseToDeviceAdapterTemplateSelectorSecurityManagerAuthenticationManagerOpenIdAuthenticationManagerFacebookAuthenticationManageri18NManagerhellip
How to Plug any Component bull Implement the Component Interface
ie CacheManagerConfigurationManager
bull Define in ldquoasinuspropertiesrdquo
asinuscacheManager=myCacheManager
Asinus Components
Request Lifecycle RequestContext
bull Holds request information
bull Propogates through all layers
RequestContext
bull RequestContext Summary is bind to ThreadLocalInject RequestContextSummaryHolder component
bull Attributes contextRootmodemoduleactionpathInfooriginalPathInfocookiesrequestCookiesrequestParametersattributeshostnamemachineinstancelocaleuserdeviceuseragentheadersrefererxforwardedformimeRequestmodelBeanmodelBeanValidationErrorshellip
RequestContextAttributes
bull From Action Controller public class ViewActionController implements BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
boolean paramA = requestgetRequestContext()getRequestParameters()
getRequestParamaterValueAsBoolean(a)
String cookieValueA = requestgetRequestContext()
getRequestCookies()get(a)getValue
String clientAddress = requestgetRequestContext()getRemoteAddress()
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Letrsquos CompareFeature Asinus Spring Struts
Authomized JSON Services
Yes No No
Authomized Module Caching
Yes No No
Distributed Session Management
Yes No No
Authomized Session support for cookie disabled devices
Yes No No
Authomized Resource Management (Close- reopen resources on the fly)
Yes No No
Authomized Performance Management amp Monitoring
Yes No No
Enable debugging for a single request on production
Yes No No
Development Times
bull Implementing a ldquoHello worldldquo application is much faster than Spring
bull Development times are approximately equals for both Asinus and Spring
(Assume Asinus component library is not used)
bull Asinus component library speeds up your development
Another Critical Question
Question
Can I use all other Spring features in Asinus Framework
Our Answer
Yes exactly
High Level Architecture
Asinus as Web App Dev Framework
Asinus hides Servlet API from developer
bull Resolves HttpServletRequest as Asinus RequestContext
bull RequestContext is then propogated as module requests
Asinus as Service Framework
Asinus is also a Service Framework because
bull Covers webservices
bull Supports JSON services
bull Supports RESTFULL services
Asinus Modules
bull Asinus works with modules so you should implement your own modules
bull Module is a reusable component that realizes a business on its own
For eample Weather moduleLocation ModuleCreditCard Modulehellip
Asinus Modulesbull Easy to package
Jar format
bull Reusable in any Asinus Project
Just add to classpath
Freemarker is the right technology Jsp is not
bull Can be loaded on the fly
Dynamic loading using Asinus admin console
Package Structure Module Class
Package Structure ActionController
Package structure views
Package Structure Domain amp Repository
Objects
Package structure MCS Content
Package structure Module Configuration
Package structure Static Content
Creating Modules
bull ManuallyDocument ldquoFirst installationrdquo
httpturkcell-imturkcellcomtrwordpressp=160
Document ldquoDeveloping modulesrdquo
httpturkcell-imturkcellcomtrwordpressp=532
bull Using Eclipse Pluginhttpturkcell-imturkcellcomtrwordpressp=2410
Eclipse PluginCreating New Project
Eclipse Plugin
Eclipse PluginCreating New ActionController
Eclipse PluginCreating New Webservice
Eclipse PluginImporting Asinus-Showcase Application
(Asinus Examples)
Asinus as Dependency Injection Framework
bull Spring ApplicationContext is used
No tight dependencySpring can be replaceable
bull No dependency on Spring annotations
Use ConfiguredBean and Resource annotations
ConfiguredBean Resource
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
AddressService addressService
public void service()
addressServiceservice(hellip)
bull You can fully utilize Spring FrameworkCreate Spring Beans and
define in asinus-beans-ltanyNamegtxml
bull Asinus initializes both
ConfiguredBeanrsquos + Spring Beans
Asinus ampSpring Framework
How Asinus Initalizes
bull Initializes spring beans and ConfiguredBeanrsquos
bull Inject dependencies (Resource)
How Asinus Initalizes
bull Executes Initialize annotated methods
bull Executes SimpleJob and CronJob annotated jobs
Asinus Components
bull CORE COMPONENTS ndash Not pluggable
RequestHandler
ModuleController
ProtocolHandler
ExecutionManager
Request Processors
Response Processors
Asinus Components
bull PLUGGABLE COMPONENTS ndash Pluggable
ConfigurationManagerCacheManagerInMemoryCacheManagerSessionManagerCookieManagerHeaderManagerSanitizerDeviceManagerRequestContextSummaryHolderResourceManagerPerformanceManagerResponseToDeviceAdapterTemplateSelectorSecurityManagerAuthenticationManagerOpenIdAuthenticationManagerFacebookAuthenticationManageri18NManagerhellip
How to Plug any Component bull Implement the Component Interface
ie CacheManagerConfigurationManager
bull Define in ldquoasinuspropertiesrdquo
asinuscacheManager=myCacheManager
Asinus Components
Request Lifecycle RequestContext
bull Holds request information
bull Propogates through all layers
RequestContext
bull RequestContext Summary is bind to ThreadLocalInject RequestContextSummaryHolder component
bull Attributes contextRootmodemoduleactionpathInfooriginalPathInfocookiesrequestCookiesrequestParametersattributeshostnamemachineinstancelocaleuserdeviceuseragentheadersrefererxforwardedformimeRequestmodelBeanmodelBeanValidationErrorshellip
RequestContextAttributes
bull From Action Controller public class ViewActionController implements BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
boolean paramA = requestgetRequestContext()getRequestParameters()
getRequestParamaterValueAsBoolean(a)
String cookieValueA = requestgetRequestContext()
getRequestCookies()get(a)getValue
String clientAddress = requestgetRequestContext()getRemoteAddress()
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Development Times
bull Implementing a ldquoHello worldldquo application is much faster than Spring
bull Development times are approximately equals for both Asinus and Spring
(Assume Asinus component library is not used)
bull Asinus component library speeds up your development
Another Critical Question
Question
Can I use all other Spring features in Asinus Framework
Our Answer
Yes exactly
High Level Architecture
Asinus as Web App Dev Framework
Asinus hides Servlet API from developer
bull Resolves HttpServletRequest as Asinus RequestContext
bull RequestContext is then propogated as module requests
Asinus as Service Framework
Asinus is also a Service Framework because
bull Covers webservices
bull Supports JSON services
bull Supports RESTFULL services
Asinus Modules
bull Asinus works with modules so you should implement your own modules
bull Module is a reusable component that realizes a business on its own
For eample Weather moduleLocation ModuleCreditCard Modulehellip
Asinus Modulesbull Easy to package
Jar format
bull Reusable in any Asinus Project
Just add to classpath
Freemarker is the right technology Jsp is not
bull Can be loaded on the fly
Dynamic loading using Asinus admin console
Package Structure Module Class
Package Structure ActionController
Package structure views
Package Structure Domain amp Repository
Objects
Package structure MCS Content
Package structure Module Configuration
Package structure Static Content
Creating Modules
bull ManuallyDocument ldquoFirst installationrdquo
httpturkcell-imturkcellcomtrwordpressp=160
Document ldquoDeveloping modulesrdquo
httpturkcell-imturkcellcomtrwordpressp=532
bull Using Eclipse Pluginhttpturkcell-imturkcellcomtrwordpressp=2410
Eclipse PluginCreating New Project
Eclipse Plugin
Eclipse PluginCreating New ActionController
Eclipse PluginCreating New Webservice
Eclipse PluginImporting Asinus-Showcase Application
(Asinus Examples)
Asinus as Dependency Injection Framework
bull Spring ApplicationContext is used
No tight dependencySpring can be replaceable
bull No dependency on Spring annotations
Use ConfiguredBean and Resource annotations
ConfiguredBean Resource
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
AddressService addressService
public void service()
addressServiceservice(hellip)
bull You can fully utilize Spring FrameworkCreate Spring Beans and
define in asinus-beans-ltanyNamegtxml
bull Asinus initializes both
ConfiguredBeanrsquos + Spring Beans
Asinus ampSpring Framework
How Asinus Initalizes
bull Initializes spring beans and ConfiguredBeanrsquos
bull Inject dependencies (Resource)
How Asinus Initalizes
bull Executes Initialize annotated methods
bull Executes SimpleJob and CronJob annotated jobs
Asinus Components
bull CORE COMPONENTS ndash Not pluggable
RequestHandler
ModuleController
ProtocolHandler
ExecutionManager
Request Processors
Response Processors
Asinus Components
bull PLUGGABLE COMPONENTS ndash Pluggable
ConfigurationManagerCacheManagerInMemoryCacheManagerSessionManagerCookieManagerHeaderManagerSanitizerDeviceManagerRequestContextSummaryHolderResourceManagerPerformanceManagerResponseToDeviceAdapterTemplateSelectorSecurityManagerAuthenticationManagerOpenIdAuthenticationManagerFacebookAuthenticationManageri18NManagerhellip
How to Plug any Component bull Implement the Component Interface
ie CacheManagerConfigurationManager
bull Define in ldquoasinuspropertiesrdquo
asinuscacheManager=myCacheManager
Asinus Components
Request Lifecycle RequestContext
bull Holds request information
bull Propogates through all layers
RequestContext
bull RequestContext Summary is bind to ThreadLocalInject RequestContextSummaryHolder component
bull Attributes contextRootmodemoduleactionpathInfooriginalPathInfocookiesrequestCookiesrequestParametersattributeshostnamemachineinstancelocaleuserdeviceuseragentheadersrefererxforwardedformimeRequestmodelBeanmodelBeanValidationErrorshellip
RequestContextAttributes
bull From Action Controller public class ViewActionController implements BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
boolean paramA = requestgetRequestContext()getRequestParameters()
getRequestParamaterValueAsBoolean(a)
String cookieValueA = requestgetRequestContext()
getRequestCookies()get(a)getValue
String clientAddress = requestgetRequestContext()getRemoteAddress()
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Another Critical Question
Question
Can I use all other Spring features in Asinus Framework
Our Answer
Yes exactly
High Level Architecture
Asinus as Web App Dev Framework
Asinus hides Servlet API from developer
bull Resolves HttpServletRequest as Asinus RequestContext
bull RequestContext is then propogated as module requests
Asinus as Service Framework
Asinus is also a Service Framework because
bull Covers webservices
bull Supports JSON services
bull Supports RESTFULL services
Asinus Modules
bull Asinus works with modules so you should implement your own modules
bull Module is a reusable component that realizes a business on its own
For eample Weather moduleLocation ModuleCreditCard Modulehellip
Asinus Modulesbull Easy to package
Jar format
bull Reusable in any Asinus Project
Just add to classpath
Freemarker is the right technology Jsp is not
bull Can be loaded on the fly
Dynamic loading using Asinus admin console
Package Structure Module Class
Package Structure ActionController
Package structure views
Package Structure Domain amp Repository
Objects
Package structure MCS Content
Package structure Module Configuration
Package structure Static Content
Creating Modules
bull ManuallyDocument ldquoFirst installationrdquo
httpturkcell-imturkcellcomtrwordpressp=160
Document ldquoDeveloping modulesrdquo
httpturkcell-imturkcellcomtrwordpressp=532
bull Using Eclipse Pluginhttpturkcell-imturkcellcomtrwordpressp=2410
Eclipse PluginCreating New Project
Eclipse Plugin
Eclipse PluginCreating New ActionController
Eclipse PluginCreating New Webservice
Eclipse PluginImporting Asinus-Showcase Application
(Asinus Examples)
Asinus as Dependency Injection Framework
bull Spring ApplicationContext is used
No tight dependencySpring can be replaceable
bull No dependency on Spring annotations
Use ConfiguredBean and Resource annotations
ConfiguredBean Resource
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
AddressService addressService
public void service()
addressServiceservice(hellip)
bull You can fully utilize Spring FrameworkCreate Spring Beans and
define in asinus-beans-ltanyNamegtxml
bull Asinus initializes both
ConfiguredBeanrsquos + Spring Beans
Asinus ampSpring Framework
How Asinus Initalizes
bull Initializes spring beans and ConfiguredBeanrsquos
bull Inject dependencies (Resource)
How Asinus Initalizes
bull Executes Initialize annotated methods
bull Executes SimpleJob and CronJob annotated jobs
Asinus Components
bull CORE COMPONENTS ndash Not pluggable
RequestHandler
ModuleController
ProtocolHandler
ExecutionManager
Request Processors
Response Processors
Asinus Components
bull PLUGGABLE COMPONENTS ndash Pluggable
ConfigurationManagerCacheManagerInMemoryCacheManagerSessionManagerCookieManagerHeaderManagerSanitizerDeviceManagerRequestContextSummaryHolderResourceManagerPerformanceManagerResponseToDeviceAdapterTemplateSelectorSecurityManagerAuthenticationManagerOpenIdAuthenticationManagerFacebookAuthenticationManageri18NManagerhellip
How to Plug any Component bull Implement the Component Interface
ie CacheManagerConfigurationManager
bull Define in ldquoasinuspropertiesrdquo
asinuscacheManager=myCacheManager
Asinus Components
Request Lifecycle RequestContext
bull Holds request information
bull Propogates through all layers
RequestContext
bull RequestContext Summary is bind to ThreadLocalInject RequestContextSummaryHolder component
bull Attributes contextRootmodemoduleactionpathInfooriginalPathInfocookiesrequestCookiesrequestParametersattributeshostnamemachineinstancelocaleuserdeviceuseragentheadersrefererxforwardedformimeRequestmodelBeanmodelBeanValidationErrorshellip
RequestContextAttributes
bull From Action Controller public class ViewActionController implements BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
boolean paramA = requestgetRequestContext()getRequestParameters()
getRequestParamaterValueAsBoolean(a)
String cookieValueA = requestgetRequestContext()
getRequestCookies()get(a)getValue
String clientAddress = requestgetRequestContext()getRemoteAddress()
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
High Level Architecture
Asinus as Web App Dev Framework
Asinus hides Servlet API from developer
bull Resolves HttpServletRequest as Asinus RequestContext
bull RequestContext is then propogated as module requests
Asinus as Service Framework
Asinus is also a Service Framework because
bull Covers webservices
bull Supports JSON services
bull Supports RESTFULL services
Asinus Modules
bull Asinus works with modules so you should implement your own modules
bull Module is a reusable component that realizes a business on its own
For eample Weather moduleLocation ModuleCreditCard Modulehellip
Asinus Modulesbull Easy to package
Jar format
bull Reusable in any Asinus Project
Just add to classpath
Freemarker is the right technology Jsp is not
bull Can be loaded on the fly
Dynamic loading using Asinus admin console
Package Structure Module Class
Package Structure ActionController
Package structure views
Package Structure Domain amp Repository
Objects
Package structure MCS Content
Package structure Module Configuration
Package structure Static Content
Creating Modules
bull ManuallyDocument ldquoFirst installationrdquo
httpturkcell-imturkcellcomtrwordpressp=160
Document ldquoDeveloping modulesrdquo
httpturkcell-imturkcellcomtrwordpressp=532
bull Using Eclipse Pluginhttpturkcell-imturkcellcomtrwordpressp=2410
Eclipse PluginCreating New Project
Eclipse Plugin
Eclipse PluginCreating New ActionController
Eclipse PluginCreating New Webservice
Eclipse PluginImporting Asinus-Showcase Application
(Asinus Examples)
Asinus as Dependency Injection Framework
bull Spring ApplicationContext is used
No tight dependencySpring can be replaceable
bull No dependency on Spring annotations
Use ConfiguredBean and Resource annotations
ConfiguredBean Resource
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
AddressService addressService
public void service()
addressServiceservice(hellip)
bull You can fully utilize Spring FrameworkCreate Spring Beans and
define in asinus-beans-ltanyNamegtxml
bull Asinus initializes both
ConfiguredBeanrsquos + Spring Beans
Asinus ampSpring Framework
How Asinus Initalizes
bull Initializes spring beans and ConfiguredBeanrsquos
bull Inject dependencies (Resource)
How Asinus Initalizes
bull Executes Initialize annotated methods
bull Executes SimpleJob and CronJob annotated jobs
Asinus Components
bull CORE COMPONENTS ndash Not pluggable
RequestHandler
ModuleController
ProtocolHandler
ExecutionManager
Request Processors
Response Processors
Asinus Components
bull PLUGGABLE COMPONENTS ndash Pluggable
ConfigurationManagerCacheManagerInMemoryCacheManagerSessionManagerCookieManagerHeaderManagerSanitizerDeviceManagerRequestContextSummaryHolderResourceManagerPerformanceManagerResponseToDeviceAdapterTemplateSelectorSecurityManagerAuthenticationManagerOpenIdAuthenticationManagerFacebookAuthenticationManageri18NManagerhellip
How to Plug any Component bull Implement the Component Interface
ie CacheManagerConfigurationManager
bull Define in ldquoasinuspropertiesrdquo
asinuscacheManager=myCacheManager
Asinus Components
Request Lifecycle RequestContext
bull Holds request information
bull Propogates through all layers
RequestContext
bull RequestContext Summary is bind to ThreadLocalInject RequestContextSummaryHolder component
bull Attributes contextRootmodemoduleactionpathInfooriginalPathInfocookiesrequestCookiesrequestParametersattributeshostnamemachineinstancelocaleuserdeviceuseragentheadersrefererxforwardedformimeRequestmodelBeanmodelBeanValidationErrorshellip
RequestContextAttributes
bull From Action Controller public class ViewActionController implements BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
boolean paramA = requestgetRequestContext()getRequestParameters()
getRequestParamaterValueAsBoolean(a)
String cookieValueA = requestgetRequestContext()
getRequestCookies()get(a)getValue
String clientAddress = requestgetRequestContext()getRemoteAddress()
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Asinus as Web App Dev Framework
Asinus hides Servlet API from developer
bull Resolves HttpServletRequest as Asinus RequestContext
bull RequestContext is then propogated as module requests
Asinus as Service Framework
Asinus is also a Service Framework because
bull Covers webservices
bull Supports JSON services
bull Supports RESTFULL services
Asinus Modules
bull Asinus works with modules so you should implement your own modules
bull Module is a reusable component that realizes a business on its own
For eample Weather moduleLocation ModuleCreditCard Modulehellip
Asinus Modulesbull Easy to package
Jar format
bull Reusable in any Asinus Project
Just add to classpath
Freemarker is the right technology Jsp is not
bull Can be loaded on the fly
Dynamic loading using Asinus admin console
Package Structure Module Class
Package Structure ActionController
Package structure views
Package Structure Domain amp Repository
Objects
Package structure MCS Content
Package structure Module Configuration
Package structure Static Content
Creating Modules
bull ManuallyDocument ldquoFirst installationrdquo
httpturkcell-imturkcellcomtrwordpressp=160
Document ldquoDeveloping modulesrdquo
httpturkcell-imturkcellcomtrwordpressp=532
bull Using Eclipse Pluginhttpturkcell-imturkcellcomtrwordpressp=2410
Eclipse PluginCreating New Project
Eclipse Plugin
Eclipse PluginCreating New ActionController
Eclipse PluginCreating New Webservice
Eclipse PluginImporting Asinus-Showcase Application
(Asinus Examples)
Asinus as Dependency Injection Framework
bull Spring ApplicationContext is used
No tight dependencySpring can be replaceable
bull No dependency on Spring annotations
Use ConfiguredBean and Resource annotations
ConfiguredBean Resource
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
AddressService addressService
public void service()
addressServiceservice(hellip)
bull You can fully utilize Spring FrameworkCreate Spring Beans and
define in asinus-beans-ltanyNamegtxml
bull Asinus initializes both
ConfiguredBeanrsquos + Spring Beans
Asinus ampSpring Framework
How Asinus Initalizes
bull Initializes spring beans and ConfiguredBeanrsquos
bull Inject dependencies (Resource)
How Asinus Initalizes
bull Executes Initialize annotated methods
bull Executes SimpleJob and CronJob annotated jobs
Asinus Components
bull CORE COMPONENTS ndash Not pluggable
RequestHandler
ModuleController
ProtocolHandler
ExecutionManager
Request Processors
Response Processors
Asinus Components
bull PLUGGABLE COMPONENTS ndash Pluggable
ConfigurationManagerCacheManagerInMemoryCacheManagerSessionManagerCookieManagerHeaderManagerSanitizerDeviceManagerRequestContextSummaryHolderResourceManagerPerformanceManagerResponseToDeviceAdapterTemplateSelectorSecurityManagerAuthenticationManagerOpenIdAuthenticationManagerFacebookAuthenticationManageri18NManagerhellip
How to Plug any Component bull Implement the Component Interface
ie CacheManagerConfigurationManager
bull Define in ldquoasinuspropertiesrdquo
asinuscacheManager=myCacheManager
Asinus Components
Request Lifecycle RequestContext
bull Holds request information
bull Propogates through all layers
RequestContext
bull RequestContext Summary is bind to ThreadLocalInject RequestContextSummaryHolder component
bull Attributes contextRootmodemoduleactionpathInfooriginalPathInfocookiesrequestCookiesrequestParametersattributeshostnamemachineinstancelocaleuserdeviceuseragentheadersrefererxforwardedformimeRequestmodelBeanmodelBeanValidationErrorshellip
RequestContextAttributes
bull From Action Controller public class ViewActionController implements BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
boolean paramA = requestgetRequestContext()getRequestParameters()
getRequestParamaterValueAsBoolean(a)
String cookieValueA = requestgetRequestContext()
getRequestCookies()get(a)getValue
String clientAddress = requestgetRequestContext()getRemoteAddress()
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Asinus as Service Framework
Asinus is also a Service Framework because
bull Covers webservices
bull Supports JSON services
bull Supports RESTFULL services
Asinus Modules
bull Asinus works with modules so you should implement your own modules
bull Module is a reusable component that realizes a business on its own
For eample Weather moduleLocation ModuleCreditCard Modulehellip
Asinus Modulesbull Easy to package
Jar format
bull Reusable in any Asinus Project
Just add to classpath
Freemarker is the right technology Jsp is not
bull Can be loaded on the fly
Dynamic loading using Asinus admin console
Package Structure Module Class
Package Structure ActionController
Package structure views
Package Structure Domain amp Repository
Objects
Package structure MCS Content
Package structure Module Configuration
Package structure Static Content
Creating Modules
bull ManuallyDocument ldquoFirst installationrdquo
httpturkcell-imturkcellcomtrwordpressp=160
Document ldquoDeveloping modulesrdquo
httpturkcell-imturkcellcomtrwordpressp=532
bull Using Eclipse Pluginhttpturkcell-imturkcellcomtrwordpressp=2410
Eclipse PluginCreating New Project
Eclipse Plugin
Eclipse PluginCreating New ActionController
Eclipse PluginCreating New Webservice
Eclipse PluginImporting Asinus-Showcase Application
(Asinus Examples)
Asinus as Dependency Injection Framework
bull Spring ApplicationContext is used
No tight dependencySpring can be replaceable
bull No dependency on Spring annotations
Use ConfiguredBean and Resource annotations
ConfiguredBean Resource
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
AddressService addressService
public void service()
addressServiceservice(hellip)
bull You can fully utilize Spring FrameworkCreate Spring Beans and
define in asinus-beans-ltanyNamegtxml
bull Asinus initializes both
ConfiguredBeanrsquos + Spring Beans
Asinus ampSpring Framework
How Asinus Initalizes
bull Initializes spring beans and ConfiguredBeanrsquos
bull Inject dependencies (Resource)
How Asinus Initalizes
bull Executes Initialize annotated methods
bull Executes SimpleJob and CronJob annotated jobs
Asinus Components
bull CORE COMPONENTS ndash Not pluggable
RequestHandler
ModuleController
ProtocolHandler
ExecutionManager
Request Processors
Response Processors
Asinus Components
bull PLUGGABLE COMPONENTS ndash Pluggable
ConfigurationManagerCacheManagerInMemoryCacheManagerSessionManagerCookieManagerHeaderManagerSanitizerDeviceManagerRequestContextSummaryHolderResourceManagerPerformanceManagerResponseToDeviceAdapterTemplateSelectorSecurityManagerAuthenticationManagerOpenIdAuthenticationManagerFacebookAuthenticationManageri18NManagerhellip
How to Plug any Component bull Implement the Component Interface
ie CacheManagerConfigurationManager
bull Define in ldquoasinuspropertiesrdquo
asinuscacheManager=myCacheManager
Asinus Components
Request Lifecycle RequestContext
bull Holds request information
bull Propogates through all layers
RequestContext
bull RequestContext Summary is bind to ThreadLocalInject RequestContextSummaryHolder component
bull Attributes contextRootmodemoduleactionpathInfooriginalPathInfocookiesrequestCookiesrequestParametersattributeshostnamemachineinstancelocaleuserdeviceuseragentheadersrefererxforwardedformimeRequestmodelBeanmodelBeanValidationErrorshellip
RequestContextAttributes
bull From Action Controller public class ViewActionController implements BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
boolean paramA = requestgetRequestContext()getRequestParameters()
getRequestParamaterValueAsBoolean(a)
String cookieValueA = requestgetRequestContext()
getRequestCookies()get(a)getValue
String clientAddress = requestgetRequestContext()getRemoteAddress()
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Asinus Modules
bull Asinus works with modules so you should implement your own modules
bull Module is a reusable component that realizes a business on its own
For eample Weather moduleLocation ModuleCreditCard Modulehellip
Asinus Modulesbull Easy to package
Jar format
bull Reusable in any Asinus Project
Just add to classpath
Freemarker is the right technology Jsp is not
bull Can be loaded on the fly
Dynamic loading using Asinus admin console
Package Structure Module Class
Package Structure ActionController
Package structure views
Package Structure Domain amp Repository
Objects
Package structure MCS Content
Package structure Module Configuration
Package structure Static Content
Creating Modules
bull ManuallyDocument ldquoFirst installationrdquo
httpturkcell-imturkcellcomtrwordpressp=160
Document ldquoDeveloping modulesrdquo
httpturkcell-imturkcellcomtrwordpressp=532
bull Using Eclipse Pluginhttpturkcell-imturkcellcomtrwordpressp=2410
Eclipse PluginCreating New Project
Eclipse Plugin
Eclipse PluginCreating New ActionController
Eclipse PluginCreating New Webservice
Eclipse PluginImporting Asinus-Showcase Application
(Asinus Examples)
Asinus as Dependency Injection Framework
bull Spring ApplicationContext is used
No tight dependencySpring can be replaceable
bull No dependency on Spring annotations
Use ConfiguredBean and Resource annotations
ConfiguredBean Resource
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
AddressService addressService
public void service()
addressServiceservice(hellip)
bull You can fully utilize Spring FrameworkCreate Spring Beans and
define in asinus-beans-ltanyNamegtxml
bull Asinus initializes both
ConfiguredBeanrsquos + Spring Beans
Asinus ampSpring Framework
How Asinus Initalizes
bull Initializes spring beans and ConfiguredBeanrsquos
bull Inject dependencies (Resource)
How Asinus Initalizes
bull Executes Initialize annotated methods
bull Executes SimpleJob and CronJob annotated jobs
Asinus Components
bull CORE COMPONENTS ndash Not pluggable
RequestHandler
ModuleController
ProtocolHandler
ExecutionManager
Request Processors
Response Processors
Asinus Components
bull PLUGGABLE COMPONENTS ndash Pluggable
ConfigurationManagerCacheManagerInMemoryCacheManagerSessionManagerCookieManagerHeaderManagerSanitizerDeviceManagerRequestContextSummaryHolderResourceManagerPerformanceManagerResponseToDeviceAdapterTemplateSelectorSecurityManagerAuthenticationManagerOpenIdAuthenticationManagerFacebookAuthenticationManageri18NManagerhellip
How to Plug any Component bull Implement the Component Interface
ie CacheManagerConfigurationManager
bull Define in ldquoasinuspropertiesrdquo
asinuscacheManager=myCacheManager
Asinus Components
Request Lifecycle RequestContext
bull Holds request information
bull Propogates through all layers
RequestContext
bull RequestContext Summary is bind to ThreadLocalInject RequestContextSummaryHolder component
bull Attributes contextRootmodemoduleactionpathInfooriginalPathInfocookiesrequestCookiesrequestParametersattributeshostnamemachineinstancelocaleuserdeviceuseragentheadersrefererxforwardedformimeRequestmodelBeanmodelBeanValidationErrorshellip
RequestContextAttributes
bull From Action Controller public class ViewActionController implements BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
boolean paramA = requestgetRequestContext()getRequestParameters()
getRequestParamaterValueAsBoolean(a)
String cookieValueA = requestgetRequestContext()
getRequestCookies()get(a)getValue
String clientAddress = requestgetRequestContext()getRemoteAddress()
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Asinus Modulesbull Easy to package
Jar format
bull Reusable in any Asinus Project
Just add to classpath
Freemarker is the right technology Jsp is not
bull Can be loaded on the fly
Dynamic loading using Asinus admin console
Package Structure Module Class
Package Structure ActionController
Package structure views
Package Structure Domain amp Repository
Objects
Package structure MCS Content
Package structure Module Configuration
Package structure Static Content
Creating Modules
bull ManuallyDocument ldquoFirst installationrdquo
httpturkcell-imturkcellcomtrwordpressp=160
Document ldquoDeveloping modulesrdquo
httpturkcell-imturkcellcomtrwordpressp=532
bull Using Eclipse Pluginhttpturkcell-imturkcellcomtrwordpressp=2410
Eclipse PluginCreating New Project
Eclipse Plugin
Eclipse PluginCreating New ActionController
Eclipse PluginCreating New Webservice
Eclipse PluginImporting Asinus-Showcase Application
(Asinus Examples)
Asinus as Dependency Injection Framework
bull Spring ApplicationContext is used
No tight dependencySpring can be replaceable
bull No dependency on Spring annotations
Use ConfiguredBean and Resource annotations
ConfiguredBean Resource
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
AddressService addressService
public void service()
addressServiceservice(hellip)
bull You can fully utilize Spring FrameworkCreate Spring Beans and
define in asinus-beans-ltanyNamegtxml
bull Asinus initializes both
ConfiguredBeanrsquos + Spring Beans
Asinus ampSpring Framework
How Asinus Initalizes
bull Initializes spring beans and ConfiguredBeanrsquos
bull Inject dependencies (Resource)
How Asinus Initalizes
bull Executes Initialize annotated methods
bull Executes SimpleJob and CronJob annotated jobs
Asinus Components
bull CORE COMPONENTS ndash Not pluggable
RequestHandler
ModuleController
ProtocolHandler
ExecutionManager
Request Processors
Response Processors
Asinus Components
bull PLUGGABLE COMPONENTS ndash Pluggable
ConfigurationManagerCacheManagerInMemoryCacheManagerSessionManagerCookieManagerHeaderManagerSanitizerDeviceManagerRequestContextSummaryHolderResourceManagerPerformanceManagerResponseToDeviceAdapterTemplateSelectorSecurityManagerAuthenticationManagerOpenIdAuthenticationManagerFacebookAuthenticationManageri18NManagerhellip
How to Plug any Component bull Implement the Component Interface
ie CacheManagerConfigurationManager
bull Define in ldquoasinuspropertiesrdquo
asinuscacheManager=myCacheManager
Asinus Components
Request Lifecycle RequestContext
bull Holds request information
bull Propogates through all layers
RequestContext
bull RequestContext Summary is bind to ThreadLocalInject RequestContextSummaryHolder component
bull Attributes contextRootmodemoduleactionpathInfooriginalPathInfocookiesrequestCookiesrequestParametersattributeshostnamemachineinstancelocaleuserdeviceuseragentheadersrefererxforwardedformimeRequestmodelBeanmodelBeanValidationErrorshellip
RequestContextAttributes
bull From Action Controller public class ViewActionController implements BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
boolean paramA = requestgetRequestContext()getRequestParameters()
getRequestParamaterValueAsBoolean(a)
String cookieValueA = requestgetRequestContext()
getRequestCookies()get(a)getValue
String clientAddress = requestgetRequestContext()getRemoteAddress()
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Package Structure Module Class
Package Structure ActionController
Package structure views
Package Structure Domain amp Repository
Objects
Package structure MCS Content
Package structure Module Configuration
Package structure Static Content
Creating Modules
bull ManuallyDocument ldquoFirst installationrdquo
httpturkcell-imturkcellcomtrwordpressp=160
Document ldquoDeveloping modulesrdquo
httpturkcell-imturkcellcomtrwordpressp=532
bull Using Eclipse Pluginhttpturkcell-imturkcellcomtrwordpressp=2410
Eclipse PluginCreating New Project
Eclipse Plugin
Eclipse PluginCreating New ActionController
Eclipse PluginCreating New Webservice
Eclipse PluginImporting Asinus-Showcase Application
(Asinus Examples)
Asinus as Dependency Injection Framework
bull Spring ApplicationContext is used
No tight dependencySpring can be replaceable
bull No dependency on Spring annotations
Use ConfiguredBean and Resource annotations
ConfiguredBean Resource
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
AddressService addressService
public void service()
addressServiceservice(hellip)
bull You can fully utilize Spring FrameworkCreate Spring Beans and
define in asinus-beans-ltanyNamegtxml
bull Asinus initializes both
ConfiguredBeanrsquos + Spring Beans
Asinus ampSpring Framework
How Asinus Initalizes
bull Initializes spring beans and ConfiguredBeanrsquos
bull Inject dependencies (Resource)
How Asinus Initalizes
bull Executes Initialize annotated methods
bull Executes SimpleJob and CronJob annotated jobs
Asinus Components
bull CORE COMPONENTS ndash Not pluggable
RequestHandler
ModuleController
ProtocolHandler
ExecutionManager
Request Processors
Response Processors
Asinus Components
bull PLUGGABLE COMPONENTS ndash Pluggable
ConfigurationManagerCacheManagerInMemoryCacheManagerSessionManagerCookieManagerHeaderManagerSanitizerDeviceManagerRequestContextSummaryHolderResourceManagerPerformanceManagerResponseToDeviceAdapterTemplateSelectorSecurityManagerAuthenticationManagerOpenIdAuthenticationManagerFacebookAuthenticationManageri18NManagerhellip
How to Plug any Component bull Implement the Component Interface
ie CacheManagerConfigurationManager
bull Define in ldquoasinuspropertiesrdquo
asinuscacheManager=myCacheManager
Asinus Components
Request Lifecycle RequestContext
bull Holds request information
bull Propogates through all layers
RequestContext
bull RequestContext Summary is bind to ThreadLocalInject RequestContextSummaryHolder component
bull Attributes contextRootmodemoduleactionpathInfooriginalPathInfocookiesrequestCookiesrequestParametersattributeshostnamemachineinstancelocaleuserdeviceuseragentheadersrefererxforwardedformimeRequestmodelBeanmodelBeanValidationErrorshellip
RequestContextAttributes
bull From Action Controller public class ViewActionController implements BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
boolean paramA = requestgetRequestContext()getRequestParameters()
getRequestParamaterValueAsBoolean(a)
String cookieValueA = requestgetRequestContext()
getRequestCookies()get(a)getValue
String clientAddress = requestgetRequestContext()getRemoteAddress()
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Package Structure ActionController
Package structure views
Package Structure Domain amp Repository
Objects
Package structure MCS Content
Package structure Module Configuration
Package structure Static Content
Creating Modules
bull ManuallyDocument ldquoFirst installationrdquo
httpturkcell-imturkcellcomtrwordpressp=160
Document ldquoDeveloping modulesrdquo
httpturkcell-imturkcellcomtrwordpressp=532
bull Using Eclipse Pluginhttpturkcell-imturkcellcomtrwordpressp=2410
Eclipse PluginCreating New Project
Eclipse Plugin
Eclipse PluginCreating New ActionController
Eclipse PluginCreating New Webservice
Eclipse PluginImporting Asinus-Showcase Application
(Asinus Examples)
Asinus as Dependency Injection Framework
bull Spring ApplicationContext is used
No tight dependencySpring can be replaceable
bull No dependency on Spring annotations
Use ConfiguredBean and Resource annotations
ConfiguredBean Resource
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
AddressService addressService
public void service()
addressServiceservice(hellip)
bull You can fully utilize Spring FrameworkCreate Spring Beans and
define in asinus-beans-ltanyNamegtxml
bull Asinus initializes both
ConfiguredBeanrsquos + Spring Beans
Asinus ampSpring Framework
How Asinus Initalizes
bull Initializes spring beans and ConfiguredBeanrsquos
bull Inject dependencies (Resource)
How Asinus Initalizes
bull Executes Initialize annotated methods
bull Executes SimpleJob and CronJob annotated jobs
Asinus Components
bull CORE COMPONENTS ndash Not pluggable
RequestHandler
ModuleController
ProtocolHandler
ExecutionManager
Request Processors
Response Processors
Asinus Components
bull PLUGGABLE COMPONENTS ndash Pluggable
ConfigurationManagerCacheManagerInMemoryCacheManagerSessionManagerCookieManagerHeaderManagerSanitizerDeviceManagerRequestContextSummaryHolderResourceManagerPerformanceManagerResponseToDeviceAdapterTemplateSelectorSecurityManagerAuthenticationManagerOpenIdAuthenticationManagerFacebookAuthenticationManageri18NManagerhellip
How to Plug any Component bull Implement the Component Interface
ie CacheManagerConfigurationManager
bull Define in ldquoasinuspropertiesrdquo
asinuscacheManager=myCacheManager
Asinus Components
Request Lifecycle RequestContext
bull Holds request information
bull Propogates through all layers
RequestContext
bull RequestContext Summary is bind to ThreadLocalInject RequestContextSummaryHolder component
bull Attributes contextRootmodemoduleactionpathInfooriginalPathInfocookiesrequestCookiesrequestParametersattributeshostnamemachineinstancelocaleuserdeviceuseragentheadersrefererxforwardedformimeRequestmodelBeanmodelBeanValidationErrorshellip
RequestContextAttributes
bull From Action Controller public class ViewActionController implements BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
boolean paramA = requestgetRequestContext()getRequestParameters()
getRequestParamaterValueAsBoolean(a)
String cookieValueA = requestgetRequestContext()
getRequestCookies()get(a)getValue
String clientAddress = requestgetRequestContext()getRemoteAddress()
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Package structure views
Package Structure Domain amp Repository
Objects
Package structure MCS Content
Package structure Module Configuration
Package structure Static Content
Creating Modules
bull ManuallyDocument ldquoFirst installationrdquo
httpturkcell-imturkcellcomtrwordpressp=160
Document ldquoDeveloping modulesrdquo
httpturkcell-imturkcellcomtrwordpressp=532
bull Using Eclipse Pluginhttpturkcell-imturkcellcomtrwordpressp=2410
Eclipse PluginCreating New Project
Eclipse Plugin
Eclipse PluginCreating New ActionController
Eclipse PluginCreating New Webservice
Eclipse PluginImporting Asinus-Showcase Application
(Asinus Examples)
Asinus as Dependency Injection Framework
bull Spring ApplicationContext is used
No tight dependencySpring can be replaceable
bull No dependency on Spring annotations
Use ConfiguredBean and Resource annotations
ConfiguredBean Resource
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
AddressService addressService
public void service()
addressServiceservice(hellip)
bull You can fully utilize Spring FrameworkCreate Spring Beans and
define in asinus-beans-ltanyNamegtxml
bull Asinus initializes both
ConfiguredBeanrsquos + Spring Beans
Asinus ampSpring Framework
How Asinus Initalizes
bull Initializes spring beans and ConfiguredBeanrsquos
bull Inject dependencies (Resource)
How Asinus Initalizes
bull Executes Initialize annotated methods
bull Executes SimpleJob and CronJob annotated jobs
Asinus Components
bull CORE COMPONENTS ndash Not pluggable
RequestHandler
ModuleController
ProtocolHandler
ExecutionManager
Request Processors
Response Processors
Asinus Components
bull PLUGGABLE COMPONENTS ndash Pluggable
ConfigurationManagerCacheManagerInMemoryCacheManagerSessionManagerCookieManagerHeaderManagerSanitizerDeviceManagerRequestContextSummaryHolderResourceManagerPerformanceManagerResponseToDeviceAdapterTemplateSelectorSecurityManagerAuthenticationManagerOpenIdAuthenticationManagerFacebookAuthenticationManageri18NManagerhellip
How to Plug any Component bull Implement the Component Interface
ie CacheManagerConfigurationManager
bull Define in ldquoasinuspropertiesrdquo
asinuscacheManager=myCacheManager
Asinus Components
Request Lifecycle RequestContext
bull Holds request information
bull Propogates through all layers
RequestContext
bull RequestContext Summary is bind to ThreadLocalInject RequestContextSummaryHolder component
bull Attributes contextRootmodemoduleactionpathInfooriginalPathInfocookiesrequestCookiesrequestParametersattributeshostnamemachineinstancelocaleuserdeviceuseragentheadersrefererxforwardedformimeRequestmodelBeanmodelBeanValidationErrorshellip
RequestContextAttributes
bull From Action Controller public class ViewActionController implements BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
boolean paramA = requestgetRequestContext()getRequestParameters()
getRequestParamaterValueAsBoolean(a)
String cookieValueA = requestgetRequestContext()
getRequestCookies()get(a)getValue
String clientAddress = requestgetRequestContext()getRemoteAddress()
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Package Structure Domain amp Repository
Objects
Package structure MCS Content
Package structure Module Configuration
Package structure Static Content
Creating Modules
bull ManuallyDocument ldquoFirst installationrdquo
httpturkcell-imturkcellcomtrwordpressp=160
Document ldquoDeveloping modulesrdquo
httpturkcell-imturkcellcomtrwordpressp=532
bull Using Eclipse Pluginhttpturkcell-imturkcellcomtrwordpressp=2410
Eclipse PluginCreating New Project
Eclipse Plugin
Eclipse PluginCreating New ActionController
Eclipse PluginCreating New Webservice
Eclipse PluginImporting Asinus-Showcase Application
(Asinus Examples)
Asinus as Dependency Injection Framework
bull Spring ApplicationContext is used
No tight dependencySpring can be replaceable
bull No dependency on Spring annotations
Use ConfiguredBean and Resource annotations
ConfiguredBean Resource
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
AddressService addressService
public void service()
addressServiceservice(hellip)
bull You can fully utilize Spring FrameworkCreate Spring Beans and
define in asinus-beans-ltanyNamegtxml
bull Asinus initializes both
ConfiguredBeanrsquos + Spring Beans
Asinus ampSpring Framework
How Asinus Initalizes
bull Initializes spring beans and ConfiguredBeanrsquos
bull Inject dependencies (Resource)
How Asinus Initalizes
bull Executes Initialize annotated methods
bull Executes SimpleJob and CronJob annotated jobs
Asinus Components
bull CORE COMPONENTS ndash Not pluggable
RequestHandler
ModuleController
ProtocolHandler
ExecutionManager
Request Processors
Response Processors
Asinus Components
bull PLUGGABLE COMPONENTS ndash Pluggable
ConfigurationManagerCacheManagerInMemoryCacheManagerSessionManagerCookieManagerHeaderManagerSanitizerDeviceManagerRequestContextSummaryHolderResourceManagerPerformanceManagerResponseToDeviceAdapterTemplateSelectorSecurityManagerAuthenticationManagerOpenIdAuthenticationManagerFacebookAuthenticationManageri18NManagerhellip
How to Plug any Component bull Implement the Component Interface
ie CacheManagerConfigurationManager
bull Define in ldquoasinuspropertiesrdquo
asinuscacheManager=myCacheManager
Asinus Components
Request Lifecycle RequestContext
bull Holds request information
bull Propogates through all layers
RequestContext
bull RequestContext Summary is bind to ThreadLocalInject RequestContextSummaryHolder component
bull Attributes contextRootmodemoduleactionpathInfooriginalPathInfocookiesrequestCookiesrequestParametersattributeshostnamemachineinstancelocaleuserdeviceuseragentheadersrefererxforwardedformimeRequestmodelBeanmodelBeanValidationErrorshellip
RequestContextAttributes
bull From Action Controller public class ViewActionController implements BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
boolean paramA = requestgetRequestContext()getRequestParameters()
getRequestParamaterValueAsBoolean(a)
String cookieValueA = requestgetRequestContext()
getRequestCookies()get(a)getValue
String clientAddress = requestgetRequestContext()getRemoteAddress()
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Package structure MCS Content
Package structure Module Configuration
Package structure Static Content
Creating Modules
bull ManuallyDocument ldquoFirst installationrdquo
httpturkcell-imturkcellcomtrwordpressp=160
Document ldquoDeveloping modulesrdquo
httpturkcell-imturkcellcomtrwordpressp=532
bull Using Eclipse Pluginhttpturkcell-imturkcellcomtrwordpressp=2410
Eclipse PluginCreating New Project
Eclipse Plugin
Eclipse PluginCreating New ActionController
Eclipse PluginCreating New Webservice
Eclipse PluginImporting Asinus-Showcase Application
(Asinus Examples)
Asinus as Dependency Injection Framework
bull Spring ApplicationContext is used
No tight dependencySpring can be replaceable
bull No dependency on Spring annotations
Use ConfiguredBean and Resource annotations
ConfiguredBean Resource
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
AddressService addressService
public void service()
addressServiceservice(hellip)
bull You can fully utilize Spring FrameworkCreate Spring Beans and
define in asinus-beans-ltanyNamegtxml
bull Asinus initializes both
ConfiguredBeanrsquos + Spring Beans
Asinus ampSpring Framework
How Asinus Initalizes
bull Initializes spring beans and ConfiguredBeanrsquos
bull Inject dependencies (Resource)
How Asinus Initalizes
bull Executes Initialize annotated methods
bull Executes SimpleJob and CronJob annotated jobs
Asinus Components
bull CORE COMPONENTS ndash Not pluggable
RequestHandler
ModuleController
ProtocolHandler
ExecutionManager
Request Processors
Response Processors
Asinus Components
bull PLUGGABLE COMPONENTS ndash Pluggable
ConfigurationManagerCacheManagerInMemoryCacheManagerSessionManagerCookieManagerHeaderManagerSanitizerDeviceManagerRequestContextSummaryHolderResourceManagerPerformanceManagerResponseToDeviceAdapterTemplateSelectorSecurityManagerAuthenticationManagerOpenIdAuthenticationManagerFacebookAuthenticationManageri18NManagerhellip
How to Plug any Component bull Implement the Component Interface
ie CacheManagerConfigurationManager
bull Define in ldquoasinuspropertiesrdquo
asinuscacheManager=myCacheManager
Asinus Components
Request Lifecycle RequestContext
bull Holds request information
bull Propogates through all layers
RequestContext
bull RequestContext Summary is bind to ThreadLocalInject RequestContextSummaryHolder component
bull Attributes contextRootmodemoduleactionpathInfooriginalPathInfocookiesrequestCookiesrequestParametersattributeshostnamemachineinstancelocaleuserdeviceuseragentheadersrefererxforwardedformimeRequestmodelBeanmodelBeanValidationErrorshellip
RequestContextAttributes
bull From Action Controller public class ViewActionController implements BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
boolean paramA = requestgetRequestContext()getRequestParameters()
getRequestParamaterValueAsBoolean(a)
String cookieValueA = requestgetRequestContext()
getRequestCookies()get(a)getValue
String clientAddress = requestgetRequestContext()getRemoteAddress()
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Package structure Module Configuration
Package structure Static Content
Creating Modules
bull ManuallyDocument ldquoFirst installationrdquo
httpturkcell-imturkcellcomtrwordpressp=160
Document ldquoDeveloping modulesrdquo
httpturkcell-imturkcellcomtrwordpressp=532
bull Using Eclipse Pluginhttpturkcell-imturkcellcomtrwordpressp=2410
Eclipse PluginCreating New Project
Eclipse Plugin
Eclipse PluginCreating New ActionController
Eclipse PluginCreating New Webservice
Eclipse PluginImporting Asinus-Showcase Application
(Asinus Examples)
Asinus as Dependency Injection Framework
bull Spring ApplicationContext is used
No tight dependencySpring can be replaceable
bull No dependency on Spring annotations
Use ConfiguredBean and Resource annotations
ConfiguredBean Resource
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
AddressService addressService
public void service()
addressServiceservice(hellip)
bull You can fully utilize Spring FrameworkCreate Spring Beans and
define in asinus-beans-ltanyNamegtxml
bull Asinus initializes both
ConfiguredBeanrsquos + Spring Beans
Asinus ampSpring Framework
How Asinus Initalizes
bull Initializes spring beans and ConfiguredBeanrsquos
bull Inject dependencies (Resource)
How Asinus Initalizes
bull Executes Initialize annotated methods
bull Executes SimpleJob and CronJob annotated jobs
Asinus Components
bull CORE COMPONENTS ndash Not pluggable
RequestHandler
ModuleController
ProtocolHandler
ExecutionManager
Request Processors
Response Processors
Asinus Components
bull PLUGGABLE COMPONENTS ndash Pluggable
ConfigurationManagerCacheManagerInMemoryCacheManagerSessionManagerCookieManagerHeaderManagerSanitizerDeviceManagerRequestContextSummaryHolderResourceManagerPerformanceManagerResponseToDeviceAdapterTemplateSelectorSecurityManagerAuthenticationManagerOpenIdAuthenticationManagerFacebookAuthenticationManageri18NManagerhellip
How to Plug any Component bull Implement the Component Interface
ie CacheManagerConfigurationManager
bull Define in ldquoasinuspropertiesrdquo
asinuscacheManager=myCacheManager
Asinus Components
Request Lifecycle RequestContext
bull Holds request information
bull Propogates through all layers
RequestContext
bull RequestContext Summary is bind to ThreadLocalInject RequestContextSummaryHolder component
bull Attributes contextRootmodemoduleactionpathInfooriginalPathInfocookiesrequestCookiesrequestParametersattributeshostnamemachineinstancelocaleuserdeviceuseragentheadersrefererxforwardedformimeRequestmodelBeanmodelBeanValidationErrorshellip
RequestContextAttributes
bull From Action Controller public class ViewActionController implements BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
boolean paramA = requestgetRequestContext()getRequestParameters()
getRequestParamaterValueAsBoolean(a)
String cookieValueA = requestgetRequestContext()
getRequestCookies()get(a)getValue
String clientAddress = requestgetRequestContext()getRemoteAddress()
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Package structure Static Content
Creating Modules
bull ManuallyDocument ldquoFirst installationrdquo
httpturkcell-imturkcellcomtrwordpressp=160
Document ldquoDeveloping modulesrdquo
httpturkcell-imturkcellcomtrwordpressp=532
bull Using Eclipse Pluginhttpturkcell-imturkcellcomtrwordpressp=2410
Eclipse PluginCreating New Project
Eclipse Plugin
Eclipse PluginCreating New ActionController
Eclipse PluginCreating New Webservice
Eclipse PluginImporting Asinus-Showcase Application
(Asinus Examples)
Asinus as Dependency Injection Framework
bull Spring ApplicationContext is used
No tight dependencySpring can be replaceable
bull No dependency on Spring annotations
Use ConfiguredBean and Resource annotations
ConfiguredBean Resource
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
AddressService addressService
public void service()
addressServiceservice(hellip)
bull You can fully utilize Spring FrameworkCreate Spring Beans and
define in asinus-beans-ltanyNamegtxml
bull Asinus initializes both
ConfiguredBeanrsquos + Spring Beans
Asinus ampSpring Framework
How Asinus Initalizes
bull Initializes spring beans and ConfiguredBeanrsquos
bull Inject dependencies (Resource)
How Asinus Initalizes
bull Executes Initialize annotated methods
bull Executes SimpleJob and CronJob annotated jobs
Asinus Components
bull CORE COMPONENTS ndash Not pluggable
RequestHandler
ModuleController
ProtocolHandler
ExecutionManager
Request Processors
Response Processors
Asinus Components
bull PLUGGABLE COMPONENTS ndash Pluggable
ConfigurationManagerCacheManagerInMemoryCacheManagerSessionManagerCookieManagerHeaderManagerSanitizerDeviceManagerRequestContextSummaryHolderResourceManagerPerformanceManagerResponseToDeviceAdapterTemplateSelectorSecurityManagerAuthenticationManagerOpenIdAuthenticationManagerFacebookAuthenticationManageri18NManagerhellip
How to Plug any Component bull Implement the Component Interface
ie CacheManagerConfigurationManager
bull Define in ldquoasinuspropertiesrdquo
asinuscacheManager=myCacheManager
Asinus Components
Request Lifecycle RequestContext
bull Holds request information
bull Propogates through all layers
RequestContext
bull RequestContext Summary is bind to ThreadLocalInject RequestContextSummaryHolder component
bull Attributes contextRootmodemoduleactionpathInfooriginalPathInfocookiesrequestCookiesrequestParametersattributeshostnamemachineinstancelocaleuserdeviceuseragentheadersrefererxforwardedformimeRequestmodelBeanmodelBeanValidationErrorshellip
RequestContextAttributes
bull From Action Controller public class ViewActionController implements BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
boolean paramA = requestgetRequestContext()getRequestParameters()
getRequestParamaterValueAsBoolean(a)
String cookieValueA = requestgetRequestContext()
getRequestCookies()get(a)getValue
String clientAddress = requestgetRequestContext()getRemoteAddress()
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Creating Modules
bull ManuallyDocument ldquoFirst installationrdquo
httpturkcell-imturkcellcomtrwordpressp=160
Document ldquoDeveloping modulesrdquo
httpturkcell-imturkcellcomtrwordpressp=532
bull Using Eclipse Pluginhttpturkcell-imturkcellcomtrwordpressp=2410
Eclipse PluginCreating New Project
Eclipse Plugin
Eclipse PluginCreating New ActionController
Eclipse PluginCreating New Webservice
Eclipse PluginImporting Asinus-Showcase Application
(Asinus Examples)
Asinus as Dependency Injection Framework
bull Spring ApplicationContext is used
No tight dependencySpring can be replaceable
bull No dependency on Spring annotations
Use ConfiguredBean and Resource annotations
ConfiguredBean Resource
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
AddressService addressService
public void service()
addressServiceservice(hellip)
bull You can fully utilize Spring FrameworkCreate Spring Beans and
define in asinus-beans-ltanyNamegtxml
bull Asinus initializes both
ConfiguredBeanrsquos + Spring Beans
Asinus ampSpring Framework
How Asinus Initalizes
bull Initializes spring beans and ConfiguredBeanrsquos
bull Inject dependencies (Resource)
How Asinus Initalizes
bull Executes Initialize annotated methods
bull Executes SimpleJob and CronJob annotated jobs
Asinus Components
bull CORE COMPONENTS ndash Not pluggable
RequestHandler
ModuleController
ProtocolHandler
ExecutionManager
Request Processors
Response Processors
Asinus Components
bull PLUGGABLE COMPONENTS ndash Pluggable
ConfigurationManagerCacheManagerInMemoryCacheManagerSessionManagerCookieManagerHeaderManagerSanitizerDeviceManagerRequestContextSummaryHolderResourceManagerPerformanceManagerResponseToDeviceAdapterTemplateSelectorSecurityManagerAuthenticationManagerOpenIdAuthenticationManagerFacebookAuthenticationManageri18NManagerhellip
How to Plug any Component bull Implement the Component Interface
ie CacheManagerConfigurationManager
bull Define in ldquoasinuspropertiesrdquo
asinuscacheManager=myCacheManager
Asinus Components
Request Lifecycle RequestContext
bull Holds request information
bull Propogates through all layers
RequestContext
bull RequestContext Summary is bind to ThreadLocalInject RequestContextSummaryHolder component
bull Attributes contextRootmodemoduleactionpathInfooriginalPathInfocookiesrequestCookiesrequestParametersattributeshostnamemachineinstancelocaleuserdeviceuseragentheadersrefererxforwardedformimeRequestmodelBeanmodelBeanValidationErrorshellip
RequestContextAttributes
bull From Action Controller public class ViewActionController implements BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
boolean paramA = requestgetRequestContext()getRequestParameters()
getRequestParamaterValueAsBoolean(a)
String cookieValueA = requestgetRequestContext()
getRequestCookies()get(a)getValue
String clientAddress = requestgetRequestContext()getRemoteAddress()
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Eclipse PluginCreating New Project
Eclipse Plugin
Eclipse PluginCreating New ActionController
Eclipse PluginCreating New Webservice
Eclipse PluginImporting Asinus-Showcase Application
(Asinus Examples)
Asinus as Dependency Injection Framework
bull Spring ApplicationContext is used
No tight dependencySpring can be replaceable
bull No dependency on Spring annotations
Use ConfiguredBean and Resource annotations
ConfiguredBean Resource
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
AddressService addressService
public void service()
addressServiceservice(hellip)
bull You can fully utilize Spring FrameworkCreate Spring Beans and
define in asinus-beans-ltanyNamegtxml
bull Asinus initializes both
ConfiguredBeanrsquos + Spring Beans
Asinus ampSpring Framework
How Asinus Initalizes
bull Initializes spring beans and ConfiguredBeanrsquos
bull Inject dependencies (Resource)
How Asinus Initalizes
bull Executes Initialize annotated methods
bull Executes SimpleJob and CronJob annotated jobs
Asinus Components
bull CORE COMPONENTS ndash Not pluggable
RequestHandler
ModuleController
ProtocolHandler
ExecutionManager
Request Processors
Response Processors
Asinus Components
bull PLUGGABLE COMPONENTS ndash Pluggable
ConfigurationManagerCacheManagerInMemoryCacheManagerSessionManagerCookieManagerHeaderManagerSanitizerDeviceManagerRequestContextSummaryHolderResourceManagerPerformanceManagerResponseToDeviceAdapterTemplateSelectorSecurityManagerAuthenticationManagerOpenIdAuthenticationManagerFacebookAuthenticationManageri18NManagerhellip
How to Plug any Component bull Implement the Component Interface
ie CacheManagerConfigurationManager
bull Define in ldquoasinuspropertiesrdquo
asinuscacheManager=myCacheManager
Asinus Components
Request Lifecycle RequestContext
bull Holds request information
bull Propogates through all layers
RequestContext
bull RequestContext Summary is bind to ThreadLocalInject RequestContextSummaryHolder component
bull Attributes contextRootmodemoduleactionpathInfooriginalPathInfocookiesrequestCookiesrequestParametersattributeshostnamemachineinstancelocaleuserdeviceuseragentheadersrefererxforwardedformimeRequestmodelBeanmodelBeanValidationErrorshellip
RequestContextAttributes
bull From Action Controller public class ViewActionController implements BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
boolean paramA = requestgetRequestContext()getRequestParameters()
getRequestParamaterValueAsBoolean(a)
String cookieValueA = requestgetRequestContext()
getRequestCookies()get(a)getValue
String clientAddress = requestgetRequestContext()getRemoteAddress()
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Eclipse Plugin
Eclipse PluginCreating New ActionController
Eclipse PluginCreating New Webservice
Eclipse PluginImporting Asinus-Showcase Application
(Asinus Examples)
Asinus as Dependency Injection Framework
bull Spring ApplicationContext is used
No tight dependencySpring can be replaceable
bull No dependency on Spring annotations
Use ConfiguredBean and Resource annotations
ConfiguredBean Resource
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
AddressService addressService
public void service()
addressServiceservice(hellip)
bull You can fully utilize Spring FrameworkCreate Spring Beans and
define in asinus-beans-ltanyNamegtxml
bull Asinus initializes both
ConfiguredBeanrsquos + Spring Beans
Asinus ampSpring Framework
How Asinus Initalizes
bull Initializes spring beans and ConfiguredBeanrsquos
bull Inject dependencies (Resource)
How Asinus Initalizes
bull Executes Initialize annotated methods
bull Executes SimpleJob and CronJob annotated jobs
Asinus Components
bull CORE COMPONENTS ndash Not pluggable
RequestHandler
ModuleController
ProtocolHandler
ExecutionManager
Request Processors
Response Processors
Asinus Components
bull PLUGGABLE COMPONENTS ndash Pluggable
ConfigurationManagerCacheManagerInMemoryCacheManagerSessionManagerCookieManagerHeaderManagerSanitizerDeviceManagerRequestContextSummaryHolderResourceManagerPerformanceManagerResponseToDeviceAdapterTemplateSelectorSecurityManagerAuthenticationManagerOpenIdAuthenticationManagerFacebookAuthenticationManageri18NManagerhellip
How to Plug any Component bull Implement the Component Interface
ie CacheManagerConfigurationManager
bull Define in ldquoasinuspropertiesrdquo
asinuscacheManager=myCacheManager
Asinus Components
Request Lifecycle RequestContext
bull Holds request information
bull Propogates through all layers
RequestContext
bull RequestContext Summary is bind to ThreadLocalInject RequestContextSummaryHolder component
bull Attributes contextRootmodemoduleactionpathInfooriginalPathInfocookiesrequestCookiesrequestParametersattributeshostnamemachineinstancelocaleuserdeviceuseragentheadersrefererxforwardedformimeRequestmodelBeanmodelBeanValidationErrorshellip
RequestContextAttributes
bull From Action Controller public class ViewActionController implements BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
boolean paramA = requestgetRequestContext()getRequestParameters()
getRequestParamaterValueAsBoolean(a)
String cookieValueA = requestgetRequestContext()
getRequestCookies()get(a)getValue
String clientAddress = requestgetRequestContext()getRemoteAddress()
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Eclipse PluginCreating New ActionController
Eclipse PluginCreating New Webservice
Eclipse PluginImporting Asinus-Showcase Application
(Asinus Examples)
Asinus as Dependency Injection Framework
bull Spring ApplicationContext is used
No tight dependencySpring can be replaceable
bull No dependency on Spring annotations
Use ConfiguredBean and Resource annotations
ConfiguredBean Resource
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
AddressService addressService
public void service()
addressServiceservice(hellip)
bull You can fully utilize Spring FrameworkCreate Spring Beans and
define in asinus-beans-ltanyNamegtxml
bull Asinus initializes both
ConfiguredBeanrsquos + Spring Beans
Asinus ampSpring Framework
How Asinus Initalizes
bull Initializes spring beans and ConfiguredBeanrsquos
bull Inject dependencies (Resource)
How Asinus Initalizes
bull Executes Initialize annotated methods
bull Executes SimpleJob and CronJob annotated jobs
Asinus Components
bull CORE COMPONENTS ndash Not pluggable
RequestHandler
ModuleController
ProtocolHandler
ExecutionManager
Request Processors
Response Processors
Asinus Components
bull PLUGGABLE COMPONENTS ndash Pluggable
ConfigurationManagerCacheManagerInMemoryCacheManagerSessionManagerCookieManagerHeaderManagerSanitizerDeviceManagerRequestContextSummaryHolderResourceManagerPerformanceManagerResponseToDeviceAdapterTemplateSelectorSecurityManagerAuthenticationManagerOpenIdAuthenticationManagerFacebookAuthenticationManageri18NManagerhellip
How to Plug any Component bull Implement the Component Interface
ie CacheManagerConfigurationManager
bull Define in ldquoasinuspropertiesrdquo
asinuscacheManager=myCacheManager
Asinus Components
Request Lifecycle RequestContext
bull Holds request information
bull Propogates through all layers
RequestContext
bull RequestContext Summary is bind to ThreadLocalInject RequestContextSummaryHolder component
bull Attributes contextRootmodemoduleactionpathInfooriginalPathInfocookiesrequestCookiesrequestParametersattributeshostnamemachineinstancelocaleuserdeviceuseragentheadersrefererxforwardedformimeRequestmodelBeanmodelBeanValidationErrorshellip
RequestContextAttributes
bull From Action Controller public class ViewActionController implements BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
boolean paramA = requestgetRequestContext()getRequestParameters()
getRequestParamaterValueAsBoolean(a)
String cookieValueA = requestgetRequestContext()
getRequestCookies()get(a)getValue
String clientAddress = requestgetRequestContext()getRemoteAddress()
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Eclipse PluginCreating New Webservice
Eclipse PluginImporting Asinus-Showcase Application
(Asinus Examples)
Asinus as Dependency Injection Framework
bull Spring ApplicationContext is used
No tight dependencySpring can be replaceable
bull No dependency on Spring annotations
Use ConfiguredBean and Resource annotations
ConfiguredBean Resource
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
AddressService addressService
public void service()
addressServiceservice(hellip)
bull You can fully utilize Spring FrameworkCreate Spring Beans and
define in asinus-beans-ltanyNamegtxml
bull Asinus initializes both
ConfiguredBeanrsquos + Spring Beans
Asinus ampSpring Framework
How Asinus Initalizes
bull Initializes spring beans and ConfiguredBeanrsquos
bull Inject dependencies (Resource)
How Asinus Initalizes
bull Executes Initialize annotated methods
bull Executes SimpleJob and CronJob annotated jobs
Asinus Components
bull CORE COMPONENTS ndash Not pluggable
RequestHandler
ModuleController
ProtocolHandler
ExecutionManager
Request Processors
Response Processors
Asinus Components
bull PLUGGABLE COMPONENTS ndash Pluggable
ConfigurationManagerCacheManagerInMemoryCacheManagerSessionManagerCookieManagerHeaderManagerSanitizerDeviceManagerRequestContextSummaryHolderResourceManagerPerformanceManagerResponseToDeviceAdapterTemplateSelectorSecurityManagerAuthenticationManagerOpenIdAuthenticationManagerFacebookAuthenticationManageri18NManagerhellip
How to Plug any Component bull Implement the Component Interface
ie CacheManagerConfigurationManager
bull Define in ldquoasinuspropertiesrdquo
asinuscacheManager=myCacheManager
Asinus Components
Request Lifecycle RequestContext
bull Holds request information
bull Propogates through all layers
RequestContext
bull RequestContext Summary is bind to ThreadLocalInject RequestContextSummaryHolder component
bull Attributes contextRootmodemoduleactionpathInfooriginalPathInfocookiesrequestCookiesrequestParametersattributeshostnamemachineinstancelocaleuserdeviceuseragentheadersrefererxforwardedformimeRequestmodelBeanmodelBeanValidationErrorshellip
RequestContextAttributes
bull From Action Controller public class ViewActionController implements BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
boolean paramA = requestgetRequestContext()getRequestParameters()
getRequestParamaterValueAsBoolean(a)
String cookieValueA = requestgetRequestContext()
getRequestCookies()get(a)getValue
String clientAddress = requestgetRequestContext()getRemoteAddress()
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Eclipse PluginImporting Asinus-Showcase Application
(Asinus Examples)
Asinus as Dependency Injection Framework
bull Spring ApplicationContext is used
No tight dependencySpring can be replaceable
bull No dependency on Spring annotations
Use ConfiguredBean and Resource annotations
ConfiguredBean Resource
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
AddressService addressService
public void service()
addressServiceservice(hellip)
bull You can fully utilize Spring FrameworkCreate Spring Beans and
define in asinus-beans-ltanyNamegtxml
bull Asinus initializes both
ConfiguredBeanrsquos + Spring Beans
Asinus ampSpring Framework
How Asinus Initalizes
bull Initializes spring beans and ConfiguredBeanrsquos
bull Inject dependencies (Resource)
How Asinus Initalizes
bull Executes Initialize annotated methods
bull Executes SimpleJob and CronJob annotated jobs
Asinus Components
bull CORE COMPONENTS ndash Not pluggable
RequestHandler
ModuleController
ProtocolHandler
ExecutionManager
Request Processors
Response Processors
Asinus Components
bull PLUGGABLE COMPONENTS ndash Pluggable
ConfigurationManagerCacheManagerInMemoryCacheManagerSessionManagerCookieManagerHeaderManagerSanitizerDeviceManagerRequestContextSummaryHolderResourceManagerPerformanceManagerResponseToDeviceAdapterTemplateSelectorSecurityManagerAuthenticationManagerOpenIdAuthenticationManagerFacebookAuthenticationManageri18NManagerhellip
How to Plug any Component bull Implement the Component Interface
ie CacheManagerConfigurationManager
bull Define in ldquoasinuspropertiesrdquo
asinuscacheManager=myCacheManager
Asinus Components
Request Lifecycle RequestContext
bull Holds request information
bull Propogates through all layers
RequestContext
bull RequestContext Summary is bind to ThreadLocalInject RequestContextSummaryHolder component
bull Attributes contextRootmodemoduleactionpathInfooriginalPathInfocookiesrequestCookiesrequestParametersattributeshostnamemachineinstancelocaleuserdeviceuseragentheadersrefererxforwardedformimeRequestmodelBeanmodelBeanValidationErrorshellip
RequestContextAttributes
bull From Action Controller public class ViewActionController implements BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
boolean paramA = requestgetRequestContext()getRequestParameters()
getRequestParamaterValueAsBoolean(a)
String cookieValueA = requestgetRequestContext()
getRequestCookies()get(a)getValue
String clientAddress = requestgetRequestContext()getRemoteAddress()
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Asinus as Dependency Injection Framework
bull Spring ApplicationContext is used
No tight dependencySpring can be replaceable
bull No dependency on Spring annotations
Use ConfiguredBean and Resource annotations
ConfiguredBean Resource
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
AddressService addressService
public void service()
addressServiceservice(hellip)
bull You can fully utilize Spring FrameworkCreate Spring Beans and
define in asinus-beans-ltanyNamegtxml
bull Asinus initializes both
ConfiguredBeanrsquos + Spring Beans
Asinus ampSpring Framework
How Asinus Initalizes
bull Initializes spring beans and ConfiguredBeanrsquos
bull Inject dependencies (Resource)
How Asinus Initalizes
bull Executes Initialize annotated methods
bull Executes SimpleJob and CronJob annotated jobs
Asinus Components
bull CORE COMPONENTS ndash Not pluggable
RequestHandler
ModuleController
ProtocolHandler
ExecutionManager
Request Processors
Response Processors
Asinus Components
bull PLUGGABLE COMPONENTS ndash Pluggable
ConfigurationManagerCacheManagerInMemoryCacheManagerSessionManagerCookieManagerHeaderManagerSanitizerDeviceManagerRequestContextSummaryHolderResourceManagerPerformanceManagerResponseToDeviceAdapterTemplateSelectorSecurityManagerAuthenticationManagerOpenIdAuthenticationManagerFacebookAuthenticationManageri18NManagerhellip
How to Plug any Component bull Implement the Component Interface
ie CacheManagerConfigurationManager
bull Define in ldquoasinuspropertiesrdquo
asinuscacheManager=myCacheManager
Asinus Components
Request Lifecycle RequestContext
bull Holds request information
bull Propogates through all layers
RequestContext
bull RequestContext Summary is bind to ThreadLocalInject RequestContextSummaryHolder component
bull Attributes contextRootmodemoduleactionpathInfooriginalPathInfocookiesrequestCookiesrequestParametersattributeshostnamemachineinstancelocaleuserdeviceuseragentheadersrefererxforwardedformimeRequestmodelBeanmodelBeanValidationErrorshellip
RequestContextAttributes
bull From Action Controller public class ViewActionController implements BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
boolean paramA = requestgetRequestContext()getRequestParameters()
getRequestParamaterValueAsBoolean(a)
String cookieValueA = requestgetRequestContext()
getRequestCookies()get(a)getValue
String clientAddress = requestgetRequestContext()getRemoteAddress()
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
ConfiguredBean Resource
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
AddressService addressService
public void service()
addressServiceservice(hellip)
bull You can fully utilize Spring FrameworkCreate Spring Beans and
define in asinus-beans-ltanyNamegtxml
bull Asinus initializes both
ConfiguredBeanrsquos + Spring Beans
Asinus ampSpring Framework
How Asinus Initalizes
bull Initializes spring beans and ConfiguredBeanrsquos
bull Inject dependencies (Resource)
How Asinus Initalizes
bull Executes Initialize annotated methods
bull Executes SimpleJob and CronJob annotated jobs
Asinus Components
bull CORE COMPONENTS ndash Not pluggable
RequestHandler
ModuleController
ProtocolHandler
ExecutionManager
Request Processors
Response Processors
Asinus Components
bull PLUGGABLE COMPONENTS ndash Pluggable
ConfigurationManagerCacheManagerInMemoryCacheManagerSessionManagerCookieManagerHeaderManagerSanitizerDeviceManagerRequestContextSummaryHolderResourceManagerPerformanceManagerResponseToDeviceAdapterTemplateSelectorSecurityManagerAuthenticationManagerOpenIdAuthenticationManagerFacebookAuthenticationManageri18NManagerhellip
How to Plug any Component bull Implement the Component Interface
ie CacheManagerConfigurationManager
bull Define in ldquoasinuspropertiesrdquo
asinuscacheManager=myCacheManager
Asinus Components
Request Lifecycle RequestContext
bull Holds request information
bull Propogates through all layers
RequestContext
bull RequestContext Summary is bind to ThreadLocalInject RequestContextSummaryHolder component
bull Attributes contextRootmodemoduleactionpathInfooriginalPathInfocookiesrequestCookiesrequestParametersattributeshostnamemachineinstancelocaleuserdeviceuseragentheadersrefererxforwardedformimeRequestmodelBeanmodelBeanValidationErrorshellip
RequestContextAttributes
bull From Action Controller public class ViewActionController implements BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
boolean paramA = requestgetRequestContext()getRequestParameters()
getRequestParamaterValueAsBoolean(a)
String cookieValueA = requestgetRequestContext()
getRequestCookies()get(a)getValue
String clientAddress = requestgetRequestContext()getRemoteAddress()
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
bull You can fully utilize Spring FrameworkCreate Spring Beans and
define in asinus-beans-ltanyNamegtxml
bull Asinus initializes both
ConfiguredBeanrsquos + Spring Beans
Asinus ampSpring Framework
How Asinus Initalizes
bull Initializes spring beans and ConfiguredBeanrsquos
bull Inject dependencies (Resource)
How Asinus Initalizes
bull Executes Initialize annotated methods
bull Executes SimpleJob and CronJob annotated jobs
Asinus Components
bull CORE COMPONENTS ndash Not pluggable
RequestHandler
ModuleController
ProtocolHandler
ExecutionManager
Request Processors
Response Processors
Asinus Components
bull PLUGGABLE COMPONENTS ndash Pluggable
ConfigurationManagerCacheManagerInMemoryCacheManagerSessionManagerCookieManagerHeaderManagerSanitizerDeviceManagerRequestContextSummaryHolderResourceManagerPerformanceManagerResponseToDeviceAdapterTemplateSelectorSecurityManagerAuthenticationManagerOpenIdAuthenticationManagerFacebookAuthenticationManageri18NManagerhellip
How to Plug any Component bull Implement the Component Interface
ie CacheManagerConfigurationManager
bull Define in ldquoasinuspropertiesrdquo
asinuscacheManager=myCacheManager
Asinus Components
Request Lifecycle RequestContext
bull Holds request information
bull Propogates through all layers
RequestContext
bull RequestContext Summary is bind to ThreadLocalInject RequestContextSummaryHolder component
bull Attributes contextRootmodemoduleactionpathInfooriginalPathInfocookiesrequestCookiesrequestParametersattributeshostnamemachineinstancelocaleuserdeviceuseragentheadersrefererxforwardedformimeRequestmodelBeanmodelBeanValidationErrorshellip
RequestContextAttributes
bull From Action Controller public class ViewActionController implements BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
boolean paramA = requestgetRequestContext()getRequestParameters()
getRequestParamaterValueAsBoolean(a)
String cookieValueA = requestgetRequestContext()
getRequestCookies()get(a)getValue
String clientAddress = requestgetRequestContext()getRemoteAddress()
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
How Asinus Initalizes
bull Initializes spring beans and ConfiguredBeanrsquos
bull Inject dependencies (Resource)
How Asinus Initalizes
bull Executes Initialize annotated methods
bull Executes SimpleJob and CronJob annotated jobs
Asinus Components
bull CORE COMPONENTS ndash Not pluggable
RequestHandler
ModuleController
ProtocolHandler
ExecutionManager
Request Processors
Response Processors
Asinus Components
bull PLUGGABLE COMPONENTS ndash Pluggable
ConfigurationManagerCacheManagerInMemoryCacheManagerSessionManagerCookieManagerHeaderManagerSanitizerDeviceManagerRequestContextSummaryHolderResourceManagerPerformanceManagerResponseToDeviceAdapterTemplateSelectorSecurityManagerAuthenticationManagerOpenIdAuthenticationManagerFacebookAuthenticationManageri18NManagerhellip
How to Plug any Component bull Implement the Component Interface
ie CacheManagerConfigurationManager
bull Define in ldquoasinuspropertiesrdquo
asinuscacheManager=myCacheManager
Asinus Components
Request Lifecycle RequestContext
bull Holds request information
bull Propogates through all layers
RequestContext
bull RequestContext Summary is bind to ThreadLocalInject RequestContextSummaryHolder component
bull Attributes contextRootmodemoduleactionpathInfooriginalPathInfocookiesrequestCookiesrequestParametersattributeshostnamemachineinstancelocaleuserdeviceuseragentheadersrefererxforwardedformimeRequestmodelBeanmodelBeanValidationErrorshellip
RequestContextAttributes
bull From Action Controller public class ViewActionController implements BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
boolean paramA = requestgetRequestContext()getRequestParameters()
getRequestParamaterValueAsBoolean(a)
String cookieValueA = requestgetRequestContext()
getRequestCookies()get(a)getValue
String clientAddress = requestgetRequestContext()getRemoteAddress()
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
How Asinus Initalizes
bull Executes Initialize annotated methods
bull Executes SimpleJob and CronJob annotated jobs
Asinus Components
bull CORE COMPONENTS ndash Not pluggable
RequestHandler
ModuleController
ProtocolHandler
ExecutionManager
Request Processors
Response Processors
Asinus Components
bull PLUGGABLE COMPONENTS ndash Pluggable
ConfigurationManagerCacheManagerInMemoryCacheManagerSessionManagerCookieManagerHeaderManagerSanitizerDeviceManagerRequestContextSummaryHolderResourceManagerPerformanceManagerResponseToDeviceAdapterTemplateSelectorSecurityManagerAuthenticationManagerOpenIdAuthenticationManagerFacebookAuthenticationManageri18NManagerhellip
How to Plug any Component bull Implement the Component Interface
ie CacheManagerConfigurationManager
bull Define in ldquoasinuspropertiesrdquo
asinuscacheManager=myCacheManager
Asinus Components
Request Lifecycle RequestContext
bull Holds request information
bull Propogates through all layers
RequestContext
bull RequestContext Summary is bind to ThreadLocalInject RequestContextSummaryHolder component
bull Attributes contextRootmodemoduleactionpathInfooriginalPathInfocookiesrequestCookiesrequestParametersattributeshostnamemachineinstancelocaleuserdeviceuseragentheadersrefererxforwardedformimeRequestmodelBeanmodelBeanValidationErrorshellip
RequestContextAttributes
bull From Action Controller public class ViewActionController implements BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
boolean paramA = requestgetRequestContext()getRequestParameters()
getRequestParamaterValueAsBoolean(a)
String cookieValueA = requestgetRequestContext()
getRequestCookies()get(a)getValue
String clientAddress = requestgetRequestContext()getRemoteAddress()
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Asinus Components
bull CORE COMPONENTS ndash Not pluggable
RequestHandler
ModuleController
ProtocolHandler
ExecutionManager
Request Processors
Response Processors
Asinus Components
bull PLUGGABLE COMPONENTS ndash Pluggable
ConfigurationManagerCacheManagerInMemoryCacheManagerSessionManagerCookieManagerHeaderManagerSanitizerDeviceManagerRequestContextSummaryHolderResourceManagerPerformanceManagerResponseToDeviceAdapterTemplateSelectorSecurityManagerAuthenticationManagerOpenIdAuthenticationManagerFacebookAuthenticationManageri18NManagerhellip
How to Plug any Component bull Implement the Component Interface
ie CacheManagerConfigurationManager
bull Define in ldquoasinuspropertiesrdquo
asinuscacheManager=myCacheManager
Asinus Components
Request Lifecycle RequestContext
bull Holds request information
bull Propogates through all layers
RequestContext
bull RequestContext Summary is bind to ThreadLocalInject RequestContextSummaryHolder component
bull Attributes contextRootmodemoduleactionpathInfooriginalPathInfocookiesrequestCookiesrequestParametersattributeshostnamemachineinstancelocaleuserdeviceuseragentheadersrefererxforwardedformimeRequestmodelBeanmodelBeanValidationErrorshellip
RequestContextAttributes
bull From Action Controller public class ViewActionController implements BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
boolean paramA = requestgetRequestContext()getRequestParameters()
getRequestParamaterValueAsBoolean(a)
String cookieValueA = requestgetRequestContext()
getRequestCookies()get(a)getValue
String clientAddress = requestgetRequestContext()getRemoteAddress()
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Asinus Components
bull PLUGGABLE COMPONENTS ndash Pluggable
ConfigurationManagerCacheManagerInMemoryCacheManagerSessionManagerCookieManagerHeaderManagerSanitizerDeviceManagerRequestContextSummaryHolderResourceManagerPerformanceManagerResponseToDeviceAdapterTemplateSelectorSecurityManagerAuthenticationManagerOpenIdAuthenticationManagerFacebookAuthenticationManageri18NManagerhellip
How to Plug any Component bull Implement the Component Interface
ie CacheManagerConfigurationManager
bull Define in ldquoasinuspropertiesrdquo
asinuscacheManager=myCacheManager
Asinus Components
Request Lifecycle RequestContext
bull Holds request information
bull Propogates through all layers
RequestContext
bull RequestContext Summary is bind to ThreadLocalInject RequestContextSummaryHolder component
bull Attributes contextRootmodemoduleactionpathInfooriginalPathInfocookiesrequestCookiesrequestParametersattributeshostnamemachineinstancelocaleuserdeviceuseragentheadersrefererxforwardedformimeRequestmodelBeanmodelBeanValidationErrorshellip
RequestContextAttributes
bull From Action Controller public class ViewActionController implements BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
boolean paramA = requestgetRequestContext()getRequestParameters()
getRequestParamaterValueAsBoolean(a)
String cookieValueA = requestgetRequestContext()
getRequestCookies()get(a)getValue
String clientAddress = requestgetRequestContext()getRemoteAddress()
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
How to Plug any Component bull Implement the Component Interface
ie CacheManagerConfigurationManager
bull Define in ldquoasinuspropertiesrdquo
asinuscacheManager=myCacheManager
Asinus Components
Request Lifecycle RequestContext
bull Holds request information
bull Propogates through all layers
RequestContext
bull RequestContext Summary is bind to ThreadLocalInject RequestContextSummaryHolder component
bull Attributes contextRootmodemoduleactionpathInfooriginalPathInfocookiesrequestCookiesrequestParametersattributeshostnamemachineinstancelocaleuserdeviceuseragentheadersrefererxforwardedformimeRequestmodelBeanmodelBeanValidationErrorshellip
RequestContextAttributes
bull From Action Controller public class ViewActionController implements BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
boolean paramA = requestgetRequestContext()getRequestParameters()
getRequestParamaterValueAsBoolean(a)
String cookieValueA = requestgetRequestContext()
getRequestCookies()get(a)getValue
String clientAddress = requestgetRequestContext()getRemoteAddress()
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Request Lifecycle RequestContext
bull Holds request information
bull Propogates through all layers
RequestContext
bull RequestContext Summary is bind to ThreadLocalInject RequestContextSummaryHolder component
bull Attributes contextRootmodemoduleactionpathInfooriginalPathInfocookiesrequestCookiesrequestParametersattributeshostnamemachineinstancelocaleuserdeviceuseragentheadersrefererxforwardedformimeRequestmodelBeanmodelBeanValidationErrorshellip
RequestContextAttributes
bull From Action Controller public class ViewActionController implements BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
boolean paramA = requestgetRequestContext()getRequestParameters()
getRequestParamaterValueAsBoolean(a)
String cookieValueA = requestgetRequestContext()
getRequestCookies()get(a)getValue
String clientAddress = requestgetRequestContext()getRemoteAddress()
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
RequestContext
bull RequestContext Summary is bind to ThreadLocalInject RequestContextSummaryHolder component
bull Attributes contextRootmodemoduleactionpathInfooriginalPathInfocookiesrequestCookiesrequestParametersattributeshostnamemachineinstancelocaleuserdeviceuseragentheadersrefererxforwardedformimeRequestmodelBeanmodelBeanValidationErrorshellip
RequestContextAttributes
bull From Action Controller public class ViewActionController implements BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
boolean paramA = requestgetRequestContext()getRequestParameters()
getRequestParamaterValueAsBoolean(a)
String cookieValueA = requestgetRequestContext()
getRequestCookies()get(a)getValue
String clientAddress = requestgetRequestContext()getRemoteAddress()
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
RequestContextAttributes
bull From Action Controller public class ViewActionController implements BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
boolean paramA = requestgetRequestContext()getRequestParameters()
getRequestParamaterValueAsBoolean(a)
String cookieValueA = requestgetRequestContext()
getRequestCookies()get(a)getValue
String clientAddress = requestgetRequestContext()getRemoteAddress()
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
RequestContextAttributes
bull From Asinus Filters ConfiguredBean
public class URLCollectPopFilter implements ModuleControllerPreFilter
public int getOrder()
return HIGHEST_PRECEDENCE + 30
public Object preExecute(RequestContextExtended requestContext)
Mode mode = requestContextgetMode()
String module = requestContextgetModuleAndAction()getModuleName()
String action = requestContextgetModuleAndAction()getActionName()
String headerA = requestContextgetHeaders()get(a)
hellip
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
RequestContextSummary Holder
ConfiguredBean
public class CustomerServiceImpl implements CustomerService
Resource
RequestContextSummaryHolder requestContextSummaryHolder
public void service()
String sessionId = requestContextSummaryHolder
getSessionId()
Locale locale = requestContextSummaryHoldergetLocale()
long userId = requestContextSummaryHoldergetUserId()
hellip
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Asinus URLs
bull Search Engine Friendly URLs
hWeatherviewcityIstanbulday23hour
bull Supports mode switches (mode changes)
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Asinus URLs
Asinus URL Syntax modemoduleNameactionNameparamNamevalue_sid=valueamp_lang=tr_TR
ldquoMode means response formatldquo
Examples hWeatherviewcityIstanbulday23hour (html)
bWeatherviewcityIstanbul_sid=123 (binary)
jWeatherviewcityIstanbul_sid=123 (json)
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Response Modes
Just change the response mode
Look at the change in output
Html mode
Request hWeatherviewcityIstanbul
Response
lthtmlgt
ltheadgt lttitlegtAsinus ShowCaselttitlegt ltheadgt
ltbody style=width100height100gt
ltpgtltfontgtweather Rainyltfontgtltpgtltbodygtlthtmlgt
Json mode
Request jWeatherviewcityIstanbul
Response
ldquoweatherrdquoRainy
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Response modes supported
Html h
JSON j
Binary b
Xml x
Rss r
Xdime d (for mobile devices)
Paylist p (for iphone clients)
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Makro URLBuilder
bull Use URLBuilder makro to generate Asinus URLs in ftlrsquos
bull URLBuilder makro does -URLRewrite for cookie disabled devices
httphelliphPageindex_sid=12amp_lang=tr_TR
-Generates CSRF protected links
httphPageindex_h=12345
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Makro URLBuilder
Usage
[urlBuilder mode=HTML module=ldquoWeather action=ldquoviewldquo city=ldquoIstanbulrdquo month=ldquo4rdquo day=ldquo23rdquo]
Generates
httphWeatherviewcityIstanbulmonth3day23
Generates for cookie disabled devices
httphWeatherviewcityIstanbulmonth3day23_sid=123amp_lang=123
Generates if csrf protection for action ldquoviewrdquo is on
httphWeatherviewcityIstanbulmonth3day23_h=123
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Irregular Asinus URLs
bull You can also use irregular asinus urls
Example weatherIstanbul bull Map irregular urls in configurationltentry name=weather$1gthWeatherviewcity$1ltentrygt
ltentry name=logingthLoginloginltentrygt
ltentry name=profilePage$1gthMessagesmessageuserId$1
ltentrygt
ltentry name=$mode-$module-$actiongt$mode$module$action
ltentrygt
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
CSRF Protection
bull Protection Against CSRF attacks (Cross Site Request Forgery)
bull Protected URLs can not be shared (and bookmarked)
Can not be used in different sessions
hPageindex_h=6751241894614
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
CSRF Protectionbull Turn ldquoCsrf protectionrdquo on from configuration
(asinus-configxml)ltparam name=controllerprotocolHandlerenableCSRFProtectiongttrue
ltparamgt
bull Mark module and action as csrf protected at module configuration (ltmoduleNamegt-configxml)
ltparam name=csrfProtectedActionsgt
ltlistgt
ltitemgtsaveltitemgt
ltlistgt
ltparamgt
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
ABTestingbull A method of Marketing Testingbull Change any variable
Watch changes in customer behavioursbull Maximize profits
ABTest Example
Show 10 of customer food ads
Show 90 of customer film ads
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
ABTesting
bull Implement your matcher class
bull Copy your module as ABltModuleNamegt
bull Implement new ABModule
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
ABTesting
bull Matcher class
public class RequestParameterABMatcher implements ABMatcher
public boolean matcher(RequestContext requestContext
String module String action)
if(ldquoabtestequalsIgnoreCase(
requestContextgetRequestParameters()
getRequestParamaterValue(mod)))
return true
else
return false
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Finding Module And Action
1 Check ABMatchershttphpageindex Mapped To --gt
ldquoABPagerdquo module
ldquoIndexActionControllerrdquo action
(In case any Matcher matches the request)
2Check Naming Conventionhttphpageindex Mapped To --gt
ldquoPagerdquo module
ldquoIndexActionControllerrdquo action
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Finding Module And Action
3Check URLMapping annotation Module class
URLMapping(ldquomainrdquo) Regular Expression is also accepted
public class PageModule extends BasicModule
hellip
Action class
URLMapping(ldquoindexrdquo) Regular Expression is also accepted
public class ViewActionController extends BasicActionController
hellip
httphmainindex Mapped To --gtldquoPagerdquo module ldquoViewActionControllerrdquo action
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Module Hierarchy
bull Express static module dependencies
with Depends
bull Dependent Modules are executed in parallel
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Module Hierarchy
Example
Depends(hWeatherViewhLocationView)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ModuleResponse dependentModuleOutput =
requestgetDependentModuleOutput(hWeatherView)
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Module Hierarchy(ftl level)
bull Use module makro
bull Dependent modules can be executed in parallel
Example
[ftl]
[module name=Module1 action=ldquoview]
[module name=Module2 action=ldquoview parallel=true]
[module name=Module3 action=ldquoview]
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Parallel Execution
1-With Depends
2-Module makro
2-With Asynch
3-With ThreadPoolManager component
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Asynch
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Implement in different class
Proxy rule
bull Can define Callback class
If needed
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Asynch
Example
ConfiguredBean
public class MyService
Asynch(callback=asinusCallback)
public String logAsynch(ModuleRequest request)
return logged asynch
ConfiguredBean
public class Callback implements AsynchCallback
public void callback(Object result Object inputArguments)
public void callbackOnThrowable(Throwable throwableObject inputArguments)
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
ThreadPoolManager
bull Uses Java Concurrency API
Configure thread pool size in asinus-configxmlltparam name=componentthreadPoolManagerthreadSizegt200ltparamgt
bull Used with Runnablersquos or Callablersquos classes
bull Inject ThreadPoolManager and use
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
ThreadPoolManagerExample
ConfiguredBean
public class MyService
Resource
private ThreadPoolManager threadPoolManager
public void service()
Future future = threadPoolManagersubmit(
new Runnable()
public void run() Systemoutprintln(Running paralel job) )
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Error amp Exception Handling
bull Show user friendly pages
Http 404 500 hellip error codes is not good
bull or Call another module
Instead of showing ldquoweather modulerdquo
show ldquonewsrdquo module
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Error amp Exception Handling
bull Implement ldquoErrorViewActionControllerrdquo for modules
Asinus executes this if available
bull Implement ldquoErrorrdquo Module
Common exception handling for modules here
bull Or define redirect URL for Exceptions ltparam name=controllerrequestHandlerdefaultErrorRedirectURLgt
httpwwwfootbocomltparamgt
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
PerformanceMeasuring
bull Asinus calculates performance for modules
Calculates min max average standart deviation
You can monitor from Admin Console
bull You can also make your code block be measuredpublic class SampleActionController extends BasicActionController
Resource
private PerformanceManager performanceManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
long startTime = SystemcurrentTimeMillis()
ViewModel viewModel = new ViewModel(test)
viewModelput(testKey Test Value)
performanceManageraddPerformanceInfo(ldquoNewBlock
SystemcurrentTimeMillis() - startTime)
return viewModel
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
PerformanceMeasuring
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Logging
bull SL4J is used
You can use other implementations jdk nop simple jcl hellip
bull Asinus logs some useful data (debug level)
You can change log level from Admin Consolebull Debuging at Production Environment is
possible
No need to change debug level
httphPageindex_debug=true
Define IPs from configuration which are able to debug
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Logging
bull Use AsinusLoggerFactory to log
ConfiguredBean
public class AsinusLoggerTest
Resource
private AsinusLoggerFactoryInterface asinusLoggerFactory
protected AsinusLogger asinusLogger
Initialize public void initialize()
asinusLogger = asinusLoggerFactorygetLogger(getClass())
public void test()
asinusLoggerdebug(debug)
asinusLoggererror(ldquoResource AsinusExceptionERROR error message with some parameters firstParameter secondParameter thirdParameter )
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
ConfigurationManagement
bull Configuration files env-configxml environment definition (where am I)asinus-configxml asinus configurationshared-configxml shared configuration for modulesltmoduleNamegt-configxml any modul configuration
bull Supports Inheritance (Extendable)
-ldquoDefaultrdquo asinus configuration is extendable for other environments
Examples ldquoTESTrdquo ldquoPRODrdquo ldquo1010210130rdquo ldquoen_ENrdquo ldquoBELARUSrdquo
- ldquosharedrdquo module configuration is extendable for other modules Examples ldquoshared-configxmlrdquo ldquoweather-configxmlrdquo ldquopage-configxmlrdquo ldquolocation-configxmlrdquo
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
ConfigurationManagement
ltxml version=10 encoding=UTF-8 gt
ltserverConfigurationgt
ltproperty path=resourcesconfigproperties gt
ltconfiguration name=DEFAULTgt
ltglobalgt
ltparam name=ldquolog4j_URLgtdatalog4jltparamgt
ltparam name=componentprotocolHandlerfileUploadgt ltmapgt ltentry name=tempDirectoryldquogtdatatempltentrygt ltentry name=ldquosizeThresholdldquogt1200ltentrygt ltmapgt ltparamgt
ltglobalgt ltconfigurationgt
ltconfiguration name=ldquoPRODgt ltglobalgt ltparam name= log4j_URL gtdatalogsltparamgt ltglobalgt ltconfigurationgtltserverConfigurationgt
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
ConfigurationManagement
bull Supports importing property filesltproperty path=resourcesconfigproperties gt
bull Can be changed at Runtime Implement ldquoConfigurationAwarerdquo Interface
ConfiguredBean
public class PopService implements ConfigurationAware private boolean popUrls = false public void atConfigurationChange() popUrls = configurationManager getValueAsBoolean(controllerprotocolHandlercollectURLsenabledfalse)
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
ConfigurationManagement
public interface ConfigurationManager
to get config from asinus-configxml
String getValueAsString(String key)
ListltStringgt getValueAsList(String key)
MapltString Stringgt getValueAsMap(String key)
to get config from module configuration
String getValueAsStringForModule(String moduleName String key)
ListltStringgt getValueAsListForModule(String moduleNameString key)
MapltString Stringgt getValueAsMapForModule(String moduleNameString key)
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Cachingbull Default Cache Memcached
Distributed fast Scalable (More memcached servers can be added at runtime)
Internal Use Cases -Session store(Non sticky sessions supported)
-Cache amp CacheFlush
-Hibernate Cache
-Caching module outputs
bull Default In Memory Cache Ehcache
Inmemory fast
Internal Use Cases -internationalization
bull NearCache(L1L2 cache)
L1 Memcached L2 Ehcache
Faster and Safer (Data Consistancyno data loss)
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Caching
bull CacheManager is pluggable -Can implement your own (coherenceterracotahazelcasthellip)
-Can switch between implementations from configuration
(asinus-customproperties)asinusinMemoryCacheManager=hashMapCacheManager
asinuscacheManager=ehCacheManager
bull Can configure each cache implementation
Project requirements
bull Can manage user caches in different domain2 cache domain is available COMMON(CLUSTERED) and USER
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Caching
bull Module outputs are cached if needed public class WeatherModule extends BasicModule
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
bull Use Cacheable amp CacheFlush Cacheable
public String doWork(int id)hellip
bull Use CacheManagerrsquos
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Cachingpublic class SomeActionController extends BasicActionController
Resource
private CacheManager cacheManager
Resource
private CacheManager inMemoryCacheManager
public ViewModel execute(ModuleRequest request ModuleResponse response)
CacheReference cacheReference = cacheManagergetCache(testldquo
CacheTypeCLUSTERED)
CacheReference inMemoryCacheReference = inMemoryCacheManagergetCache
(testldquo CacheTypeCLUSTERED)
cacheReferenceput(object1 This is a test)
inMemoryCacheReferenceput(object1 This is also a test)
String object1 = (String)cacheReferenceget(object1)getValue()
return new ViewModel(ldquoviewrdquo)
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
SessionManagement
bull HttpSession is not used
-Asinus Session Object stored in Memcached
-Non sticky sessions are supported
bull Cookie support is not a must for sessions
First request redirects to check cookie support
httphPageindex_sid=123
bull Sessions are created when needed
-Because of performance reasons
-SessionManagersetAttribute(hellip) initiates the Session
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
SessionManagement
ConfiguredBean
public class MyService
Resource
private SessionManager sessionManager
public void handleSessionAttribute(RequestContext requestContext)
String attribute = (String)sessionManagergetAttribute(requestContext attribute) if(attribute == null)
sessionManagersetAttribute(requestContext attribute attributeValue)
hellip
sessionManagerremoveAttribute(requestContext attribute)
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
CookieManager
bull Cookies created are secure
Cookie values are sanitized
bull Can create encrypted cookies
You dont need to encrypt decrypt
bull No need to read Cookie spec
-Cookie domain path secure parameters are set
-Cookie size restrictions are applied
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
CookieManagerConfiguredBean
public class MyService
Resource
private CookieManager cookieManager
public void handleAndCreateCookies(RequestContext requestContext)
cookieManagercreateCookie(requestContextcookieName cookieValue)
cookieManagercreateEncryptedCookie(requestContext cookieName cookieValue)
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
HeaderManager
bull Headers created are secureHeader values are sanitized
ConfiguredBean
public class MyService
Resource
private HeaderManager headerManager
public void createHeaders(RequestContext requestContext)
headerManagercreateHeader(requestContextldquoheaderName cookieValue)
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Internationalization
bull Use I18NManagerLocale dependent messagemoneydatenumberpercentage
can be formatted
bull Use i18n_properties files for messagesi18n_trproperties
welcome=Hoşgeldin
welcomeP=0 Hoşgeldin
i18n_enproperties
welcome=Welcome
welcomeP=Welcome 0
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Internationalizationbull Configure locale from asinus configuration ltparam name=componenti18nlanguagegtenltparamgt
ltparam name=componenti18ncountrygtGBltparamgt
bull Usage public class ViewActionController extends BasicActionController
Resource I18NManager i18nManager public ViewModel execute(ModuleRequest request ModuleResponse response) String message = i18nManagergetMessage(key) String currency = i18nManagerdisplayCurrency(currency) String money = i18nManagerdisplayMoney(money) String number = i18NManagerdisplayNumber(number) return new ViewModel(ldquoview)
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Internationalization
bull Internationalization for template files
(ie ftlrsquos)Template Selector also considers Locale info when selecting a
template
Locale tr_TR index_tr_TRftl
Locale en_GB index_en_GBftl
Default indexftl
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Resource Management
bull Component ResourceManager
bull Calculates Module timeoutrsquos and exception ratiorsquos
bull Can decide to ldquoturn offrdquo modules at runtimeTo protect the application
bull Configure ldquoturn offrdquo rulesltparam
name=ldquocomponentresourceerrorErrorRatioToMakeResourceClose_Percentagegt10ltparamgt
hellip
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Resource Management
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
MCS
bull Volantis MCS is used for device based rendering
Supports thousands of devices
bull MCS only accepts XDIME2 formatMay return WMLXHTMLHTML According to device which is making the request
bull Asinus Mode should be ldquodrdquo (xdime2 mode)dPageindex
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
MCS Configuration
bull MCS Servers should be configured In asinus-configxml ltparam name=componentdeviceadaptermcshostgtipltparamgt
ltparam name=componentdeviceadaptermcsportgtportltparamgt
bull DeviceManager should be set to MCSDeviceManager
In asinus-customproperties asinusdeviceManager=mcsDeviceManager
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
MCSRequest dPageindex
indexftl (as XDIME2)
ltdiv style=mcs-containerheaderRegion class=headerRegiongt
ltdiv style=mcs- layoutcomturkcellturkcellimmodulebrandmcsbrandmlytgt
ltdiv style=mcs-containerpane class=brandgt
ltobject style=vertical-alignbottom src=$staticUrlDeviceSpecific(imageslogogifMainPageModule)
mcs-media-style=integralgt
ltparam name=mcs-transcode value=false gt
ltspangtTurkcellimltspangt
ltobjectgt
ltdivgt ltdivgt ltdivgt
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
MCSDeviceManager
bull Provides Device info Device category Device subcategory
Via Call MCS Http API (as a service)
bull Asinus Template Selector Templates are selected according to Device and Category
info
Device(none) indexftl
Category(advancedlow) index_c_advancedlowftl
Category(basicgrey) index_c_basicgreyftl
Device(Nokia N70) index_d_N70ftl
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Asinus SecurityApproach
bull Sanitizer-Sanitize request parameterscookie and header valuesredirect URLs
-Off by default
-Against XSSSQLInjection attacks
String secureParameterValue = requestContextgetRequestParameters()
getRequestParameterValues(ldquokeyrdquo)get(0)getValueSecure()
bull CSRF Protection-Against Cross site request forgery attacks
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Asinus SecurityApproach
bull Encode macro-Encodes htmlhtml attributecssjavascriptxmlxml attribute data
-Against XSSSQLInjection hellip attacks
[encode type=html input=ltscriptgt] ampltscriptampgt
[encode type=ldquocss input=ltscriptgt] 3c script3e hellip
bull Encoder class-Same functionality as encoder macro
-Used from java
EncodergetInstance()encodeForHTML(input)
EncodergetInstance()encodeForURLinput) hellip
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Authorization amp Autentication
bull Basic Autentication Remember me
bull OpenId Authentication
bull Facebook Connect Authentication
bull Authentication for mobile devices
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Authorization amp Autentication
Basic AuthenticationEasy to use
Security flow is Implemented as Asinus Filter
1define secure pages in module configurationltparam name=securityviewgt
ltmapgt
ltentry name=ldquohgtrole1role2ltentrygt
ltentry name=ldquojgtrole3ltentrygt
ltmapgt
ltparamgt
2define login URL in asinus configurationltparam name=componentsecurityloginURLgtloginltparamgt
3Implement AuthenticationManager Interface loadUser()
getHash()
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Asinus Filters
bull Asinus Filters -Intercepts all requests
-Type pre post
-Ordered
-You can redirectforwardchange request params inject and use any
componenthellip
-Built-in filters Security FilterLogger FilterURLCollectPush Filter
URLCollectPop FilterMCS Filter
bull Asinus Module Filters-Intercepts only one module
-Type pre post
-you can do whatever yo do as in Asinus Filters
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Asinus FiltersConfiguredBean
public class SecurityFilter implements ModuleControllerPreFilter
Resource
private SecurityManager securityManager
public Object preExecute(RequestContextExtended requestContext)
return securityManagerdoAuthenticateAuthorize(requestContext)
public int getOrder()
return HIGHEST_PRECEDENCE
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Asinus FiltersConfiguredBean
public class MyModule extends BasicModule
protected boolean preFilter(ModuleRequest request ModuleResponse response)
requestgetRequestContext()addAttribute(preFilter PreFilter was here) return false
protected boolean postFilter(ModuleRequest requestModuleResponse response ViewModel viewModel)
viewModelput(postFilter postfilter was here)
return false
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Data Access Supportbull Built-in supportJDBCAccessObject
HibernateAccessObject
bull Can use Spring Data Access supportSpring JDBC
Hibernate
IBATIS
Others(Jdotoplink)
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Webservice Supportbull Apache CXF is used ltservletgt ltservlet-namegtCXFServletltservlet-namegt
ltservlet-classgtorgapachecxftransportservletCXFServletltservlet-classgt
ltservletgt
ltservlet-mappinggt ltservlet-namegtCXFServletltservlet-namegt
lturl-patterngtwslturl-patterngt
ltservlet-mappinggt
bull Use Webservice annotation
WebService
public interface HelloWorldWebservice String sayHi(String text)
ConfiguredBean
WebService(endpointInterface = ldquoasinusHelloWorldWebservice)
public class HelloWorldWebserviceImpl implements HelloWorldWebservice
public String sayHi(String text) return Hello + text
ltjaxwsendpoint id=helloWorldWebservice implementor=asinus HelloWorldWebserviceImpl address=HelloWorldWSgt
ltjaxwsendpointgt
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Webservice Client Support
bullGenerate client code-run Asinus-Toolsapache-cxf-226binwsdl2javabat
Example
wsdl2java -p asinuswebservice TurkcellOpenIdWsdlxml
bullHow to call a webservice from clientJaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean() factorysetWsdlLocation(location to wdsl file) factorysetServiceClass(GeneratedServiceclass) factorysetServiceName(GeneratedServiceSoapSERVICE) factorysetEndpointName(GeneratedServiceSoapGeneratedServiceSoapPort) GeneratedService generatedService = (GeneratedService) factorycreate()
String result = generatedServicesampleMethod(some text)
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
REST API Support
Asinus Supports All http Methods GETPOSTPUTDELETEOPTIONSHEAD
1Implement methods in your ActionController public ViewModel executeGet(ModuleRequest requestModuleResponse response)public ViewModel executePost(ModuleRequest requestModuleResponse response)public ViewModel executeDelete(ModuleRequest requestModuleResponse response) hellip
2Use ldquo_methodrdquo parameterTo hit Put Delete Options Head methods from your html forms
ltform action=[urlBuilder module=Page action=rest mode=HTML params=] method=postgt ltinput type=text id=textField name=textField value= gt ltinput type=hidden id=_method name=_method value=PUT gt ltinput type=submit value=Submit gt ltformgt
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
File Upload Support
bull Apache Commons FileUpload is used
bull Configure upload parametersltparam name=componentprotocolHandlerfileUploadgt ltmapgt
ltentry name=sizeThresholdInBytesgt102400ltentrygt
ltentry name=maxFileSizeInBytesgt1024000ltentrygt
ltentry name=maxRequestSizeInBytesgt1024000ltentrygt
ltentry name=tempDirectorygtddevtempltentrygt ltmapgt
ltparamgt
bull File Items are bind to RequestContext
FileItem fileItem = requestContext()getRequestParameters()getFileItem(ldquofileName)
bull Combined amp Works with Module MVC Binding amp Validation APIUpload Exceptions can be viewed as validation errors in ftls
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Captcha Support
bull Captcha Example
public class CaptchaActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
Captcha captcha = new CaptchaBuilder(170 50)addText()gimp()addNoise()build()
sessionManagersetAttribute(requestgetRequestContext()captchaldquocaptchagetAnswer())
ByteArrayOutputStream output = new ByteArrayOutputStream(captchagetImage()getWidth()
captchagetImage()getHeight())
try
ImageIOwrite(captchagetImage()png output)
catch (IOException e)
throw new AsinusException(eAsinusExceptionERROR)
responsesetOutput(outputtoByteArray())
return null
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Job Scheduling Support
bull Quartz is used
bull Supports SimpleJob(repeatIntervalstartDelayrepeatCountinterceptorNames)
CronJob (cronExpression (Oumlrnek 05 ) interceptorNames)
bull Can be monitored from Admin console
bull You can add and run job at runtimeNo need for restart
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Job Scheduling Support
ConfiguredBean
public class JobDemo
SimpleJob(repeatInterval = 10000)
public void job1()
asinusLoggerinfo(Hello from Job1)
CronJob(cronExpression = 05 )
public void job2()
asinusLoggerinfo(Hello from Job2)
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Module MVCbull Request
hPageindex jPageindex dPageindex pPageindex hellip
bull PageModulepublic class PageModule extends BasicModule
bull IndexActionController public class IndexActionController extends BasicActionController public ViewModel execute(ModuleRequest request ModuleResponse response) ViewModel viewModel = new ViewModel(ldquoindexrdquo) viewModelput(ldquocustomerrdquonew Customer(ldquocustomerNamerdquo)) return viewModel
bull Rendered Views indexftl (hd modes) no view (j mode) indexptl(p mode)
p mode iphone paylist mode
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Module Class public class WeatherModule extends BasicModule
Override
public CacheInfo getCacheKey(ModuleRequest request String actionId)
return supergenerateDefaultCacheKey(request actionId)
Override
protected boolean postFilter(ModuleRequest request ModuleResponse response
ViewModel viewModel)
return false
Override
protected boolean preFilter(ModuleRequest request ModuleResponse response)
return false
hellip
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Action Class
public class IndexActionController extends BasicActionController
public ViewModel execute(ModuleRequest requestModuleResponse response)hellip
Override
ViewModel executePost(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeGet(ModuleRequest request ModuleResponse response)hellip
Override
ViewModel executeDelete(ModuleRequest request ModuleResponse response)hellip
hellip
Override
protected Object formBackingModelObject(ModuleRequest request)hellip
Override
public long getTimeout(ModuleRequest request)
hellip
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Action ClassForward amp Include
bull Forward public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
forward(request Module1 ldquoquery ModeHTML) null)
return null
bull Includepublic class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request ModuleResponse response)
include(request Module1 ldquoget ModeHTML null)
include(request Module2 ldquoquery ModeHTML null)
ViewModel viewModel = new ViewModel(someModel)
return viewModel
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Action ClassCalling Other Modules
Call
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(someModel)
String output = (String) call(request Module1 ldquoget ModeHTML null)
viewModelput(outputrdquo output)
return viewModel
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Redirect
bull Redirect in Filters (or ActionControllers)requestContextsetRedirectURL(redirectURL)
bull Redirect in ActionControllersViewModel viewModel = new
ViewModel(redirecthttpwwwgooglecom)
bull Use URLPathGenerator component to generate Asinus Urls and Irregular Asinus Urls to redirect
ldquoFor UrlRewrite support + CsrfProtection supportrdquo
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Freemarker
Request parameters from ftl $request[name]default()
$request[addressaddress]default()
Session Attributes from ftl $session[toFTL]default()
$session[customeraddressaddress]default()
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Freemarker Makrorsquos
Ftl makroPut your macro in ldquoresourcesmacrosrdquo
dateFormatterftl
ltmacro formatDate dategthellipltmacrogt
Usageftl
ltspan class=bubbleTimegt
ltdateFormattermacroformatDate date=updateDategt
ltspangt
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Freemarker Makrorsquos
Java MacroMake it ConfiguredBean
ConfiguredBean
public class ImageUrl implements TemplateMethodModel hellip
Usageftl ltimg src=$imageUrl($panomiUsermultimediaContentpath
aaaaa) gt
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Freemarker Makrorsquos
Built-in Macros Checkbox
Radio
Encode
EncodeAsFunction
I18n
ImageUrl
Urlbuilder
IrregularUrlBuilder
Module
StaticUrl
StaticUrlDeviceSpesific
McsLink
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Template Extension
bull Compile time extensionBuilt-in ldquoant taskrdquo is used
bull Can be used in any type of template Ftlxmlxdimecsshellip
indexftl
ltndash block --gtltdivgtAltdivgtlt-- endblock --gt
viewftl
lt-- extends indexftl --gt
lt-- block --gt ltdivgtBltdivgt lt-- endblock --gt
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Template Engine Support
bull Sitemesh is usedWeb Page Layout and Decoration Framework
httpwwwopensymphonycomsitemesh
Decoratorsxml
ltdecorators defaultdir=decoratorsgt
ltdecorator name=freemarker page=ldquodecoratorftlgt ltpatterngthPageviewltpatterngt
ltdecoratorgt
ltdecoratorsgt
decoratorftl
lthtmlgt
ltheadgt lttitlegtDecorated Title $titlelttitlegtDecorated Head $head ltheadgt
ltbodygtDecorated Body $bodyltbodygt
lthtmlgt
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Binding amp Validation API
bull Apache Commons BeanUtils is used for binding
Model(modelClass=ldquomodelCustomerallowedAttributes=disallowedAttributes=id)
public class ViewActionController extends BasicActionController
public ViewModel execute(ModuleRequest request
ModuleResponse response)
ViewModel viewModel = new ViewModel(bindingView)
return viewModel
protected Object formBackingModelObject(ModuleRequest request) Customer customer = new Customer()
customersetName(name)
customersetAddress(ldquoaddressrdquo)
return customer
bindingViewftl
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgtltinput type=text name=addressaddress value=$modeladdressaddressdefault()gtlttdgt
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Binding amp Validation API
bull JSR 303 Bean Validation API is used for validationHibernate Implementation is the default
Action Class
Model(modelClass=ldquoCustomerldquovalidate=truefailedActionName=viewrdquo)
ConfiguredBean
public class SaveActionController extends BasicActionController hellip
Model class
public class Customer implements Serializable
NotEmpty(message=Name alanı boş geccedililemezrdquo)
private String name
private String email
hellip
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Binding amp Validation API
bull You can write your own validator
public class PhoneNumberValidator implements ConstraintValidatorltMobileNumber Stringgt public void initialize(MobileNumber arg0) public boolean isValid(String mobileNumber ConstraintValidatorContext c) if((mobileNumber = null) ampamp (mobileNumberlength() == 10)) return true return false
bull Supports Multiform ValidationModel(modelClass=ldquoCustomervalidate=truefailedActionName=view
remove=falsegroups=FirstStepclass)
Model(modelClass=ldquoCustomervalidate=truefailedActionName=view remove=truegroups=SecondStepclass)
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Binding amp Validation APIltform action=Asinus-ShowcasehBindingsave method=postgt
lttablegt
lttrgt
lttdgtName lttdgt
lttdgtltinput type=text name=name value=$modelnamedefault()gtlttdgt
lttdgt [if errors[name]]
[list errors[name] as e]
ltspan style=colorredgt$edefault() - ltspangt
[list]
[if]
lttdgt
lttrgt
lttablegt
ltformgt
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Admin Console
Dynamic Module Loading
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Admin Console
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Admin Console
Configuration Reload
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Admin Console
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Admin Console
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
Asinus Roadmap
bull Version 21 (End of September 2010)-AB Testing Enhancements
-Performance Reporting
-Technical Enhancements
bull Version 22 (End of 2010)-Admin Console Enhancements
-Eclipse Plugin Enhancements
-OAuth Support
-Email Support
-Security Brute Force Attacks
-DB Based Configuration
QUESTIONS
QUESTIONS