asinus framework Özgür rahmi dönmez infrastructure

132
ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

Upload: clare-mcdowell

Post on 28-Dec-2015

235 views

Category:

Documents


7 download

TRANSCRIPT

Page 1: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 2: ASINUS FRAMEWORK Özgür Rahmi Dönmez 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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 3: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 4: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 5: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 6: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 7: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 8: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 9: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 10: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 11: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 12: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 13: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 14: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 15: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 16: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 17: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 18: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 19: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 20: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 21: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 22: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 23: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 24: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 25: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 26: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 27: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 28: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 29: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 30: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 31: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 32: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 33: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 34: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 35: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 36: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 37: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 38: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 39: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 40: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 41: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 42: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 43: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 44: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 45: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 46: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 47: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 48: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 49: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 50: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 51: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 52: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 53: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 54: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 55: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 56: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 57: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 58: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 59: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 60: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 61: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 62: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 63: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 64: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 65: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 66: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 67: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 68: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 69: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 70: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 71: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 72: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 73: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 74: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 75: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 76: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 77: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 78: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 79: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 80: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 81: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 82: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 83: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 84: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 85: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 86: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 87: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 88: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 89: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 90: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 91: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 92: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 93: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 94: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 95: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 96: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 97: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 98: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 99: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 100: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 101: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 102: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 103: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 104: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 105: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 106: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 107: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 108: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 109: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 110: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 111: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 112: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 113: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 114: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 115: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 116: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 117: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 118: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 119: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 120: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 121: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 122: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 123: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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

Email

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 124: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 125: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 126: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 127: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 128: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 129: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 130: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 131: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

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 FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS
Page 132: ASINUS FRAMEWORK Özgür Rahmi Dönmez Infrastructure

QUESTIONS

  • ASINUS FRAMEWORK
  • Asinus Documentation amp Forum
  • Asinus Eclipse Plugin Video
  • Asinus Projects
  • What is Asinus
  • What is Asinus (2)
  • Aim
  • Aim (2)
  • Why Asinus
  • Letrsquos Compare
  • Letrsquos Compare (2)
  • Development Times
  • Another Critical Question
  • High Level Architecture
  • Asinus as Web App Dev Framework
  • Asinus as Service Framework
  • Asinus Modules
  • Asinus Modules (2)
  • Package Structure Module Class
  • Slide 20
  • Package structure views
  • Package Structure Domain amp Repository Objects
  • Package structure MCS Content
  • Package structure Module Configuration
  • Package structure Static Content
  • Creating Modules
  • Eclipse Plugin
  • Eclipse Plugin (2)
  • Eclipse Plugin (3)
  • Eclipse Plugin (4)
  • Eclipse Plugin (5)
  • Asinus as Dependency Injection Framework
  • ConfiguredBean Resource
  • How Asinus Initalizes
  • How Asinus Initalizes (2)
  • Asinus Components
  • Asinus Components (2)
  • (2)
  • Request Lifecycle RequestContext
  • RequestContext
  • RequestContext Attributes
  • RequestContext Attributes (2)
  • RequestContext Summary Holder
  • Asinus URLs
  • Asinus URLs (2)
  • Response Modes
  • Response modes supported
  • Makro URLBuilder
  • Makro URLBuilder (2)
  • Irregular Asinus URLs
  • CSRF Protection
  • CSRF Protection (2)
  • ABTesting
  • ABTesting (2)
  • ABTesting (3)
  • Finding Module And Action
  • Finding Module And Action
  • Module Hierarchy
  • Module Hierarchy (2)
  • Module Hierarchy (ftl level)
  • Parallel Execution
  • Asynch
  • Asynch (2)
  • ThreadPoolManager
  • ThreadPoolManager (2)
  • Error amp Exception Handling
  • Error amp Exception Handling (2)
  • Performance Measuring
  • Performance Measuring (2)
  • Logging
  • Logging (2)
  • Configuration Management
  • Configuration Management (2)
  • Configuration Management (3)
  • Configuration Management (4)
  • Caching
  • Caching (2)
  • Caching (3)
  • Caching (4)
  • Session Management
  • Session Management (2)
  • CookieManager
  • CookieManager (2)
  • HeaderManager
  • Internationalization
  • Internationalization (2)
  • Internationalization (3)
  • Resource Management
  • Resource Management (2)
  • MCS
  • MCS Configuration
  • MCS
  • MCSDeviceManager
  • Asinus Security Approach
  • Asinus Security Approach (2)
  • Authorization amp Autentication
  • Authorization amp Autentication (2)
  • Asinus Filters
  • Asinus Filters (2)
  • Asinus Filters (3)
  • Data Access Support
  • Webservice Support
  • Webservice Client Support
  • REST API Support
  • File Upload Support
  • Captcha Support
  • Job Scheduling Support
  • Job Scheduling Support (2)
  • Module MVC
  • Module Class
  • Action Class
  • Action Class Forward amp Include
  • Action Class Calling Other Modules
  • Redirect
  • Freemarker
  • Freemarker Makrorsquos
  • Freemarker Makrorsquos (2)
  • Freemarker Makrorsquos (3)
  • Template Extension
  • Template Engine Support
  • Binding amp Validation API
  • Binding amp Validation API (2)
  • Binding amp Validation API (3)
  • Binding amp Validation API (4)
  • Admin Console
  • Admin Console (2)
  • Admin Console (3)
  • Admin Console (4)
  • Admin Console (5)
  • Asinus Roadmap
  • QUESTIONS