Documentation

Trace:

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision Both sides next revision
jvx:code_snippets [2018/02/06 10:09]
admin
jvx:code_snippets [2018/02/06 10:17]
admin
Line 42: Line 42:
 Sometimes we need an application without overhead, e.g for Vaadin UI. Sometimes we need an application without overhead, e.g for Vaadin UI.
  
-<file java>+<​file ​java SimpleApplication.java>
 public class SimpleApplication extends Application public class SimpleApplication extends Application
                                ​implements IExceptionListener                                ​implements IExceptionListener
Line 115: Line 115:
 }   // SimpleApplication }   // SimpleApplication
 </​file>​ </​file>​
 +
 +==== Test your business logic with JUnit ====
 +
 +Tests our business logic without an application server, but with our Lifecycle objects. We test our server code without specific configuration or modifications for unit tests.
 +
 +Business Object:
 +
 +<file java UserRegistration.java>​
 +public class UserRegistration
 +{
 +   /**
 +    * Removes/​Unregisters a user and all its content.
 +    * 
 +    * @param pUserName the user name
 +    * @throws Exception if the user can not be deleted
 +    */
 +   ​public void delete(String pUserName) throws Exception
 +   {
 +      try
 +      {
 +         ​DBAccess dba = (DBAccess)SessionContext.getCurrentSession().get("​newDBAccess"​);​
 +         
 +         ​DBStorage dbsUser = new DBStorage();​
 +         ​dbsUser.setDBAccess(dba);​
 +         ​dbsUser.setWritebackTable("​USERS"​);​
 +         ​dbsUser.open();​
 +         
 +         ​List<​IBean>​ liBeans = dbsUser.fetchBean(new Equals("​USERNAME", ​
 +                                                            pUserName), null, 0, -1);
 +         
 +         //the username is unique and it's not possible that a user exists ​
 +         //​more than once!
 +         if (liBeans.size() == 1)
 +         {
 +            //delete the user (db will cascade all user-data)
 +            dbsUser.delete(liBeans.get(0));​
 +         }
 +         else
 +         {
 +            throw new SecurityException("​User '"​ + pUserName + "'​ was not found!"​);​
 +         }
 +      }
 +      catch (Throwable th)
 +      {
 +         throw new SecurityException("​It'​s not possible to delete the user!",​ th);
 +      }
 +   }
 +}   // UserRegistration
 +</​file>​
 +
 +A standard Lifecycle Object:
 +
 +<file java Session.java>​
 +public class Session extends GenericBean
 +{
 +   //​~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 +   // User-defined methods
 +   //​~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 +
 +   /**
 +    * Creates a new database access object.
 +    * 
 +    * @return the new database access object
 +    * @throws Exception if the connection can not be opened
 +    */
 +   ​public DBAccess getNewDBAccess() throws Exception
 +   {
 +      DBAccess dba = DBAccess.getDBAccess(DBSecurityManager.getCredentials(
 +                                          SessionContext.getCurrentSessionConfig()));​
 +      dba.open();
 +      ​
 +      return dba;
 +   }
 +   
 +   /**
 +    * Returns the access to the database.
 +    * 
 +    * @return the access to the database
 +    * @throws Exception if the datasource can not be opened
 +    */
 +   ​public DBAccess getDBAccess() throws Exception
 +   {
 +      DBAccess dba = (DBAccess)get("​dBAccess"​);​
 +      ​
 +      if (dba == null)
 +      {
 +         dba = getNewDBAccess();​
 +               
 +         ​put("​dBAccess",​ dba);
 +      }
 +      ​
 +      return dba;
 +   }
 +
 +   /**
 +    * Gets the user registration business object.
 +    * 
 +    * @return the business object for user registrations
 +    */
 +   ​public UserRegistration getRegistration()
 +   {
 +      UserRegistration ureg = (UserRegistration)get("​registration"​);​
 +      ​
 +      if (ureg == null)
 +      {
 +         ureg = new UserRegistration();​
 +         
 +         ​put("​registration",​ ureg);
 +      }
 +      ​
 +      return ureg;
 +   }
 +
 +}    // Session
 +</​file>​
 +
 +Unit Test:
 +
 +<file java>
 +/**
 + * Tests the our delete method from the user registration object.
 + ​* ​
 + * @throws Throwable if the test fails
 + */
 +@Test
 +public void testDelete() throws Throwable
 +{
 +   ​AbstractConnection con = createConnection(null);​
 +   
 +   try
 +   {
 +      //delete user with the name "​unknownuser"​
 +      con.call("​registration",​ "​delete",​ "​unknownuser"​);​
 +      ​
 +      Assert.fail("​User '​unknownuser'​ found!"​);​
 +   }
 +   catch (SecurityException se)
 +   {
 +      Assert.assertEquals("​User '​unknownuser'​ was not found!", ​
 +                          se.getMessage());​
 +   }
 +
 +   ​con.close();​
 +}
 +
 +/**
 + * Creates a new connection.
 + ​* ​
 + * @param pConProps additional connection properties
 + * @return the connection
 + * @throws Throwable if the connection can not be opened
 + */
 +private AbstractConnection createConnection(Hashtable<​String,​ String> pConProps) throws Throwable
 +{
 +   ​MasterConnection macon = new MasterConnection(new DirectServerConnection());​
 +   ​macon.setApplicationName("​app"​);​
 +   ​macon.setUserName("​user"​);​
 +   ​macon.setPassword("​pwd"​);​
 +   
 +   if (pConProps != null)
 +   {
 +      for (Map.Entry<​String,​ String> entry : pConProps.entrySet())
 +      {
 +         ​macon.setProperty(entry.getKey(),​ entry.getValue());​
 +      }
 +   }
 +   
 +   ​macon.open();​
 +   
 +   ​return macon;
 +}
 +</​file>​
 +
 +==== A very simple AbstractMemStorage implementation ====
 +
 +A server side memory storage with the column names: ID, NAME, PATH. The column PATH is not visible on the client-side,​ but is important for server-side. If "​error"​ is set as NAME, an Exception is thrown!
 +
 +<file java SimpleMemStorage.java>​
 +public class SimpleMemStorage extends AbstractMemStorage
 +{
 +   //​~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 +   // Abstract methods implementation
 +   //​~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 +
 +   /**
 +    * {@inheritDoc}
 +    */
 +   ​@Override
 +   ​public RowDefinition getRowDefinition() throws ModelException
 +   {
 +      RowDefinition rowdef = new RowDefinition();​
 +      rowdef.addColumnDefinition(new ColumnDefinition("​ID",​ new BigDecimalDataType()));​
 +      rowdef.addColumnDefinition(new ColumnDefinition("​NAME",​ new StringDataType()));​
 +      rowdef.addColumnDefinition(new ColumnDefinition("​PATH",​ new StringDataType()));​
 +
 +      rowdef.setPrimaryKeyColumnNames(new String[] {"​ID"​});​
 +      ​
 +      rowdef.setColumnView(null,​ new ColumnView("​ID",​ "​NAME"​));​
 +      ​
 +      return rowdef;
 +   }
 +
 +   /**
 +    * {@inheritDoc}
 +    */
 +   ​@Override
 +   ​public void loadData(MemDataBook pBook, ICondition pFilter) throws ModelException
 +   {
 +      pBook.deleteAllDataRows();​
 +      ​
 +      pBook.insert(false);​
 +      pBook.setValues(new String[] {"​ID",​ "​NAME",​ "​PATH"​}, ​
 +                      new Object[] {BigDecimal.valueOf(0),​ "​First",​ "/​home/​first"​});​
 +      pBook.insert(false);​
 +      pBook.setValues(new String[] {"​ID",​ "​NAME",​ "​PATH"​}, ​
 +                      new Object[] {BigDecimal.valueOf(1),​ "​Second",​ "/​home/​second"​});​
 +      pBook.insert(false);​
 +      pBook.setValues(new String[] {"​ID",​ "​NAME",​ "​PATH"​}, ​
 +                      new Object[] {BigDecimal.valueOf(2),​ "​Third",​ "/​home/​third"​});​
 +   }
 +
 +   /**
 +    * {@inheritDoc}
 +    */
 +   ​@Override
 +   ​public void insert(DataBookEvent pEvent) throws ModelException
 +   {
 +      if ("​error"​.equals(pEvent.getChangedDataBook().getValueAsString("​NAME"​)))
 +      {
 +         throw new ModelException("​not allowed"​); ​
 +      }
 +   }
 +
 +   ​@Override
 +   ​public void delete(DataBookEvent pEvent)
 +   {
 +   }
 +
 +   ​@Override
 +   ​public void update(DataBookEvent pEvent) throws ModelException
 +   {
 +      if ("​error"​.equals(pEvent.getChangedDataBook().getValueAsString("​NAME"​)))
 +      {
 +         throw new ModelException("​not allowed"​); ​
 +      }
 +   }
 +   
 +}   // SimpleMemStorage
 +</​file>​
 +
 +==== Change XML files very fast ====
 +
 +Our XML file
 +
 +<file xml>
 +<​server>​
 +  <!-- Test: STARTPORT -->
 +  <​startport>​2001</​startport>​
 + 
 +  <​audio>​off</​audio>​
 +  <​serial>​COM1</​serial>​
 +  <​domain>​JVx</​domain>​
 +</​server>​
 +</​file>​
 +
 +Change it:
 +
 +<file java>
 +XmlNode xmnRead = readXml("​simple.xml"​);​
 +
 +xmnRead.setNode("/​server/​audio",​ null);
 +xmnRead.setNode("/​server/​domain",​ "​www.sibvisions.com"​);​
 +
 +writeXml(xmnRead,​ "​simple.xml"​);​
 +</​file>​
 +
 +==== EventHandler without Listener interface ====
 +
 +Event definition:
 +
 +<file java>
 +/** the event handler for captured (the event has one parameter: byte[]). */
 +private CallableHandler chCaptured = new CallableHandler(byte[].class);​
 +
 +/** the event handler for canceled (the event has no parameter). */
 +private CallableHandler chCanceled = new CallableHandler();​
 +</​file>​
 +
 +Event access:
 +
 +<file java>
 +/**
 + * Gets the captured event handler.
 + ​* ​
 + * @return the event handler
 + */
 +public CallableHandler eventCaptured()
 +{
 +   ​return chCaptured;
 +}
 +
 +/**
 + * Gets the canceled event handler.
 + ​* ​
 + * @return the event handler
 + */
 +public CallableHandler eventCanceled()
 +{
 +   ​return chCanceled;
 +}
 +</​file>​
 +
 +Dispatch events:
 +
 +<file java>
 +chCaptured.dispatchEvent(byData);​
 +chCancel.dispatchEvent();​
 +</​file>​
 +
 +Listener registration:​
 +
 +<file java>
 +object.eventCaptured().addListener(this,​ "​doCapture"​);​
 +
 +public void doCapture(byte[] pImage) throws Exception
 +{
 +    //...
 +}
 +</​file>​
 +
 +==== EventHandler with Listener interface ====
 +
 +The interface:
 +
 +<file java IRemoteApplicationListener.java>​
 +public interface IRemoteApplicationListener
 +{
 +   //​~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 +   // Method definitions
 +   //​~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 +
 +    /**
 +     * Invoked when login was successful.
 +     ​* ​
 +     * @param pApplication the application
 +     */
 +    public void afterLogin(RemoteApplication pApplication);​
 +    ​
 +    /**
 +     * Invoked when logout was successful.
 +     ​* ​
 +     * @param pApplication the application
 +     */
 +    public void afterLogout(RemoteApplication pApplication);​
 +
 +}   // IRemoteApplicationListener
 +</​file>​
 +
 +The EventHandler:​
 +
 +<file java RemoteApplicationHandler.java>​
 +public class RemoteApplicationHandler extends RuntimeEventHandler<​IRemoteApplicationListener>​
 +{
 +   //​~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 +   // Initialization
 +   //​~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 +
 +   /**
 +    * Constructs a new RemoteApplicationHandler.
 +    *  ​
 +    * @param pListenerMethodName the method to be called inside the interface.
 +    */
 +   ​public RemoteApplicationHandler(String pListenerMethodName)
 +   {
 +      super(IRemoteApplicationListener.class,​ pListenerMethodName);​
 +   }
 +
 +}   // RemoteApplicationHandler
 +</​file>​
 +
 +Event access:
 +
 +<file java>
 +/** the "after login" event. */
 +private RemoteApplicationHandler eventAfterLogin;​
 +
 +/** the "after logout"​ event. */
 +private RemoteApplicationHandler eventAfterLogout;​
 +
 +
 +/**
 + * Gets the event handler for the after login event.
 + ​* ​
 + * @return the event handler
 + */
 +public RemoteApplicationHandler eventAfterLogin()
 +{
 +   if (eventAfterLogin == null)
 +   {
 +      eventAfterLogin = new RemoteApplicationHandler("​afterLogin"​);​
 +   }
 +   ​return eventAfterLogin;​
 +}
 +
 +/**
 + * Gets the event handler for the after logout event.
 + ​* ​
 + * @return the event handler
 + */
 +public RemoteApplicationHandler eventAfterLogout()
 +{
 +   if (eventAfterLogout == null)
 +   {
 +      eventAfterLogout = new RemoteApplicationHandler("​afterLogout"​);​
 +   }
 +   ​return eventAfterLogout;​
 +}
 +</​file>​
 +
 +Dispatch Events:
 +
 +<file java>
 +/**
 + * Fires the after logout event.
 + */
 +protected void afterLogout()
 +{
 +   if (eventAfterLogout != null)
 +   {
 +      eventAfterLogout.dispatchEvent(this);​
 +   }
 +}
 +
 +/**
 + * Fires the after login event.
 + */
 +protected void afterLogin()
 +{
 +   if (eventAfterLogin != null)
 +   {
 +      eventAfterLogin.dispatchEvent(this);​
 +   }
 +}
 +</​file>​
 +
 +Listener registration:​
 +
 +<file java>
 +app.eventAfterLogin().addListener(this,​ "​doAfterLogin"​);​
 +app.eventAfterLogout().addListener(this,​ "​doAfterLogout"​);​
 +
 +//We do not need the parameter
 +public void doAfterLogin()
 +{
 +}
 +
 +//We do not need the parameter
 +public void doAfterLogout()
 +{
 +}
 +</​file>​
 +
 +
 +
 +
 +
This website uses cookies for visitor traffic analysis. By using the website, you agree with storing the cookies on your computer.More information