From aa4ab12ad6353211065a5d084580ecb146a9abf1 Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Wed, 16 Mar 2022 00:54:32 +0000 Subject: [PATCH] Revert "initial commit" This reverts commit c986b9eb275ae50c5a7b9b1d757be5c58e38c0da. Revert --- README.md | 68 --- addressbook_screenshot.png | Bin 116902 -> 0 bytes build.properties | 60 --- build.xml | 474 ----------------- pom.xml | 495 ------------------ .../helper/GenericResourceBundle.java | 23 - .../tutorial/addressbook/AddressbookUI.java | 149 ------ .../tutorial/addressbook/ContactForm.java | 116 ---- .../tutorial/addressbook/backend/Contact.java | 90 ---- .../addressbook/backend/ContactService.java | 103 ---- .../utilities/CaseInsensitiveComparator.java | 99 ---- .../utilities/GenericComparator.java | 277 ---------- .../utilities/HexAsciiConvertor.java | 59 --- .../utilities/LoggerStackTraceUtil.java | 59 --- .../utilities/PrepareTargetMethod.java | 17 - .../edurekademo/utilities/PropertyHelper.java | 97 ---- .../edurekademo/utilities/PropertyLoader.java | 107 ---- .../utilities/StringUtilities.java | 194 ------- src/main/pmd/pmd.xsl | 275 ---------- src/main/pmd/ruleset_basics.xml | 120 ----- src/main/pmd/ruleset_j2ee.xml | 328 ------------ src/main/pmd/ruleset_security.xml | 19 - .../utilities/ExceptionThrower.java | 46 -- .../utilities/TestGenericComparator.java | 248 --------- .../utilities/TestHexAsciiConversion.java | 58 -- .../com/edurekademo/utilities/TestLogger.java | 90 ---- .../com/edurekademo/utilities/UnitDTO.java | 51 -- src/test/resources/Dateformat.properties | 4 - 28 files changed, 3726 deletions(-) delete mode 100644 README.md delete mode 100644 addressbook_screenshot.png delete mode 100644 build.properties delete mode 100644 build.xml delete mode 100644 pom.xml delete mode 100644 src/main/java/com/edurekademo/helper/GenericResourceBundle.java delete mode 100644 src/main/java/com/edurekademo/tutorial/addressbook/AddressbookUI.java delete mode 100644 src/main/java/com/edurekademo/tutorial/addressbook/ContactForm.java delete mode 100644 src/main/java/com/edurekademo/tutorial/addressbook/backend/Contact.java delete mode 100644 src/main/java/com/edurekademo/tutorial/addressbook/backend/ContactService.java delete mode 100644 src/main/java/com/edurekademo/utilities/CaseInsensitiveComparator.java delete mode 100644 src/main/java/com/edurekademo/utilities/GenericComparator.java delete mode 100644 src/main/java/com/edurekademo/utilities/HexAsciiConvertor.java delete mode 100644 src/main/java/com/edurekademo/utilities/LoggerStackTraceUtil.java delete mode 100644 src/main/java/com/edurekademo/utilities/PrepareTargetMethod.java delete mode 100644 src/main/java/com/edurekademo/utilities/PropertyHelper.java delete mode 100644 src/main/java/com/edurekademo/utilities/PropertyLoader.java delete mode 100644 src/main/java/com/edurekademo/utilities/StringUtilities.java delete mode 100644 src/main/pmd/pmd.xsl delete mode 100644 src/main/pmd/ruleset_basics.xml delete mode 100644 src/main/pmd/ruleset_j2ee.xml delete mode 100644 src/main/pmd/ruleset_security.xml delete mode 100644 src/test/java/com/edurekademo/utilities/ExceptionThrower.java delete mode 100644 src/test/java/com/edurekademo/utilities/TestGenericComparator.java delete mode 100644 src/test/java/com/edurekademo/utilities/TestHexAsciiConversion.java delete mode 100644 src/test/java/com/edurekademo/utilities/TestLogger.java delete mode 100644 src/test/java/com/edurekademo/utilities/UnitDTO.java delete mode 100644 src/test/resources/Dateformat.properties diff --git a/README.md b/README.md deleted file mode 100644 index fefd2a53b..000000000 --- a/README.md +++ /dev/null @@ -1,68 +0,0 @@ -Addressbook Tutorial -==================== - -This tutorial teaches you some of the basic concepts in [Vaadin Framework](https://vaadin.com). It is meant to be -a fast read for learning how to get started - not an example on how application should be -designed. Please note this example uses and requires Java 8 to work. - -![Addressbook Screenshot](addressbook_screenshot.png "Addressbook Screenshot") - - -Running the example from the command line -------------------- -``` -$ mvn jetty:run -``` - -Open [http://localhost:8080/](http://localhost:8080/) - - -Importing in IntelliJ IDEA 14 --------------------- -These instructions were tested on IntelliJ IDEA 14 CE. You can get it from https://www.jetbrains.com/idea/ - -To get the project up and running in IDEA, do: -- File -> New -> Project from Version Control -> Git -- The URL to use is https://github.com/vaadin/addressbook.git -- If you get a message about "Non-managed pom.xml file found". Choose "Add as Maven Project" -- If you get a message about no JDK or SDK being selected. Choose "Configure" and select your installed JDK. You can also set the JDK using File -> Project Structure -- To start the project, find the "Maven Projects" tab on the right hand side of the screen and navigate to - - Vaadin Web Application -> Plugins -> jetty -> jetty:run - - Click the play button or right click and select Run (Select Debug instead to run in debug mode) - -You should now have a Jetty server running on localhost:8080. Navigate to http://localhost:8080 to play with the application - -Importing in NetBeans 8 --------------------- -These instructions were tested on NetBeans 8.0.2. You can get it from https://www.netbeans.org - -To checkout and run the project in NetBeans, do: -- Team -> Git -> Clone -- Set repository URL to https://github.com/vaadin/addressbook.git -- Finish -- Right click the imported project (Vaadin Addressbook Application) and select Run -- Select GlassFish Server 4.1 -> Remember in Current IDE Session -> OK - -You should now have a GlassFish server running on localhost:8080 and a browser tab should also be automatically opened with this location - -Importing in Eclipse --------------------- -These instructions were tested on Eclipse IDE for Java EE Developers Luna SR2. You can get it from http://eclipse.org/downloads/ - -To checkout and run the project in Eclipse, do: -- File -> Import... -- Check out Maven Projects from SCM -- Choose Git from SCM menu - - If you do not see "Git" in the SCM menu, click "Find more SCM connectors in the m2e Marketplace" and install "m2e-egit". Restart Eclipse and start over. -- Set the repository URL to https://github.com/vaadin/addressbook.git -- Right click the imported "addressbook" and choose Run As -> Maven Build... - - Set the goal to "jetty:run" and click "Run" - -You should now have a Jetty server running on localhost:8080. Navigate to [http://localhost:8080/](http://localhost:8080/) to play with the application - -To use the built in server adapters of Eclipse, instead of doing "Run As -> Maven Build..." you can do -- Run As -> Run on Server -- Select the server you want to run on, e.g. Apache Tomcat 8 and click ok -- *Do not use the suggested J2EE Preview server* as it is outdated, deprecated and does not support Servlet 3, which is required for this application - -*** End of documentation \ No newline at end of file diff --git a/addressbook_screenshot.png b/addressbook_screenshot.png deleted file mode 100644 index 9501332fa9d28147ab07991cf4f6fcf5dacf7b76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 116902 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

default constructor - assumes comparator for Type List

- * - *

For Example-

- * List<Integer> aa = new ArrayList<Integer>();
- * List<String> bb = new ArrayList<String>();
- * List<Date> cc = new ArrayList<Date>();
- *

and so on..

- * - * @param sortAscending - a {@link boolean} - true ascending order or false descending order - */ - - public GenericComparator(boolean sortAscending) { - super(); - this.targetMethod = null; - this.sortAscending = sortAscending; - } - - /** - *

constructor with sortField parameter for Derived type of Class default sorting is ascending order

- * - *

For Example-

- *

PersonVO person = new PersonVO();
- * person.setId(10001);
- * person.setName("Jacob");
- * person.setHeight(5.2F);
- * person.setEmailId("jacob@example.example");
- * person.setSalary(10500L);
- * person.setDob(new SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH).parse("Jan 1, 1970"));

- *

and person2, person3, so on.. And Defining & adding all the created objects in to below list

- *

List<PersonVO> persons = new ArrayList<PersonVO>();
- * persons.add(person1);
- * persons.add(person2);
- * persons.add(person3);
and so on
- * - * @param sortField - a {@link java.lang.String} - which field requires sorting; as per above example "sorting required for name field" - */ - public GenericComparator(String sortField) { - super(); - this.targetMethod = prepareTargetMethod(sortField); - this.sortAscending = true; - } - - /** - *

constructor with sortField, sortAscending parameter for Derived type of Class

- * - *

For Example-

- *

PersonVO person = new PersonVO();
- * person.setId(10001);
- * person.setName("Jacob");
- * person.setHeight(5.2F);
- * person.setEmailId("jacob@example.example");
- * person.setSalary(10500L);
- * person.setDob(new SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH).parse("Jan 1, 1970"));

- *

and person2, person3, so on.. And Defining & adding all the created objects in to below list

- *

List<PersonVO> persons = new ArrayList<PersonVO>();
- * persons.add(person1);
- * persons.add(person2);
- * persons.add(person3);
and so on
- * @param sortField - a {@link java.lang.String} - which field requires sorting; as per above example "sorting required for name field" - * @param sortAscending - a {@link boolean} - true ascending order or false descending order - */ - - public GenericComparator(String sortField, boolean sortAscending) { - super(); - this.targetMethod = prepareTargetMethod(sortField); - this.sortAscending = sortAscending; - } - - /** - * {@inheritDoc} - */ - public int compare(Object o1, Object o2) { - int response = LESSER; - Object v1,v2; - String returnType; - try { - if(this.targetMethod==null){ - v1=o1; - v2=02; - returnType=o1.getClass().getName(); - }else{ - v1=getValue(o1); - v2=getValue(o2); - returnType=getMethod(o1).getReturnType().getName(); - } - - CompareMode cm = findCompareMode(v1, v2); - if (!cm.equals(CompareMode.DEFAULT)) { - return compareAlternate(cm); - } - response = compareActual(v1, v2, returnType); - } - // in JSE 1.7 the below is accepted - /* - catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException nsme) { - } */ - catch (NoSuchMethodException e){ - LoggerStackTraceUtil.printErrorMessage(e); - }catch (IllegalAccessException e){ - LoggerStackTraceUtil.printErrorMessage(e); - }catch (InvocationTargetException e){ - LoggerStackTraceUtil.printErrorMessage(e); - } - return response; - } - -//---------------------------------------------------------------------------------// -// Private methods used by {@link com.myjeeva.comparator.GenericComparator} // -//---------------------------------------------------------------------------------// - /** - * alternate to actual value comparison i.e., either (lsh & rhs) one the value could be null - * - * @param cm - a enum used to idetify the position for sorting - */ - protected int compareAlternate(CompareMode cm) { - int compareState = LESSER; - switch(cm) { - case LESS_THAN: - compareState = LESSER * determinePosition(); - break; - case GREATER_THAN: - compareState = GREATER * determinePosition(); - break; - case EQUAL: - compareState = EQUAL * determinePosition(); - break; - } - return compareState; -} - /** - * actual value comparison for sorting; both lsh & rhs value available - * - * @param v1 - value of lhs - * @param v2 - value of rhs - * @param returnType - datatype of given values - * @return int - compare return value - */ - private int compareActual(Object v1, Object v2, String returnType) { - String obj = returnType; - if ("java.lang.Object".equals(obj) && v1!=null) { - obj = v1.getClass().getName(); - } - int acutal = LESSER; - - if (obj.equals(DATATYPE_INTEGER)) { - acutal = ((Integer) v1).compareTo((Integer) v2) * determinePosition(); - } else if (obj.equals(DATATYPE_LONG)) { - acutal = ((Long) v1).compareTo((Long) v2) * determinePosition(); - } else if (obj.equals(DATATYPE_STRING)) { - acutal = ((String) v1).compareTo((String) v2) * determinePosition(); - } else if (obj.equals(DATATYPE_DATE)) { - acutal = ((Date) v1).compareTo((Date) v2) * determinePosition(); - } else if (obj.equals(DATATYPE_FLOAT)) { - acutal = ((Float) v1).compareTo((Float) v2) * determinePosition(); - } else if (obj.equals(DATATYPE_DOUBLE)) { - acutal = ((Double) v1).compareTo((Double) v2) * determinePosition(); - } else if (obj.equals(DATATYPE_BOOLEAN)) { - acutal = ((Boolean) v1).compareTo((Boolean) v2) * determinePosition(); - } - return acutal; - } - /** - * preparing target name of getter method for given sort field - * - * @param name a {@link java.lang.String} - * @return methodName a {@link java.lang.String} - */ - protected final static String prepareTargetMethod(String name) { - StringBuffer fieldName = new StringBuffer(METHOD_GET_PREFIX); - fieldName.append(name.substring(0, 1).toUpperCase()).append(name.substring(1)); - return fieldName.toString(); - } - - /** - * fetching method from Class object through reflect - * - * @param obj - a {@link java.lang.Object} - input object - * @return method - a {@link java.lang.reflect.Method} - * @throws NoSuchMethodException - */ - protected final Method getMethod(Object obj) throws NoSuchMethodException { - return obj.getClass().getMethod(targetMethod, null); - } - - /** - * dynamically invoking given method with given object through reflect - * - * @param method - a {@link java.lang.reflect.Method} - * @param obj - a {@link java.lang.Object} - * @return object - a {@link java.lang.Object} - return of given method - * @throws InvocationTargetException - * @throws IllegalAccessException - */ - - private final static Object invoke(Method method, Object obj) throws InvocationTargetException, IllegalAccessException { - return method.invoke(obj, null); - } - /** - * fetching a value from given object - * - * @param obj - a {@link java.lang.Object} - * @return object - a {@link java.lang.Object} - return of given method - * @throws InvocationTargetException - * @throws IllegalAccessException - * @throws NoSuchMethodException - */ - protected Object getValue(Object obj) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException { - return invoke(getMethod(obj), obj); - } - /** - * identifying the comparison mode for given value - * - * @param o1 - a {@link java.lang.Object} - * @param o2 - a {@link java.lang.Object} - * @return compareMode - a {@link com.edurekademo.utilities.GenericComparator.CompareMode} - */ - protected CompareMode findCompareMode(Object o1, Object o2) { - CompareMode cm = CompareMode.LESS_THAN; - if(null != o1 & null != o2) { - cm = CompareMode.DEFAULT; - } else if (null == o1 & null != o2) { - cm = CompareMode.LESS_THAN; - } else if (null != o1 & null == o2) { - cm = CompareMode.GREATER_THAN; - } else if (null == o1 & null == o2) { - cm = CompareMode.EQUAL; - } - return cm; - } - /** - * Determining positing for sorting - * - * @return -1 to change the sort order if appropriate. - */ - protected int determinePosition() { - return sortAscending ? GREATER : LESSER; - } -} diff --git a/src/main/java/com/edurekademo/utilities/HexAsciiConvertor.java b/src/main/java/com/edurekademo/utilities/HexAsciiConvertor.java deleted file mode 100644 index e3d829db7..000000000 --- a/src/main/java/com/edurekademo/utilities/HexAsciiConvertor.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.edurekademo.utilities; - -public class HexAsciiConvertor { - /** - * Method to convert hexadecimal values into ascii - * method is return the ascii value - * @param hexValue - * @return outputAscii - */ - - public static String convertHexToASCII(String hexValue) - { - StringBuilder outputAscii = new StringBuilder(); - String asciiValue = null; - try{ - if(hexValue!=null){ - for (int i = 0; i < hexValue.length(); i += 2) - { - String str = hexValue.substring(i, i + 2); - outputAscii.append((char) Integer.parseInt(str, 16)); - } - asciiValue = outputAscii.toString(); - } - } - catch(Exception ex){ - LoggerStackTraceUtil.printErrorMessage(ex); - } - return asciiValue; - } - - /** - * Method to convert ascii values into hexadecimal - * method is returning the hexadecimal value - * @param asciiValue - * @return hex - */ - - public static String convertAsciiToHex(String asciiValue) - { - String hexvalue = null; - try { - - if(asciiValue!=null) - { - char[] chars = asciiValue.toCharArray(); - StringBuffer hex = new StringBuffer(); - for (int i = 0; i < chars.length; i++) - { - hex.append(Integer.toHexString((int) chars[i])); - } - hexvalue= hex.toString(); - } - } - catch (Exception e) { - LoggerStackTraceUtil.printErrorMessage(e); - } - return hexvalue; - } -} \ No newline at end of file diff --git a/src/main/java/com/edurekademo/utilities/LoggerStackTraceUtil.java b/src/main/java/com/edurekademo/utilities/LoggerStackTraceUtil.java deleted file mode 100644 index 3631b781e..000000000 --- a/src/main/java/com/edurekademo/utilities/LoggerStackTraceUtil.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.edurekademo.utilities; -import org.apache.commons.lang3.exception.ExceptionUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -// Class used to log the print stack trace items -public class LoggerStackTraceUtil { - - private static final Logger LOG =LoggerFactory.getLogger(LoggerStackTraceUtil.class); - private int maxCount=3; - - /** - * @param th - The exception that was thrown and to be logged. - * @return at very least the 1st error, if stacktrace is more than 1, then it also - * returns the immediate cause - * - * Note this function cannot be made static for thread safety.. - */ - public String getErrorMessage(Throwable th){ - if (th==null) return ""; - StringBuilder b = new StringBuilder(""); - String [] aryError = ExceptionUtils.getRootCauseStackTrace(th); - b.append(aryError[0].trim()); - if (aryError.length >= 2){ - b.append(String.format("%nCause:%s",aryError[1].trim())); - } - if (aryError.length >= maxCount){ - b.append(String.format("%nCause:%s",aryError[2].trim())); - } - return b.toString(); - } - - // Static Logger function - public static void printErrorMessage(Throwable th) - { - try{ - // log the error caused by - LOG.error("Error Cause: {}",th.getMessage()); - // Conditional statement to check the length of the array - int count=0; - for(StackTraceElement stackTrace:th.getStackTrace()){ - if(count<=25){ - LOG.error("Error Class: {} and Line Number: {}",stackTrace.getClassName(),stackTrace.getLineNumber()); - }else{ - break; - } - count++; - } - } - catch(Exception e) - { - // log the exception error - LoggerStackTraceUtil.printErrorMessage(e); - } - - - } - -} diff --git a/src/main/java/com/edurekademo/utilities/PrepareTargetMethod.java b/src/main/java/com/edurekademo/utilities/PrepareTargetMethod.java deleted file mode 100644 index fe24e775b..000000000 --- a/src/main/java/com/edurekademo/utilities/PrepareTargetMethod.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.edurekademo.utilities; - -public class PrepareTargetMethod { - - private static final String METHOD_GET_PREFIX = "get"; - /** - * preparing target name of getter method for given sort field - * - * @param name a {@link java.lang.String} - * @return methodName a {@link java.lang.String} - */ - public String prepareTargetMethod(String name) { - StringBuffer fieldName = new StringBuffer(METHOD_GET_PREFIX); - fieldName.append(name.substring(0, 1).toUpperCase()).append(name.substring(1)); - return fieldName.toString(); - } -} diff --git a/src/main/java/com/edurekademo/utilities/PropertyHelper.java b/src/main/java/com/edurekademo/utilities/PropertyHelper.java deleted file mode 100644 index a1bf5ab5f..000000000 --- a/src/main/java/com/edurekademo/utilities/PropertyHelper.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.edurekademo.utilities; - -import java.util.Enumeration; -import java.util.HashMap; -import java.util.Properties; -@SuppressWarnings("unchecked") - -/** - * Helper Class to load Properties from a property file to be passed to caller for execution. - * Multiple properties can be loaded. - * Note that if same property is specified multiple times in a single file, there is no guaranteed "Winner" - * Also note in the case of loading multiple files and duplicate definition of properties across files, - * the last loaded property file "wins". - * The getProperty()/get() methods also returns "" silently if no such query exists. - * @author Seshagiri Sriram - * @version 1.0 - * @see PropertyLoader - */ - -public final class PropertyHelper { - -/** - * hMapProperties contains the hashmap of key/value pairs associated with each property - */ -protected final static HashMap HMAPPROPERTIES = new HashMap(); - - -/** - * @param propertyFile - * @return - */ -public static HashMap loadProperties(String propertyFile) { - Properties properties = PropertyLoader.loadProperties(propertyFile); - Enumeration keys = (Enumeration) properties.propertyNames(); - while (keys.hasMoreElements()) { - String tmpKey = (String) keys.nextElement(); - HMAPPROPERTIES.put(tmpKey,properties.getProperty(tmpKey)); - - } - return HMAPPROPERTIES; - } - - -/** - * @param propertyName - * @return - */ -public static String getProperty(String propertyName){ - String propertyValue = ""; - try { - propertyValue = (String) HMAPPROPERTIES.get(propertyName); - } - catch (Exception e){ - LoggerStackTraceUtil.printErrorMessage(e); - propertyValue = ""; - } - finally { - } - return propertyValue; - } - -/** - * Function used to get the default value if the property is null - * @param propertyName - Name of the property - * @param strDefault - Default value that needs to be returned if the value is null - * @return Property value/Default Value as String - */ -public static String getProperty(String propertyName,String strDefault){ - String propertyValue = ""; - try { - propertyValue = (String) HMAPPROPERTIES.get(propertyName); - // Check the property value is null/not - if(propertyValue == null){ - // Assign the default value to the propertyValue - propertyValue=strDefault; - } - } - catch (Exception e){ - LoggerStackTraceUtil.printErrorMessage(e); - propertyValue = ""; - } - finally { - } - return propertyValue; - } - -/** - * A convenience method (aliasing getProperty) - * @param propertyName property to be retrieved. - * @return - * @see getProperty - */ -public static String get(String propertyName){ - return getProperty(propertyName); -} - } - diff --git a/src/main/java/com/edurekademo/utilities/PropertyLoader.java b/src/main/java/com/edurekademo/utilities/PropertyLoader.java deleted file mode 100644 index 628918ae7..000000000 --- a/src/main/java/com/edurekademo/utilities/PropertyLoader.java +++ /dev/null @@ -1,107 +0,0 @@ -package com.edurekademo.utilities; - -import java.io.InputStream; -import java.util.Enumeration; -import java.util.Locale; -import java.util.Properties; -import java.util.ResourceBundle; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -/** - * Looks up a resource named 'name' in the classpath. The resource must map - * to a file with .properties extention. The name is assumed to be absolute - * and can use either "/" or "." for package segment separation with an - * optional leading "/" and optional ".properties" suffix. Thus, the - * following names refer to the same resource: - * - * @author Seshagiri Sriram - * @version 1.0 - * @param name classpath resource name [may not be null] - * @param loader classloader through which to load the resource [null - * is equivalent to the application loader] - * @return resource converted to java.util.Properties [may be null if the - * resource was not found and THROW_ON_LOAD_FAILURE is false] - * @throws IllegalArgumentException if the resource was not found and - * THROW_ON_LOAD_FAILURE is true - */ - -public class PropertyLoader -{ - - private static final boolean THROW_ON_LOAD_FAILURE = true; - private static final boolean LOAD_AS_RESOURCE_BUNDLE = false; - private static final String SUFFIX = ".properties"; - - /** - * Logger enabled for the current class - */ - private static final Logger LOG =LoggerFactory.getLogger(PropertyLoader.class); - - /** - * A convenience overload of {@link #loadProperties(String, ClassLoader)} - * that uses the current thread's context classloader. - */ - - public static Properties loadProperties (final String name) { - return loadProperties (name, Thread.currentThread ().getContextClassLoader ()); - } - - @SuppressWarnings("rawtypes") - public static Properties loadProperties (String names, ClassLoader loader) - { - String name = null; - ClassLoader loaders; - if (names == null) throw new IllegalArgumentException ("null input: name"); - if (names.startsWith ("/")) name = names.substring (1); - if (names.endsWith (SUFFIX)) name = names.substring (0, names.length () - SUFFIX.length ()); - Properties result = null; - InputStream in = null; - try { - if (loader == null) - loaders = ClassLoader.getSystemClassLoader (); - if (LOAD_AS_RESOURCE_BUNDLE) - { - name = name.replace ('/', '.'); // Throws MissingResourceException on lookup failures: - final ResourceBundle rb = ResourceBundle.getBundle (name, Locale.getDefault (), loaders); - result = new Properties (); - for (Enumeration keys = rb.getKeys (); keys.hasMoreElements ();) - { - final String key = (String) keys.nextElement (); - final String value = rb.getString (key); - result.put (key, value); - } - } - else { - name = name.replace ('.', '/'); - if (! name.endsWith (SUFFIX)) name = name.concat (SUFFIX); // Returns null on lookup failures: - if(loader!=null) - in = loader.getResourceAsStream (name); - if (in != null) { - result = new Properties (); - result.load (in); // Can throw IOException - } - } - } - catch (Exception e) { - result = new Properties (); - LoggerStackTraceUtil.printErrorMessage(e); - } - finally { - if (in != null) - try - { - in.close (); - } - catch (Throwable ignore) {} - } - if (THROW_ON_LOAD_FAILURE && (result == null)) - { - // LOG exception... Do not re-throw this.. as I do not expect users to catch this exception :-) - //throw new IllegalArgumentException ("could not load [" + name + "]"+ " as " + (LOAD_AS_RESOURCE_BUNDLE ? "a resource bundle" : "a classloader resource")); - result = new Properties (); - } - return result; - } - -} \ No newline at end of file diff --git a/src/main/java/com/edurekademo/utilities/StringUtilities.java b/src/main/java/com/edurekademo/utilities/StringUtilities.java deleted file mode 100644 index 2f83a35b1..000000000 --- a/src/main/java/com/edurekademo/utilities/StringUtilities.java +++ /dev/null @@ -1,194 +0,0 @@ -package com.edurekademo.utilities; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - - -/** - * An utility class that is used to split an string into an array list and providing mechanism to - * build a HashMap value based on a variable number of arguements. - * @author Seshagiri Sriram - * @version 1.0 - * - */ -public class StringUtilities { - /** - * The string separator for splitting a string into a list - */ - private final static String COMMA_SEPARATOR = ","; - /** - * The String separator for splitting a parameter value. - * Parameters are expected to be in form: "parametername=value" - */ - private final static String PARAM_SEPARATOR = "="; - /** - * The String separator for splitting a parameter value into appropriate type. - * Required for HQL Queries, never for Native SQL queries - * Parameters are expected to be in form: "parametername=value:type (int, string, float, double)" - */ - private final static String TYPE_SEPARATOR = ";"; - /** - * The String separator for splitting a date parameter value into appropriate format. - */ - private final static String DATEFORMAT_SEPARATOR = "@"; - - /** - * The method to be invoked to convert a given String value to a specific Object type - */ - private final static String CONVERTOR_METHOD_NAME = "valueOf" ; - - /** - * The String to represent the type "DATE" - */ - private final static String DATE_TYPE = "date" ; - - /** - * Default Date format to which the date will be formatted - */ - - private final static String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss" ; - /** - * Variable to represent the type "STRING" - */ - private final static String STRING_TYPE ="string"; - /** - * Logger enabled for the current class - */ - private static final Logger LOG =LoggerFactory.getLogger(StringUtilities.class); - - /** Primitive type name -> class map. */ - private static final HashMap> PRIMITIVE_NAME_TYPE_MAP = new HashMap>(); - - /** Setup the primitives map. */ - static { - PRIMITIVE_NAME_TYPE_MAP.put("boolean", Boolean.class); - PRIMITIVE_NAME_TYPE_MAP.put("int", Integer.class); - PRIMITIVE_NAME_TYPE_MAP.put("long", Long.class); - PRIMITIVE_NAME_TYPE_MAP.put("float", Float.class); - PRIMITIVE_NAME_TYPE_MAP.put("double", Double.class); - } - - /** - * given a comma separated string and type, returns an ArrayList of specific types - * @param strParamValueList The string (assumed to be comma separated). Usually meant for use in creating - * parameter values for passing in IN Clauses - * @param type The type of the Arraylist passed - * @return ArrayList if passed value is not null or empty, null otherwise - */ - public static List convertStringToList(String strParamValueList,String type){ - if (strParamValueList==null||strParamValueList.trim().isEmpty()) return null; - ArrayList list = new ArrayList(); - String arr[] = strParamValueList.trim().split(COMMA_SEPARATOR); - for(String tmpString: arr){ - list.add(convert(tmpString,type)); - } - return list; - } - - /** - * given a variable list of String parameters, forms a hash map - * @param strParamValueList Variable list of arguments each of format: key=kevalue;type. - * For the type date,you can even pass the dateformat value as key=keyvalue@dateformat;type. - * If dateformat is not passed default format yyyy-MM-dd HH:mm:ss will be taken. - * @return HashMap if no arguments are passed, returns an empty list, else populated hashmap - * support only int, string, boolean, float, double, long, date - */ - public static HashMap createParameterList(String... strParamValueList){ - HashMap hMap = new HashMap(); - for(String strArg: strParamValueList){ - String type = null; - if(strArg.contains(TYPE_SEPARATOR)){ - type = strArg.split(TYPE_SEPARATOR)[1]; - strArg = strArg.split(TYPE_SEPARATOR)[0]; - } - if (strArg.contains(PARAM_SEPARATOR)){ - String arr[] = strArg.split(PARAM_SEPARATOR); - if (arr[1].contains(COMMA_SEPARATOR)){ - hMap.put(arr[0], convertStringToList(arr[1],type)); - } - else { - hMap.put(arr[0], convert(arr[1],type)); - } - } - } - return hMap; - } - - /** - * Converts the given String value to the intended type of Object - * @param value The String value to be converted - * @param type The type to which the value needs to be converted - * @return Object Returns values as such if type or value is empty or null,else returns the converted Object - */ - private static Object convert(String value, String types) { - - Class finalClass = null ; - //If value or type passed is null or empty or string return back value as such - if ((value == null) || value.isEmpty() || types == null || types.isEmpty() || types.equalsIgnoreCase(STRING_TYPE)) return value; - - String type = types.toLowerCase(); - - if (type.equals(DATE_TYPE)) return convertStringToDate(value); - - //Based on the passed type load the wrapper class. - //If the given type not permitted returns values as such - if(PRIMITIVE_NAME_TYPE_MAP.containsKey(type)) - finalClass = PRIMITIVE_NAME_TYPE_MAP.get(type); - - try { - //Invoking the valueOf method of the Wrapper Class dynamically using reflection - if(finalClass!=null){ - Method method = finalClass.getMethod(CONVERTOR_METHOD_NAME, String.class); - int mods = method.getModifiers(); - if (Modifier.isStatic(mods) && Modifier.isPublic(mods)) { - return method.invoke(null, value); - } - } - } - catch (NoSuchMethodException e) { - LoggerStackTraceUtil.printErrorMessage(e); - } - catch (IllegalAccessException e) { - // this won't happen - LoggerStackTraceUtil.printErrorMessage(e); - } - catch (InvocationTargetException e) { - // when this happens, the string cannot be converted to the intended type - // we are ignoring it here - the original string will be returned - LoggerStackTraceUtil.printErrorMessage(e); - } - - return value; - } - - /** - * Convert the given date value in string to date object - * @param dateString The date to be formatted - * @return Object Returns the corresponding Date object - */ - private static Object convertStringToDate(String dateString) { - String dateFormat = null; - Object finalDate = null; - String dateStringVal=null; - //If the incoming date string contains the format as well parse using the given format, else parse using default - dateFormat = (dateString.contains(DATEFORMAT_SEPARATOR)) ? dateString.split(DATEFORMAT_SEPARATOR)[1] : DATE_FORMAT ; - dateStringVal = (dateString.contains(DATEFORMAT_SEPARATOR)) ? dateString.split(DATEFORMAT_SEPARATOR)[0] : dateString ; - SimpleDateFormat dateFormatter = new SimpleDateFormat(dateFormat); - - try{ - finalDate = dateFormatter.parse(dateStringVal); - }catch(ParseException e){ - LoggerStackTraceUtil.printErrorMessage(e); - } - return finalDate; - } -} diff --git a/src/main/pmd/pmd.xsl b/src/main/pmd/pmd.xsl deleted file mode 100644 index 33eee081b..000000000 --- a/src/main/pmd/pmd.xsl +++ /dev/null @@ -1,275 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - PMD <xsl:value-of select="//pmd/@version"/> Report: Demo Utilities - - - - - - - - - -
-

PMD Report: Addressbook Web Application. Generated on

-
- - - -
- - - -
- - - -
- - - - -
- - - - -
- - - - -

Rules

- - - - - - - - - - - - - - - - - - - - - - - -
RuleViolationsSeverity
- [] - - -
- -
-
-
- - - - -

Files

- - - - - - - - - - - - - - - - - - - - - - - - - - - -
File
5
4
3
2
1
- - -
-
- - - - - - -

File

- - - - - - - - - - - - - - - - -
ViolationError DescriptionLine
-
-
- [.] - - - - - - - - - - - -
- Back to top -
- - - - -

Summary

- - - - - - - - - - - - - - - - - - - - -
FilesTotal
Priority 1: ShowStopper
Priority 2:Critical
Priority 3:Important/Urgent
Priority 4:Low - Change recommended
Priority 5:Low - Change Optional
-
- - - - - a - b - - -
- - - - diff --git a/src/main/pmd/ruleset_basics.xml b/src/main/pmd/ruleset_basics.xml deleted file mode 100644 index 99e5c5b65..000000000 --- a/src/main/pmd/ruleset_basics.xml +++ /dev/null @@ -1,120 +0,0 @@ - - - - These are the rules by which Applications will be built. - - - - 3 -3 -3 -3 -3 -3 -3 -5 -5 -5 -3 -5 -3 -5 -1 -2 -3 -3 -3 -2 -2 -2 -2 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 - 4 - 4 - 3 - 3 - 3 - 3 - 3 - 3 - 3 - 3 - 2 - 2 - 2 - 3 - 2 - 4 -4 -2 -3 -1 -2 -3 -2 -4 -3 -3 -3 -2 -2 -3 -3 -3 -1 -3 -3 -2 -3 -3 -2 -4 -3 -3 -3 -3 -2 -2 -5 -5 - diff --git a/src/main/pmd/ruleset_j2ee.xml b/src/main/pmd/ruleset_j2ee.xml deleted file mode 100644 index b249f1d31..000000000 --- a/src/main/pmd/ruleset_j2ee.xml +++ /dev/null @@ -1,328 +0,0 @@ - - - - These are the rules by which J2EE/Web Applications will be built. - - - - 3 - 3 - 3 - - - -Scripts should be part of Tag Libraries, rather than part of JSP pages. - - 2 - - - - 10) ] - ]]> - - - - - - - - - - - ]]> - - - - - -Scriptlets should be factored into Tag Libraries or JSP declarations, rather than being part of JSP pages. - - 3 - - - - - - - - - - -<% -response.setHeader("Pragma", "No-cache"); -%> - - - String title = "Hello world!"; - - - ]]> - - - - - or tags, or attributes like "align='center'". ]]> - - 3 - -

