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
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 1: Line 1:
 ~~NOTRANS~~ ~~NOTRANS~~
 +~~Title: JVx code snippets~~
  
 We have a list of useful code snippets for you. Simply use them for your application. All snippets are free to use and licensed under [[https://​www.apache.org/​licenses/​LICENSE-2.0|Apache 2.0]]. We have a list of useful code snippets for you. Simply use them for your application. All snippets are free to use and licensed under [[https://​www.apache.org/​licenses/​LICENSE-2.0|Apache 2.0]].
Line 42: Line 43:
 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 116:
 }   // 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