text

- ]]> -
-
- - - - -Do not use an attribute called 'class'. Use "styleclass" for CSS styles. - - 2 - - - - - - - - - -

Some text

- - ]]> -
-
- - - -Do not do a forward from within a JSP file. - - 3 - - - - - - - - - - ]]> - - - - - -IFrames which are missing a src element can cause security information popups in IE if you are accessing the page -through SSL. See http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q261188 - - 2 - - - - - - - - - bad example><BODY> -<iframe></iframe> -</BODY> </HTML> - -<HTML><title>good example><BODY> -<iframe src="foo"></iframe> -</BODY> </HTML> - ]]> - </example> - </rule> - - <rule name="NoHtmlComments" language="jsp" since="3.6" - message="Use JSP comments instead of HTML comments" - class="net.sourceforge.pmd.lang.rule.XPathRule" - externalInfoUrl="http://pmd.sourceforge.net/snapshot/pmd-jsp/rules/jsp/basic.html#NoHtmlComments"> - <description> - In a production system, HTML comments increase the payload - between the application server to the client, and serve - little other purpose. Consider switching to JSP comments. - </description> - <priority>2</priority> - <properties> - <property name="xpath"> - <value> - <![CDATA[ - //CommentTag - ]]> - </value> - </property> - </properties> - <example> - <![CDATA[ -<HTML><title>bad example><BODY> -<!-- HTML comment --> -</BODY> </HTML> - -<HTML><title>good example><BODY> -<%-- JSP comment --%> -</BODY> </HTML> - ]]> - </example> - </rule> - - <rule name="DuplicateJspImports" since="3.7" - message="Avoid duplicate imports such as ''{0}''" - class="net.sourceforge.pmd.lang.jsp.rule.basic.DuplicateJspImportsRule" - externalInfoUrl="http://pmd.sourceforge.net/snapshot/pmd-jsp/rules/jsp/basic.html#DuplicateJspImports"> - <description><![CDATA[Avoid duplicate import statements inside JSP's. ]]> - </description> - <priority>3</priority> - <example> - <![CDATA[ -<%@ page import=\"com.foo.MyClass,com.foo.MyClass\"%><html><body><b><img src=\"<%=Some.get()%>/foo\">xx</img>text</b></body></html> - ]]> - </example> - </rule> - - <rule name="JspEncoding" language="jsp" since="4.0" - class="net.sourceforge.pmd.lang.rule.XPathRule" - message="JSP file should use UTF-8 encoding" - externalInfoUrl="http://pmd.sourceforge.net/snapshot/pmd-jsp/rules/jsp/basic.html#JspEncoding"> - <description> - <![CDATA[ -A missing 'meta' tag or page directive will trigger this rule, as well as a non-UTF-8 charset. - ]]> - </description> - <priority>3</priority> - <properties> - <property name="xpath"> - <value> - <![CDATA[ -//Content[ -not(Element[@Name="meta"][ - Attribute[@Name="content"]/AttributeValue[contains(lower-case(@Image),"charset=utf-8")] -]) -and - not(JspDirective[@Name='page']/JspDirectiveAttribute[@Name='contentType'][contains(lower-case(@Value),"charset=utf-8")]) -] - ]]> - </value> - </property> - </properties> - <example> - <![CDATA[ - Most browsers should be able to interpret the following headers: - - <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> - - <meta http-equiv="Content-Type"  content="text/html; charset=UTF-8" /> - ]]> - </example> - </rule> - - <rule - name="NoInlineScript" language="jsp" since="4.0" - class="net.sourceforge.pmd.lang.rule.XPathRule" - message="Avoiding inlining HTML script content" - externalInfoUrl="http://pmd.sourceforge.net/snapshot/pmd-jsp/rules/jsp/basic.html#NoInlineScript"> - <description> - <![CDATA[ -Avoid inlining HTML script content. Consider externalizing the HTML script using the 'src' attribute on the <script> element. -Externalized script could be reused between pages. Browsers can also cache the script, reducing overall download bandwidth. - ]]> - </description> - <priority>3</priority> - <properties> - <property name="xpath"> - <value> - <![CDATA[ -//HtmlScript[@Image != ''] - ]]> - </value> - </property> - </properties> - <example> - <![CDATA[ - Most browsers should be able to interpret the following headers: - - <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> - - <meta http-equiv="Content-Type"  content="text/html; charset=UTF-8" /> - ]]> - </example> - </rule> - - <rule - name="NoUnsanitizedJSPExpression" since="5.1.4" - class="net.sourceforge.pmd.lang.jsp.rule.basic.NoUnsanitizedJSPExpressionRule" - message="Using unsanitized JSP expression can lead to Cross Site Scripting (XSS) attacks" - externalInfoUrl="http://pmd.sourceforge.net/snapshot/pmd-jsp/rules/jsp/basic.html#NoUnsanitizedJSPExpression"> - <description> -Avoid using expressions without escaping / sanitizing. This could lead to cross site scripting - as the expression -would be interpreted by the browser directly (e.g. "<script>alert('hello');</script>"). - </description> - <priority>3</priority> - <example> - <![CDATA[ -<%@ page contentType="text/html; charset=UTF-8" %> -<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> -${expression} <!-- don't use this --> -${fn:escapeXml(expression)} <!-- instead, escape it --> -<c:out value="${expression}" /> <!-- or use c:out --> - ]]> - </example> - </rule> - -</ruleset> diff --git a/src/main/pmd/ruleset_security.xml b/src/main/pmd/ruleset_security.xml deleted file mode 100644 index 68bf2adb9..000000000 --- a/src/main/pmd/ruleset_security.xml +++ /dev/null @@ -1,19 +0,0 @@ -<?xml version="1.0"?> - -<ruleset name="Rule Set - Security" - xmlns="http://pmd.sourceforge.net/ruleset/2.0.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd"> - <description>These rules check the security guidelines from Sun, published at http://java.sun.com/security/seccodeguide.html#gcg</description> - - -<!-- Priorities -HIGH :1 -MEDIUM_HIGH:2 -MEDIUM:3 -MEDIUM_LOW:4 -LOW : 5 ---> -<rule ref="rulesets/java/sunsecure.xml/MethodReturnsInternalArray"> <priority>3</priority></rule> -<rule ref="rulesets/java/sunsecure.xml/ArrayIsStoredDirectly"> <priority>3</priority></rule> -</ruleset> diff --git a/src/test/java/com/edurekademo/utilities/ExceptionThrower.java b/src/test/java/com/edurekademo/utilities/ExceptionThrower.java deleted file mode 100644 index dad8c99ed..000000000 --- a/src/test/java/com/edurekademo/utilities/ExceptionThrower.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.edurekademo.utilities; - -import java.io.IOException; - -import com.edurekademo.utilities.LoggerStackTraceUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class ExceptionThrower { - - private static final Logger LOG=LoggerFactory.getLogger(ExceptionThrower.class); - public void getCounter() { - int i = 1/0; // this will throw the error... - LOG.info(""+i); - } - - public void doNothing() throws IOException { - throw new IOException("TESTIOEXCEPTION"); - } - - private void doXXX() { - try { - doYYY(); - String s = null; - if("sss".equals(s)) { - LOG.info("ssss"); - } - } - catch (Exception e){ - LOG.error(new LoggerStackTraceUtil().getErrorMessage(e)); - } - } - - private void doYYY() { - LOG.error(new LoggerStackTraceUtil().getErrorMessage(new Exception("DEAR"))); - } - public void doCheck() throws Exception { - try { - doXXX(); - doNothing(); - } - catch (Exception e){ - throw new Exception("TEST MESSAGE"); - } - } -} diff --git a/src/test/java/com/edurekademo/utilities/TestGenericComparator.java b/src/test/java/com/edurekademo/utilities/TestGenericComparator.java deleted file mode 100644 index 28e4338b5..000000000 --- a/src/test/java/com/edurekademo/utilities/TestGenericComparator.java +++ /dev/null @@ -1,248 +0,0 @@ -package com.edurekademo.utilities; - -import java.util.ArrayList; -import java.util.Collections; - -import com.edurekademo.utilities.GenericComparator; -import com.edurekademo.utilities.CaseInsensitiveComparator; - -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; -import org.junit.*; -/** - * @author Seshagiri Sriram - * - */ - -@SuppressWarnings({"rawtypes","unchecked"}) - -public class TestGenericComparator - extends TestCase -{ - public void initialize(ArrayList myData) { - UnitDTO d1 = new UnitDTO(); - d1.setDeptID(100);d1.setEmpID(200);d1.setEmpName("Sriram");d1.setSpare(new Double(18.0));d1.setSpare2(new Double(18.0)); - UnitDTO d2 = new UnitDTO(); - d2.setDeptID(100);d2.setEmpID(201);d2.setEmpName("Somebody");d2.setSpare(new Double(11.0));d2.setSpare2(new Double(11.0)); - UnitDTO d3 = new UnitDTO(); - d3.setDeptID(100);d3.setEmpID(100);d3.setEmpName("Rajan");d3.setSpare(new Double(12.0));d3.setSpare2(new Double(12.0)); - UnitDTO d4 = new UnitDTO(); - d4.setDeptID(100);d4.setEmpID(102);d4.setEmpName("Vellman");d4.setSpare(new Double(10.0));d4.setSpare2(new Double(10.0)); - UnitDTO d5 = new UnitDTO(); - d5.setDeptID(100);d5.setEmpID(110);d5.setEmpName("Asma");d5.setSpare(new Double(10.0));d5.setSpare2(new Double(10.0)); - myData.add(d1); myData.add(d2); myData.add(d3); myData.add(d4); myData.add(d5); - - } - public void initialize2(ArrayList myData) { - UnitDTO d1 = new UnitDTO(); - d1.setDeptID(100);d1.setEmpID(200);d1.setEmpName("Sriram");d1.setSpare(new Double(18.0));d1.setSpare2("A"); - UnitDTO d2 = new UnitDTO(); - d2.setDeptID(100);d2.setEmpID(201);d2.setEmpName("Somebody");d2.setSpare(new Double(11.0));d2.setSpare2("B"); - UnitDTO d3 = new UnitDTO(); - d3.setDeptID(100);d3.setEmpID(100);d3.setEmpName("Rajan");d3.setSpare(new Double(12.0));d3.setSpare2("C"); - UnitDTO d4 = new UnitDTO(); - d4.setDeptID(100);d4.setEmpID(102);d4.setEmpName("Vellman");d4.setSpare(new Double(10.0));d4.setSpare2("D"); - UnitDTO d5 = new UnitDTO(); - d5.setDeptID(100);d5.setEmpID(110);d5.setEmpName("Asma");d5.setSpare(new Double(10.0));d5.setSpare2("Z"); - myData.add(d1); myData.add(d2); myData.add(d3); myData.add(d4); myData.add(d5); - - } - public void initialize3(ArrayList myData) { - UnitDTO d1 = new UnitDTO(); - d1.setDeptID(100);d1.setEmpID(200);d1.setEmpName("Sriram");d1.setSpare(new Double(18.0));d1.setSpare2("A"); - UnitDTO d2 = new UnitDTO(); - d2.setDeptID(100);d2.setEmpID(201);d2.setEmpName("asma");d2.setSpare(new Double(11.0));d2.setSpare2("B"); - UnitDTO d3 = new UnitDTO(); - d3.setDeptID(100);d3.setEmpID(100);d3.setEmpName("Rajan");d3.setSpare(new Double(12.0));d3.setSpare2("C"); - UnitDTO d4 = new UnitDTO(); - d4.setDeptID(100);d4.setEmpID(102);d4.setEmpName("Vellman");d4.setSpare(new Double(10.0));d4.setSpare2("D"); - UnitDTO d5 = new UnitDTO(); - d5.setDeptID(100);d5.setEmpID(110);d5.setEmpName("Asma");d5.setSpare(new Double(10.0));d5.setSpare2("Z"); - - UnitDTO d6 = new UnitDTO(); - d6.setDeptID(100);d6.setEmpID(110);d6.setEmpName("ASMA");d6.setSpare(new Double(10.0));d6.setSpare2("Z"); - - myData.add(d1); myData.add(d2); myData.add(d3); myData.add(d4); myData.add(d5); myData.add(d6); - - } - /** - * Create the test case - * - * @param testName name of the test case - */ - public TestGenericComparator( String testName ) - { - super( testName ); - } - - /** - * @return the suite of tests being tested - */ - public static Test suite() - { - return new TestSuite( TestGenericComparator.class ); - } - - - /** - * Test for Sorting by Emp Name Ascending - */ - public void testSortEmpNameAsc() { - ArrayList myData = new ArrayList(); initialize(myData); - Collections.sort(myData, new GenericComparator("empName", true)); // sort ascending.. - assertEquals("Asma", ((UnitDTO)myData.get(0)).getEmpName()); - } - - /** - * Test for Sorting by Emp Name Descending - */ - public void testSortEmpNameDesc() { - ArrayList myData = new ArrayList(); initialize(myData); - Collections.sort(myData, new GenericComparator("empName", false)); // sort ascending.. - assertEquals("Vellman", ((UnitDTO)myData.get(0)).getEmpName()); - - } - - - /** - * Test for Sorting by Emp ID Ascending - */ - @Ignore("testSortIDAsc") - public void testSortEmpIDAsc() { - ArrayList myData = new ArrayList(); initialize(myData); - - Collections.sort(myData, new GenericComparator("empID", true)); // sort ascending.. - assertEquals("Rajan", ((UnitDTO)myData.get(0)).getEmpName()); - } - - - /** - * Test for Sorting besy Emp ID Descending... - */ - - public void testSortEmpIDDesc() { - ArrayList myData = new ArrayList(); initialize(myData); - Collections.sort(myData, new GenericComparator("empID", false)); // sort Descending - assertEquals("Somebody", ((UnitDTO)myData.get(0)).getEmpName()); - - } - - /** - * Test for Sorting by spare Ascending - */ - public void testSortEmpSpareAsc() { - ArrayList myData = new ArrayList(); initialize(myData); - Collections.sort(myData, new GenericComparator("spare", true)); // sort ascending - assertEquals("Vellman", ((UnitDTO)myData.get(0)).getEmpName()); - } - - /** - * Test for Sorting by spare Descending - */ - public void testSortEmpSpareDesc() { - ArrayList myData = new ArrayList(); initialize(myData); - Collections.sort(myData, new GenericComparator("spare", false)); // sort Descending - assertEquals("Sriram", ((UnitDTO)myData.get(0)).getEmpName()); - - } - - - /** - * Test for Sorting by spare2 Descending - */ - public void testSortEmpSpareDesc2() { - ArrayList myData = new ArrayList(); initialize(myData); - - Collections.sort(myData, new GenericComparator("spare2", false)); // sort Descending - assertEquals("Sriram", ((UnitDTO)myData.get(0)).getEmpName()); - - } - - /** - * Test for Sorting by spare2 Ascending - */ - public void testSortEmpSpareAsc2() { - ArrayList myData = new ArrayList(); initialize(myData); - - Collections.sort(myData, new GenericComparator("spare2", true)); // sort ascending - assertEquals("Vellman", ((UnitDTO)myData.get(0)).getEmpName()); - - } - - /** - * Test for Sorting by spare2 Ascending - */ - public void testSortEmpSpare2StringAsc() { - ArrayList myData = new ArrayList(); initialize2(myData); - Collections.sort(myData, new GenericComparator("spare2", true)); // sort ascending - assertEquals("A", ((UnitDTO)myData.get(0)).getSpare2()); - } - - /** - * Test for Sorting by spare2 Desc - */ - public void testSortEmpSpare2StringDesc() { - ArrayList myData = new ArrayList(); initialize2(myData); - Collections.sort(myData, new GenericComparator("spare2", false)); // sort Descending - assertEquals("Z", ((UnitDTO)myData.get(0)).getSpare2()); - } - /** - * Test for Sorting by caseInsensitive Emp Name Ascending - */ - public void testSortEmpNameAscNewComparator() { - ArrayList myData = new ArrayList(); initialize3(myData); - Collections.sort(myData, new CaseInsensitiveComparator("empName", true)); // sort ascending.. - assertEquals("Asma".toUpperCase(), ((UnitDTO)myData.get(0)).getEmpName().toUpperCase()); - assertEquals("Asma".toUpperCase(), ((UnitDTO)myData.get(1)).getEmpName().toUpperCase()); - - } - - - - /** - * Test for Sorting caseInsensitive by Emp Name Ascending - */ - public void testSortEmpNameAscNewComparator3Element() { - ArrayList myData = new ArrayList(); initialize3(myData); - Collections.sort(myData, new CaseInsensitiveComparator("empName", true)); // sort ascending.. - assertEquals("Asma".toUpperCase(), ((UnitDTO)myData.get(0)).getEmpName().toUpperCase()); - assertEquals("Asma".toUpperCase(), ((UnitDTO)myData.get(1)).getEmpName().toUpperCase()); - assertEquals("Asma".toUpperCase(), ((UnitDTO)myData.get(2)).getEmpName().toUpperCase()); - - } - - /** - * Test for Sorting caseInsensitive by Emp Name Descending - */ - public void testSortEmpNameDescNewComparator3Element() { - ArrayList myData = new ArrayList(); initialize3(myData); - Collections.sort(myData, new CaseInsensitiveComparator("empName", false)); // sort ascending.. - assertEquals("Asma".toUpperCase(), ((UnitDTO)myData.get(3)).getEmpName().toUpperCase()); - assertEquals("Asma".toUpperCase(), ((UnitDTO)myData.get(4)).getEmpName().toUpperCase()); - assertEquals("Asma".toUpperCase(), ((UnitDTO)myData.get(5)).getEmpName().toUpperCase()); - - } - - public void testDoubleSort() { - ArrayList myData = new ArrayList(); - UnitDTO d1 = new UnitDTO(); - d1.setDeptID(100);d1.setEmpID(200);d1.setEmpName("A");d1.setSpare(new Double(18.0));d1.setSpare2(new Double(18.0)); - UnitDTO d2 = new UnitDTO(); - d2.setDeptID(100);d2.setEmpID(199);d2.setEmpName("D");d2.setSpare(new Double(11.0));d2.setSpare2(new Double(11.0)); - UnitDTO d3 = new UnitDTO(); - d3.setDeptID(100);d3.setEmpID(201);d3.setEmpName("C");d3.setSpare(new Double(12.0));d3.setSpare2(new Double(12.0)); - myData.add(d1); myData.add(d2); myData.add(d3); - Collections.sort(myData, new GenericComparator("empID", true)); // sort Asc - assertEquals (Integer.valueOf(3), writeList(myData)); - Collections.sort(myData, new GenericComparator("empName", true)); // sort Asc - assertEquals (Integer.valueOf(3), writeList(myData)); - assertFalse( ((UnitDTO)myData.get(1)).getEmpID() < ((UnitDTO)myData.get(2)).getEmpID()); - } - private Integer writeList(ArrayList s){ - Integer c = new Integer(s.size()); - return c; - } - - -} diff --git a/src/test/java/com/edurekademo/utilities/TestHexAsciiConversion.java b/src/test/java/com/edurekademo/utilities/TestHexAsciiConversion.java deleted file mode 100644 index 16e585052..000000000 --- a/src/test/java/com/edurekademo/utilities/TestHexAsciiConversion.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.edurekademo.utilities; - -import static org.junit.Assert.*; - -import com.edurekademo.utilities.HexAsciiConvertor; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Test; - - -public class TestHexAsciiConversion { - - HexAsciiConvertor conversion=new HexAsciiConvertor(); - String Value="testing ascii convertion into hexadecimal"; - String hexvalue="74657374696e6720617363696920636f6e76657274696f6e20696e746f2068657861646563696d616c"; - @BeforeClass - public static void setUpBeforeClass() throws Exception { - } - - @AfterClass - public static void tearDownAfterClass() throws Exception { - } - - @Test - public void testAsciiToHexValid() { - String hexadecimalValue= conversion.convertAsciiToHex(Value); - assertEquals(" ",hexadecimalValue, "74657374696e6720617363696920636f6e76657274696f6e20696e746f2068657861646563696d616c"); - System.out.println(hexadecimalValue); - } - - @Test - public void testAsciiToHexNull() - { - String hexvalueNull=conversion.convertHexToASCII(null); - assertNull("Result should be null", hexvalueNull); - - } - - @Test - - public void testHexToAsciiValid() - { - String asciiValue=conversion.convertHexToASCII(hexvalue); - - assertEquals(" ",asciiValue,"testing ascii convertion into hexadecimal"); - System.out.println(asciiValue); - } - - @Test - - public void testHextoAsciiNull() - { - String asciiValueNull=conversion.convertAsciiToHex(null); - assertNull("Result should be null", asciiValueNull); - - } - -} diff --git a/src/test/java/com/edurekademo/utilities/TestLogger.java b/src/test/java/com/edurekademo/utilities/TestLogger.java deleted file mode 100644 index db577c500..000000000 --- a/src/test/java/com/edurekademo/utilities/TestLogger.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.edurekademo.utilities; -import com.edurekademo.utilities.LoggerStackTraceUtil; -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class TestLogger { - - private static final Logger LOG = LoggerFactory.getLogger(TestLogger.class); - @Test - public void testGetErrorMessage1() { - String s = "Not Implemented"; - try { - int f = 1/0; - System.out.println(f); - } - catch (Exception e){ - LoggerStackTraceUtil util = new LoggerStackTraceUtil(); - s = util.getErrorMessage(e); - } - LOG.info(s); - assert(s.contains(System.getProperty("line.separator"))); - } - @Test - public void testGetErrorMessage2() { - String s = "Not Implemented"; - LoggerStackTraceUtil util = new LoggerStackTraceUtil(); - - try { - int f = 1/0; - LOG.info(""+f); - } - catch (Exception e){ - s = util.getErrorMessage(e); - } - LOG.info(s); - assert(s.contains("/ by zero")); - } - - @Test - public void testGetErrorMessage3() { - String s = "Not Implemented"; - try { - ExceptionThrower g = new ExceptionThrower(); - g.getCounter(); - } - catch (Exception e){ - LoggerStackTraceUtil util = new LoggerStackTraceUtil(); - s = util.getErrorMessage(e); - } - LOG.info(s); - assert(s.contains("/ by zero")); - } - - @Test - public void testGetErrorMessage4() { - String s = "Not Implemented"; - try { - ExceptionThrower g = new ExceptionThrower(); - g.doNothing(); - } - catch (Exception e){ - LoggerStackTraceUtil util = new LoggerStackTraceUtil(); - s = util.getErrorMessage(e); - } - LOG.info(s); - assert(s.contains("TESTIOEXCEPTION")); - } - - @Test - public void testGetErrorMessage5() { - String s = "Not Implemented"; - try { - ExceptionThrower g = new ExceptionThrower(); - g.doCheck(); - - } - catch (Exception e){ - LoggerStackTraceUtil util = new LoggerStackTraceUtil(); - s = util.getErrorMessage(e); - } - finally { - LOG.info(s); - System.out.println("***** "+s); - assert(s.contains("TEST MESSAGE")); - - } - } - -} diff --git a/src/test/java/com/edurekademo/utilities/UnitDTO.java b/src/test/java/com/edurekademo/utilities/UnitDTO.java deleted file mode 100644 index 67c92ad59..000000000 --- a/src/test/java/com/edurekademo/utilities/UnitDTO.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.edurekademo.utilities; - -public class UnitDTO { - - private Integer empID; - private String empName; - private Integer deptID; - private String dateofJoining; - private Double spare; - private Object spare2; - - public Integer getEmpID() { - return empID; - } - public void setEmpID(Integer empID) { - this.empID = empID; - } - public String getEmpName() { - return empName; - } - public void setEmpName(String empName) { - this.empName = empName; - } - public Integer getDeptID() { - return deptID; - } - public void setDeptID(Integer deptID) { - this.deptID = deptID; - } - public String getDateofJoining() { - return dateofJoining; - } - public void setDateofJoining(String dateofJoining) { - this.dateofJoining = dateofJoining; - } - public Double getSpare() { - return spare; - } - public void setSpare(Double spare) { - this.spare = spare; - } - public Object getSpare2() { - return spare2; - } - public void setSpare2(Object spare2) { - this.spare2 = spare2; - } - - public UnitDTO() { - } -} diff --git a/src/test/resources/Dateformat.properties b/src/test/resources/Dateformat.properties deleted file mode 100644 index 330e2c4d1..000000000 --- a/src/test/resources/Dateformat.properties +++ /dev/null @@ -1,4 +0,0 @@ -EXPECTED=yyyy-MM-dd -ACTUAL=dd-MM-yyyy -TIME=hh:mm:ss aa -TIMEIN=HH:mm:ss \ No newline at end of file

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 diff --git a/build.properties b/build.properties deleted file mode 100644 index 886c42fdf..000000000 --- a/build.properties +++ /dev/null @@ -1,60 +0,0 @@ -# ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- -# Copyright 2015, Seshagiri Sriram. All rights reserved. -# -# Created on: Feb 02, 2015, Seshagiri Sriram -# Updated: June 20,2016 fixed some property paths.. -# File Name : build.properties -# -# ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- -# ****** NOTE: ALL PARAMETERS AND VALUES IN THIS FILE ARE CASE SENSITIVE ****** -# ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- -# Properties file -# Modify the following properties before calling the ant build -# -# This build drops all the existing directories (mentioned in this properties file) before creating them -# The JAR file structure created by this build is -# |-- ReportGenerator.jar This is defined in build.xml -# | |-- META-INF -# |-- lib Third party jars -# |-- All property files go in here..... -# -# ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- -# Build Details -# ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- -# The below are general for *** ALL *** Projects and defined inside build.xml or passed via -D options. DO NOT CHANGE -# ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- -# |Property Description -# ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- -# |build.basesrcdir Location where the project is found. Passed to this script via -Dbasesrcdir= -# |maven.build.finalName Final name - hardcoded into build.xml e.g. X-1.0.0-SNAPSHOT.jar -# |maven.build.dir Location relative to buildsrcdir where build will be done. usually target -# |maven.build.outputDir Usually target/classes. -# |maven.build.srcdir location of source under buid.basesrcdir -# |maven.build.resourceDir location of resources under build.basesrcdir -# |maven.build.testDir Location of test classes -# |maven.build.testResourceDir Location of test resources -# |maven.build.testOutputDir Location of test class compilation -# |maven.test.reports Where test reports (from JUNIT) will be located. -# |maven.build.pmddir Location where PMD rules and XSL will belocated. -# |maven.reporting.outputDirectory Location of reports from PMD -# |project.3rdpartylibdir lib under build.basesrcdir -# |build.type dev,qa, or prod. passed via -Dbuildtype={dev|qa|prod} -# |environment.type.default Value if build.type is not passed. defaults to dev -- DO NOT CHANGE -# ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- - -# ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- -# Per User configuration..... Change for local environmnent -# ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- -# -# ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- -ant.home=c:/Apps/ant -project.build.outputDirectory=${maven.build.outputDir} -project.build.directory=${maven.build.dir} -maven.repo.local=e\:/repos -maven.settings.offline=false -project.build.sourceEncoding=UTF-8 -maven.settings.interactiveMode=false -maven.build.version=V1.2 -maven.test.skip=false -pmd.installpath=c:/Apps/pmd-bin-5.2.3/lib -# ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- diff --git a/build.xml b/build.xml deleted file mode 100644 index 246417e21..000000000 --- a/build.xml +++ /dev/null @@ -1,474 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - =================================== WARNING ========================================== - JUnit is not present in the test classpath or your $ANT_HOME/lib directory. Tests not executed. - ======================================================================================= - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Class Path: ${toString:cobertura.classpath} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/pom.xml b/pom.xml deleted file mode 100644 index f2b7c1429..000000000 --- a/pom.xml +++ /dev/null @@ -1,495 +0,0 @@ - - - 4.0.0 - com.edurekademo.tutorial - addressbook - war - 2.0 - Vaadin Addressbook example - - - UTF-8 - false - 8.0.0.alpha2 - ${vaadin.version} - - - - - vaadin-prereleases - Vaadin Pre-releases - https://maven.vaadin.com/vaadin-prereleases - - - - vaadin-addons - http://maven.vaadin.com/vaadin-addons - - - - vaadin-snapshots - http://oss.sonatype.org/content/repositories/vaadin-snapshots/ - - false - - - true - - - - - - - vaadin-snapshots - http://oss.sonatype.org/content/repositories/vaadin-snapshots/ - - false - - - true - - - - - - - - com.vaadin - vaadin-compatibility-server - ${vaadin.version} - - - com.vaadin - vaadin-compatibility-shared - ${vaadin.version} - - - com.vaadin - vaadin-compatibility-client-compiled - ${vaadin.version} - - - com.vaadin - vaadin-themes - ${vaadin.version} - - - javax.servlet - javax.servlet-api - 3.0.1 - compile - - - - commons-beanutils - commons-beanutils - 1.9.2 - jar - - - - - log4j - log4j - 1.2.9 - - - org.slf4j - slf4j-api - 1.7.7 - - - org.slf4j - slf4j-simple - 1.7.7 - - - org.slf4j - slf4j-log4j12 - 1.7.7 - - - - - junit - junit - 4.7 - test - - - - - - commons-httpclient - commons-httpclient - 3.1 - - - - org.apache.commons - commons-lang3 - 3.1 - - - - - org.json - json - 20140107 - - - org.codehaus.jackson - jackson-jaxrs - 1.9.4 - - - - - com.sun.xml.security - xml-security-impl - 1.0 - - - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.2 - - 1.8 - 1.8 - - - - org.eclipse.jetty - jetty-maven-plugin - 9.2.3.v20140905 - - - - org.apache.maven.plugins - maven-surefire-plugin - 2.19.1 - - methods - 10 - - **/Test*.java - **/Test.java - **/TestCase.java - - - **/*Abstract*Test.java - - - - - - addressbook - - - - - - - org.apache.maven.plugins - maven-surefire-report-plugin - 2.19.1 - - - - - - - development - - true - - - - - metrics - - - - - - - - - - - - - - - - - - - - - org.apache.maven.plugins - maven-pmd-plugin - 3.2 - - 1.8 - true - xml - - 20 - - true - 2 - - - - - - findbugs-maven-plugin - 2.4.0 - - Max - true - - - - - - - maven3 - - true - - - - - org.apache.maven.plugins - maven-enforcer-plugin - 1.0 - - - enforce-versions - - enforce - - - - - [3.0,) - - - - - - - - org.apache.maven.plugins - maven-site-plugin - 3.3 - - - - maven-project-info-reports-plugin - 2.7 - - - org.jacoco - jacoco-maven-plugin - 0.7.2.201409121644 - - - org.apache.maven.plugins - maven-checkstyle-plugin - 3.0.1 - - - - - - org.apache.maven.plugins - maven-pmd-plugin - 3.2 - - 1.8 - true - xml - - /pmd-rules.xml - - - 20 - true - - - - org.codehaus.mojo - findbugs-maven-plugin - 2.4.0 - - Max - true - - - - maven-javadoc-plugin - 2.9.1 - - 1.8 - - gr.spinellis.umlgraph.doclet.UmlGraphDoc - - - gr.spinellis - UmlGraph - 4.6 - - - -inferrel -inferdep -hide java.* -collpackages - java.util.* -attributes -operations - -enumerations -enumconstants - - - - - org.apache.maven.plugins - maven-jxr-plugin - 2.4 - - - - - - com.edurekademo.tutorial - addressbook - ${project.version} - - - - - - - - maven2 - - - - org.apache.maven.plugins - maven-enforcer-plugin - 1.0 - - - enforce-versions - - enforce - - - - - [2.0.9, 2.2.1] - - - - - - - - org.apache.maven.plugins - maven-site-plugin - 2.1.1 - - - com.edurekademo.tutorial - addressbook - ${project.version} - - - - - - - - - org.codehaus.mojo - cobertura-maven-plugin - ${cobertura.version} - - - html - xml - - - - - org.apache.maven.plugins - maven-pmd-plugin - 2.5 - - 1.8 - true - xml - - /pmd-rules.xml - - - 20 - true - - - - - org.apache.maven.plugins - maven-checkstyle-plugin - 2.9.1 - - addressbook-build/checkstyle.xml - - - - org.codehaus.mojo - findbugs-maven-plugin - 2.4.0 - - Max - true - - - - maven-javadoc-plugin - 2.7 - - 1.8 - - gr.spinellis.umlgraph.doclet.UmlGraphDoc - - - gr.spinellis - UmlGraph - 4.6 - - - -inferrel -inferdep -hide java.* -collpackages - java.util.* -attributes -operations - -enumerations -enumconstants - - - - - org.apache.maven.plugins - maven-jxr-plugin - 2.1 - - - - - - - diff --git a/src/main/java/com/edurekademo/helper/GenericResourceBundle.java b/src/main/java/com/edurekademo/helper/GenericResourceBundle.java deleted file mode 100644 index c75801bae..000000000 --- a/src/main/java/com/edurekademo/helper/GenericResourceBundle.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.edurekademo.helper; - -import java.util.Enumeration; -import java.util.ResourceBundle; - -public class GenericResourceBundle { - public static String getProperties(String source){ - ResourceBundle rb = ResourceBundle.getBundle("ResourceBundle"); - Enumeration keys = rb.getKeys(); - String value=""; - while (keys.hasMoreElements()) { - - String key = keys.nextElement(); - - if(key.equalsIgnoreCase(source)){ - value = rb.getString(key); - } - } - return value; - } - -} - diff --git a/src/main/java/com/edurekademo/tutorial/addressbook/AddressbookUI.java b/src/main/java/com/edurekademo/tutorial/addressbook/AddressbookUI.java deleted file mode 100644 index 5f2c878b7..000000000 --- a/src/main/java/com/edurekademo/tutorial/addressbook/AddressbookUI.java +++ /dev/null @@ -1,149 +0,0 @@ -package com.edurekademo.tutorial.addressbook; - -import javax.servlet.annotation.WebServlet; - -import com.vaadin.annotations.Theme; -import com.vaadin.annotations.Title; -import com.vaadin.annotations.VaadinServletConfiguration; -import com.vaadin.annotations.Widgetset; -import com.vaadin.server.VaadinRequest; -import com.vaadin.server.VaadinServlet; -import com.edurekademo.tutorial.addressbook.backend.Contact; -import com.edurekademo.tutorial.addressbook.backend.ContactService; -import com.vaadin.ui.Button; -import com.vaadin.ui.HorizontalLayout; -import com.vaadin.ui.UI; -import com.vaadin.ui.VerticalLayout; -import com.vaadin.v7.data.util.BeanItemContainer; -import com.vaadin.v7.ui.Grid; -import com.vaadin.v7.ui.TextField; - -/* User Interface written in Java. - * - * Define the user interface shown on the Vaadin generated web page by extending the UI class. - * By default, a new UI instance is automatically created when the page is loaded. To reuse - * the same instance, add @PreserveOnRefresh. - */ -@Title("Addressbook") -@Theme("valo") -@Widgetset("com.vaadin.v7.Vaadin7WidgetSet") -public class AddressbookUI extends UI { - - /* - * Hundreds of widgets. Vaadin's user interface components are just Java - * objects that encapsulate and handle cross-browser support and - * client-server communication. The default Vaadin components are in the - * com.vaadin.ui package and there are over 500 more in - * vaadin.com/directory. - */ - TextField filter = new TextField(); - Grid contactList = new Grid(); - Button newContact = new Button("New contact"); - - // ContactForm is an example of a custom component class - ContactForm contactForm = new ContactForm(); - - // ContactService is a in-memory mock DAO that mimics - // a real-world datasource. Typically implemented for - // example as EJB or Spring Data based service. - ContactService service = ContactService.createDemoService(); - - /* - * The "Main method". - * - * This is the entry point method executed to initialize and configure the - * visible user interface. Executed on every browser reload because a new - * instance is created for each web page loaded. - */ - @Override - protected void init(VaadinRequest request) { - configureComponents(); - buildLayout(); - } - - private void configureComponents() { - /* - * Synchronous event handling. - * - * Receive user interaction events on the server-side. This allows you - * to synchronously handle those events. Vaadin automatically sends only - * the needed changes to the web page without loading a new page. - */ - newContact.addClickListener(e -> contactForm.edit(new Contact())); - - filter.setInputPrompt("Filter contacts..."); - filter.addTextChangeListener(e -> refreshContacts(e.getText())); - - contactList - .setContainerDataSource(new BeanItemContainer<>(Contact.class)); - contactList.setColumnOrder("firstName", "lastName", "email"); - contactList.removeColumn("id"); - contactList.removeColumn("birthDate"); - contactList.removeColumn("phone"); - contactList.setSelectionMode(Grid.SelectionMode.SINGLE); - contactList.addSelectionListener( - e -> contactForm.edit((Contact) contactList.getSelectedRow())); - refreshContacts(); - } - - /* - * Robust layouts. - * - * Layouts are components that contain other components. HorizontalLayout - * contains TextField and Button. It is wrapped with a Grid into - * VerticalLayout for the left side of the screen. Allow user to resize the - * components with a SplitPanel. - * - * In addition to programmatically building layout in Java, you may also - * choose to setup layout declaratively with Vaadin Designer, CSS and HTML. - */ - private void buildLayout() { - HorizontalLayout actions = new HorizontalLayout(filter, newContact); - actions.setWidth("100%"); - filter.setWidth("100%"); - actions.setExpandRatio(filter, 1); - - VerticalLayout left = new VerticalLayout(actions, contactList); - left.setSizeFull(); - contactList.setSizeFull(); - left.setExpandRatio(contactList, 1); - - HorizontalLayout mainLayout = new HorizontalLayout(left, contactForm); - mainLayout.setSizeFull(); - mainLayout.setExpandRatio(left, 1); - - // Split and allow resizing - setContent(mainLayout); - } - - /* - * Choose the design patterns you like. - * - * It is good practice to have separate data access methods that handle the - * back-end access and/or the user interface updates. You can further split - * your code into classes to easier maintenance. With Vaadin you can follow - * MVC, MVP or any other design pattern you choose. - */ - void refreshContacts() { - refreshContacts(filter.getValue()); - } - - private void refreshContacts(String stringFilter) { - contactList.setContainerDataSource(new BeanItemContainer<>( - Contact.class, service.findAll(stringFilter))); - contactForm.setVisible(false); - } - - /* - * Deployed as a Servlet or Portlet. - * - * You can specify additional servlet parameters like the URI and UI class - * name and turn on production mode when you have finished developing the - * application. - */ - @WebServlet(urlPatterns = "/*") - @VaadinServletConfiguration(ui = AddressbookUI.class, productionMode = false) - public static class MyUIServlet extends VaadinServlet { - } - -} diff --git a/src/main/java/com/edurekademo/tutorial/addressbook/ContactForm.java b/src/main/java/com/edurekademo/tutorial/addressbook/ContactForm.java deleted file mode 100644 index 6a4d0ac26..000000000 --- a/src/main/java/com/edurekademo/tutorial/addressbook/ContactForm.java +++ /dev/null @@ -1,116 +0,0 @@ -package com.edurekademo.tutorial.addressbook; - -import com.vaadin.event.ShortcutAction; -import com.edurekademo.tutorial.addressbook.backend.Contact; -import com.vaadin.ui.Button; -import com.vaadin.ui.FormLayout; -import com.vaadin.ui.HorizontalLayout; -import com.vaadin.ui.Notification; -import com.vaadin.ui.Notification.Type; -import com.vaadin.ui.themes.ValoTheme; -import com.vaadin.v7.data.fieldgroup.BeanFieldGroup; -import com.vaadin.v7.data.fieldgroup.FieldGroup; -import com.vaadin.v7.ui.DateField; -import com.vaadin.v7.ui.TextField; - -/* Create custom UI Components. - * - * Create your own Vaadin components by inheritance and composition. - * This is a form component inherited from VerticalLayout. Use - * Use BeanFieldGroup to bind data fields from DTO to UI fields. - * Similarly named field by naming convention or customized - * with @PropertyId annotation. - */ -public class ContactForm extends FormLayout { - - Button save = new Button("Save", this::save); - Button cancel = new Button("Cancel", this::cancel); - TextField firstName = new TextField("First name"); - TextField lastName = new TextField("Last name"); - TextField phone = new TextField("Phone"); - TextField email = new TextField("Email"); - DateField birthDate = new DateField("Birth date"); - - Contact contact; - - // Easily bind forms to beans and manage validation and buffering - BeanFieldGroup formFieldBindings; - - public ContactForm() { - configureComponents(); - buildLayout(); - } - - private void configureComponents() { - /* - * Highlight primary actions. - * - * With Vaadin built-in styles you can highlight the primary save button - * and give it a keyboard shortcut for a better UX. - */ - save.setStyleName(ValoTheme.BUTTON_PRIMARY); - save.setClickShortcut(ShortcutAction.KeyCode.ENTER); - setVisible(false); - } - - private void buildLayout() { - setSizeUndefined(); - setMargin(true); - - HorizontalLayout actions = new HorizontalLayout(save, cancel); - actions.setSpacing(true); - - addComponents(actions, firstName, lastName, phone, email, birthDate); - } - - /* - * Use any JVM language. - * - * Vaadin supports all languages supported by Java Virtual Machine 1.6+. - * This allows you to program user interface in Java 8, Scala, Groovy or any - * other language you choose. The new languages give you very powerful tools - * for organizing your code as you choose. For example, you can implement - * the listener methods in your compositions or in separate controller - * classes and receive to various Vaadin component events, like button - * clicks. Or keep it simple and compact with Lambda expressions. - */ - public void save(Button.ClickEvent event) { - try { - // Commit the fields from UI to DAO - formFieldBindings.commit(); - - // Save DAO to backend with direct synchronous service API - getUI().service.save(contact); - - String msg = String.format("Saved '%s %s'.", contact.getFirstName(), - contact.getLastName()); - Notification.show(msg, Type.TRAY_NOTIFICATION); - getUI().refreshContacts(); - } catch (FieldGroup.CommitException e) { - // Validation exceptions could be shown here - } - } - - public void cancel(Button.ClickEvent event) { - // Place to call business logic. - Notification.show("Cancelled", Type.TRAY_NOTIFICATION); - getUI().contactList.select(null); - } - - void edit(Contact contact) { - this.contact = contact; - if (contact != null) { - // Bind the properties of the contact POJO to fiels in this form - formFieldBindings = BeanFieldGroup.bindFieldsBuffered(contact, - this); - firstName.focus(); - } - setVisible(contact != null); - } - - @Override - public AddressbookUI getUI() { - return (AddressbookUI) super.getUI(); - } - -} diff --git a/src/main/java/com/edurekademo/tutorial/addressbook/backend/Contact.java b/src/main/java/com/edurekademo/tutorial/addressbook/backend/Contact.java deleted file mode 100644 index 79adab965..000000000 --- a/src/main/java/com/edurekademo/tutorial/addressbook/backend/Contact.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.edurekademo.tutorial.addressbook.backend; - -import org.apache.commons.beanutils.BeanUtils; - -import java.io.Serializable; -import java.util.Date; - -/** - * A simple DTO for the address book example. - * - * Serializable and cloneable Java Object that are typically persisted - * in the database and can also be easily converted to different formats like JSON. - */ -// Backend DTO class. This is just a typical Java backend implementation -// class and nothing Vaadin specific. -public class Contact implements Serializable, Cloneable { - - private Long id; - - private String firstName = ""; - private String lastName = ""; - private String phone = ""; - private String email = ""; - private Date birthDate; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getFirstName() { - return firstName; - } - - public void setFirstName(String firstName) { - this.firstName = firstName; - } - - public String getLastName() { - return lastName; - } - - public void setLastName(String lastName) { - this.lastName = lastName; - } - - public String getPhone() { - return phone; - } - - public void setPhone(String phone) { - this.phone = phone; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public Date getBirthDate() { - return birthDate; - } - - public void setBirthDate(Date birthDate) { - this.birthDate = birthDate; - } - - @Override - public Contact clone() throws CloneNotSupportedException { - try { - return (Contact) BeanUtils.cloneBean(this); - } catch (Exception ex) { - throw new CloneNotSupportedException(); - } - } - - @Override - public String toString() { - return "Contact{" + "id=" + id + ", firstName=" + firstName - + ", lastName=" + lastName + ", phone=" + phone + ", email=" - + email + ", birthDate=" + birthDate + '}'; - } - -} diff --git a/src/main/java/com/edurekademo/tutorial/addressbook/backend/ContactService.java b/src/main/java/com/edurekademo/tutorial/addressbook/backend/ContactService.java deleted file mode 100644 index 34da9ecb4..000000000 --- a/src/main/java/com/edurekademo/tutorial/addressbook/backend/ContactService.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.edurekademo.tutorial.addressbook.backend; - -import org.apache.commons.beanutils.BeanUtils; - -import java.util.*; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** Separate Java service class. - * Backend implementation for the address book application, with "detached entities" - * simulating real world DAO. Typically these something that the Java EE - * or Spring backend services provide. - */ -// Backend service class. This is just a typical Java backend implementation -// class and nothing Vaadin specific. -public class ContactService { - - // Create dummy data by randomly combining first and last names - static String[] fnames = { "Peter", "Alice", "John", "Mike", "Olivia", - "Nina", "Alex", "Rita", "Dan", "Umberto", "Henrik", "Rene", "Lisa", - "Linda", "Timothy", "Daniel", "Brian", "George", "Scott", - "Jennifer" }; - static String[] lnames = { "Smith", "Johnson", "Williams", "Jones", - "Brown", "Davis", "Miller", "Wilson", "Moore", "Taylor", - "Anderson", "Thomas", "Jackson", "White", "Harris", "Martin", - "Thompson", "Young", "King", "Robinson" }; - - private static ContactService instance; - - public static ContactService createDemoService() { - if (instance == null) { - - final ContactService contactService = new ContactService(); - - Random r = new Random(0); - Calendar cal = Calendar.getInstance(); - for (int i = 0; i < 100; i++) { - Contact contact = new Contact(); - contact.setFirstName(fnames[r.nextInt(fnames.length)]); - contact.setLastName(lnames[r.nextInt(fnames.length)]); - contact.setEmail(contact.getFirstName().toLowerCase() + "@" - + contact.getLastName().toLowerCase() + ".com"); - contact.setPhone("+ 358 555 " + (100 + r.nextInt(900))); - cal.set(1930 + r.nextInt(70), - r.nextInt(11), r.nextInt(28)); - contact.setBirthDate(cal.getTime()); - contactService.save(contact); - } - instance = contactService; - } - - return instance; - } - - private HashMap contacts = new HashMap<>(); - private long nextId = 0; - - public synchronized List findAll(String stringFilter) { - ArrayList arrayList = new ArrayList(); - for (Contact contact : contacts.values()) { - try { - boolean passesFilter = (stringFilter == null || stringFilter.isEmpty()) - || contact.toString().toLowerCase() - .contains(stringFilter.toLowerCase()); - if (passesFilter) { - arrayList.add(contact.clone()); - } - } catch (CloneNotSupportedException ex) { - Logger.getLogger(ContactService.class.getName()).log( - Level.SEVERE, null, ex); - } - } - Collections.sort(arrayList, new Comparator() { - - @Override - public int compare(Contact o1, Contact o2) { - return (int) (o2.getId() - o1.getId()); - } - }); - return arrayList; - } - - public synchronized long count() { - return contacts.size(); - } - - public synchronized void delete(Contact value) { - contacts.remove(value.getId()); - } - - public synchronized void save(Contact entry) { - if (entry.getId() == null) { - entry.setId(nextId++); - } - try { - entry = (Contact) BeanUtils.cloneBean(entry); - } catch (Exception ex) { - throw new RuntimeException(ex); - } - contacts.put(entry.getId(), entry); - } - -} diff --git a/src/main/java/com/edurekademo/utilities/CaseInsensitiveComparator.java b/src/main/java/com/edurekademo/utilities/CaseInsensitiveComparator.java deleted file mode 100644 index cee7d853e..000000000 --- a/src/main/java/com/edurekademo/utilities/CaseInsensitiveComparator.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.edurekademo.utilities; - -import java.lang.reflect.InvocationTargetException; -import java.util.Date; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class CaseInsensitiveComparator extends GenericComparator { - - private static final long serialVersionUID = -6836701171640412573L; - private static final Logger LOG =LoggerFactory.getLogger(CaseInsensitiveComparator.class); - - /* - * This function call base GenericComparator(boolean sortAscending) class and set whether sorting is in ascending or descending - * sortAscending = true then ascending - * sortAscending = false then descending - */ - public CaseInsensitiveComparator(boolean sortAscending) { - super(sortAscending); - this.targetMethod = null; - this.sortAscending = sortAscending; - } - /* - * This function call base GenericComparator(boolean sortField) class and set which field we need to sort and sort as asc - */ - public CaseInsensitiveComparator(String sortField) { - super(sortField); - this.targetMethod = prepareTargetMethod(sortField); - this.sortAscending = true; - } - /* - * This function call base GenericComparator(boolean sortField,sortAscending) class and set which field we need to sort and sort based on the boolen value given - * sortAscending = true then ascending - * sortAscending = false then descending - */ - public CaseInsensitiveComparator(String sortField, boolean sortAscending) { - super(sortField, sortAscending); - this.targetMethod = prepareTargetMethod(sortField); - this.sortAscending = sortAscending; - } - - /* - * (non-Javadoc) - * @see com.edurekademo.utilities.GenericComparator#compare(java.lang.Object, java.lang.Object) - */ - public int compare(Object o1, Object o2) { - int response = LESSER; - Object v1,v2; - String returnType; - try { - if(this.targetMethod==null){ - v1=o1; - v2=02; - returnType=o1.getClass().getName(); - }else{ - v1=getValue(o1); - v2=getValue(o2); - returnType=getMethod(o1).getReturnType().getName(); - } - - CompareMode cm = findCompareMode(v1, v2); - if (!cm.equals(CompareMode.DEFAULT)) { - return compareAlternate(cm); - } - response = compareActual(v1, v2, returnType); - } - catch (NoSuchMethodException e){LOG.error(new LoggerStackTraceUtil().getErrorMessage(e));} - catch (IllegalAccessException e){LOG.error(new LoggerStackTraceUtil().getErrorMessage(e));} - catch (InvocationTargetException e){LOG.error(new LoggerStackTraceUtil().getErrorMessage(e));} - return response; - } - /* - * This Method is the overridden compareActual of GenericComparator. - * If the data type is String then it convert string to upper case and compare it with other. - */ - protected int compareActual(Object v1, Object v2, String returnType) { - String obj = returnType; - if ("java.lang.Object".equals(obj) && v1!=null) { - obj = v1.getClass().getName(); - } - int acutal = LESSER; - if (obj.equals(DATATYPE_INTEGER)) { - acutal = ((Integer) v1).compareTo((Integer) v2) * determinePosition(); - } else if (obj.equals(DATATYPE_LONG)) { - acutal = ((Long) v1).compareTo((Long) v2) * determinePosition(); - } else if (obj.equals(DATATYPE_STRING)) { - acutal = ((String) v1).toUpperCase().compareTo(((String) v2).toUpperCase()) * determinePosition(); - } else if (obj.equals(DATATYPE_DATE)) { - acutal = ((Date) v1).compareTo((Date) v2) * determinePosition(); - } else if (obj.equals(DATATYPE_FLOAT)) { - acutal = ((Float) v1).compareTo((Float) v2) * determinePosition(); - } else if (obj.equals(DATATYPE_DOUBLE)) { - acutal = ((Double) v1).compareTo((Double) v2) * determinePosition(); - } - return acutal; - } - -} diff --git a/src/main/java/com/edurekademo/utilities/GenericComparator.java b/src/main/java/com/edurekademo/utilities/GenericComparator.java deleted file mode 100644 index 3309221ed..000000000 --- a/src/main/java/com/edurekademo/utilities/GenericComparator.java +++ /dev/null @@ -1,277 +0,0 @@ -package com.edurekademo.utilities; -import java.io.Serializable; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.Comparator; -import java.util.Date; - -/** -* Sorting - Generic Comparator -* -* @author Seshagiri Sriram -* @version 1.0 -* @since Janauary 12, 2015 -* -* This is an adaptation of a genenic comparator found on github linked from myjeeva.com -* Many thanks for the code! -*/ - -@SuppressWarnings("rawtypes") -public class GenericComparator implements Comparator, Serializable { - protected static final long serialVersionUID = -2293914106471884607L; - protected static final int LESSER = -1; - protected static final int EQUAL = 0; - protected static final int GREATER = 1; - protected static final String METHOD_GET_PREFIX = "get"; - protected static final String DATATYPE_STRING = "java.lang.String"; - protected static final String DATATYPE_DATE = "java.util.Date"; - protected static final String DATATYPE_INTEGER = "java.lang.Integer"; - protected static final String DATATYPE_LONG = "java.lang.Long"; - protected static final String DATATYPE_FLOAT = "java.lang.Float"; - protected static final String DATATYPE_DOUBLE = "java.lang.Double"; - protected static final String DATATYPE_BOOLEAN = "java.lang.Boolean"; - - protected enum CompareMode { EQUAL, LESS_THAN, GREATER_THAN, DEFAULT } - // generic comparator attributes - protected String targetMethod; - protected boolean sortAscending; - - /** - *