alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

Struts example source code file (CsvStore.js)

This example Struts source code file (CsvStore.js) is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Java - Struts tags/keywords

array, array, regexp, regexp, string, string

The Struts CsvStore.js source code

/*
	Copyright (c) 2004-2006, The Dojo Foundation
	All Rights Reserved.

	Licensed under the Academic Free License version 2.1 or above OR the
	modified BSD license. For more information on Dojo licensing, see:

		http://dojotoolkit.org/community/licensing.shtml
*/

dojo.provide("dojo.data.csv.CsvStore");
dojo.require("dojo.data.Read");
dojo.require("dojo.lang.assert");

dojo.declare("dojo.data.csv.CsvStore", dojo.data.Read, {
	/* summary:
	 *   The CsvStore implements the dojo.data.Read API.  
	 */
	 
	/* examples:
	 *   var csvStore = new dojo.data.csv.CsvStore({url:"movies.csv");
	 *   var csvStore = new dojo.data.csv.CsvStore({url:"http://example.com/movies.csv");
	 *   var fileContents = dojo.hostenv.getText("movies.csv");
	 *   var csvStore = new dojo.data.csv.CsvStore({string:fileContents);
	 */
	initializer: 
		function(/* object */ keywordParameters) {
			// keywordParameters: {string: String, url: String}
			this._arrayOfItems = [];
			this._loadFinished = false;
			this._csvFileUrl = keywordParameters["url"];
			this._csvFileContents = keywordParameters["string"];
		},
	get:
		function(/* item */ item, /* attribute or attribute-name-string */ attribute, /* value? */ defaultValue) {
			// summary: See dojo.data.Read.get()
			var attributeValue = item[attribute] || defaultValue;
			return attributeValue; // a literal, an item, null, or undefined (never an array)
		},
	getValues:
		function(/* item */ item, /* attribute or attribute-name-string */ attribute) {
			// summary: See dojo.data.Read.getValues()
			var array = [this.get(item, attribute)];
			return array; // an array that may contain literals and items
		},
	getAttributes:
		function(/* item */ item) {
			// summary: See dojo.data.Read.getAttributes()
			var array = this._arrayOfKeys;
			return array; // array
		},
	hasAttribute:
		function(/* item */ item, /* attribute or attribute-name-string */ attribute) {
			// summary: See dojo.data.Read.hasAttribute()
			for (var i in this._arrayOfKeys) {
				if (this._arrayOfKeys[i] == attribute) {
					return true;
				}
			}
			return false; // boolean
		},
	hasAttributeValue:
		function(/* item */ item, /* attribute or attribute-name-string */ attribute, /* anything */ value) {
			// summary: See dojo.data.Read.hasAttributeValue()
			return (this.get(item, attribute) == value); // boolean
		},
	isItem:
		function(/* anything */ something) {
			// summary: See dojo.data.Read.isItem()
			for (var i in this._arrayOfItems) {
				if (this._arrayOfItems[i] == something) {
					return true;
				}
			}
			return false; // boolean
		},
	find:
		function(/* implementation-dependent */ query, /* object */ optionalKeywordArgs ) {
			// summary: See dojo.data.Read.find()
			if (!this._loadFinished) {
				if (this._csvFileUrl) {
					this._csvFileContents = dojo.hostenv.getText(this._csvFileUrl);
				}
				var arrayOfArrays = this._getArrayOfArraysFromCsvFileContents(this._csvFileContents);
				if (arrayOfArrays.length == 0) {
					this._arrayOfKeys = [];
				} else {
					this._arrayOfKeys = arrayOfArrays[0];
				}
				this._arrayOfItems = this._getArrayOfItemsFromArrayOfArrays(arrayOfArrays);
			}
			var result = new dojo.data.csv.Result(this._arrayOfItems, this);
			return result; // dojo.data.csv.Result
		},
	getIdentity:
		function(/* item */ item) {
			// summary: See dojo.data.Read.getIdentity()
			for (var i in this._arrayOfItems) {
				if (this._arrayOfItems[i] == item) {
					return i;
				}
			}
			return null; // boolean
		},
	getByIdentity:
		function(/* string */ id) {
			// summary: See dojo.data.Read.getByIdentity()
			var i = parseInt(id);
			if (i < this._arrayOfItems.length) {
				return this._arrayOfItems[i];
			} else {
				return null;
			}
		},

	// -------------------------------------------------------------------
	// Private methods
	_getArrayOfArraysFromCsvFileContents:
		function(/* string */ csvFileContents) {
			/* summary:
			 *   Parses a string of CSV records into a nested array structure.
			 * description:
			 *   Given a string containing CSV records, this method parses
			 *   the string and returns a data structure containing the parsed
			 *   content.  The data structure we return is an array of length
			 *   R, where R is the number of rows (lines) in the CSV data.  The 
			 *   return array contains one sub-array for each CSV line, and each 
			 *   sub-array contains C string values, where C is the number of 
			 *   columns in the CSV data.
			 */
			 
			/* example:
			 *   For example, given this CSV string as input:
			 *     "Title, Year, Producer \n Alien, 1979, Ridley Scott \n Blade Runner, 1982, Ridley Scott"
			 *   We will return this data structure:
			 *     [["Title", "Year", "Producer"]
			 *      ["Alien", "1979", "Ridley Scott"],  
			 *      ["Blade Runner", "1982", "Ridley Scott"]]
			 */
			dojo.lang.assertType(csvFileContents, String);
			
			var lineEndingCharacters = new RegExp("\r\n|\n|\r");
			var leadingWhiteSpaceCharacters = new RegExp("^\\s+",'g');
			var trailingWhiteSpaceCharacters = new RegExp("\\s+$",'g');
			var doubleQuotes = new RegExp('""','g');
			var arrayOfOutputRecords = [];
			
			var arrayOfInputLines = csvFileContents.split(lineEndingCharacters);
			for (var i in arrayOfInputLines) {
				var singleLine = arrayOfInputLines[i];
				if (singleLine.length > 0) {
					var listOfFields = singleLine.split(',');
					var j = 0;
					while (j < listOfFields.length) {
						var space_field_space = listOfFields[j];
						var field_space = space_field_space.replace(leadingWhiteSpaceCharacters, ''); // trim leading whitespace
						var field = field_space.replace(trailingWhiteSpaceCharacters, ''); // trim trailing whitespace
						var firstChar = field.charAt(0);
						var lastChar = field.charAt(field.length - 1);
						var secondToLastChar = field.charAt(field.length - 2);
						var thirdToLastChar = field.charAt(field.length - 3);
						if ((firstChar == '"') && 
								((lastChar != '"') || 
								 ((lastChar == '"') && (secondToLastChar == '"') && (thirdToLastChar != '"')) )) {
							if (j+1 === listOfFields.length) {
								// alert("The last field in record " + i + " is corrupted:\n" + field);
								return null;
							}
							var nextField = listOfFields[j+1];
							listOfFields[j] = field_space + ',' + nextField;
							listOfFields.splice(j+1, 1); // delete element [j+1] from the list
						} else {
							if ((firstChar == '"') && (lastChar == '"')) {
								field = field.slice(1, (field.length - 1)); // trim the " characters off the ends
								field = field.replace(doubleQuotes, '"');   // replace "" with "
							}
							listOfFields[j] = field;
							j += 1;
						}
					}
					arrayOfOutputRecords.push(listOfFields);
				}
			}
			return arrayOfOutputRecords; // Array
		},

	_getArrayOfItemsFromArrayOfArrays:
		function(/* array */ arrayOfArrays) {
			/* summary:
			 *   Converts a nested array structure into an array of keyword objects.
			 */
			 
			/* example:
			 *   For example, given this as input:
			 *     [["Title", "Year", "Producer"]
			 *      ["Alien", "1979", "Ridley Scott"],  
			 *      ["Blade Runner", "1982", "Ridley Scott"]]
			 *   We will return this as output:
			 *     [{"Title":"Alien", "Year":"1979", "Producer":"Ridley Scott"},
			 *      {"Title":"Blade Runner", "Year":"1982", "Producer":"Ridley Scott"}]
			 */
			dojo.lang.assertType(arrayOfArrays, Array);
			var arrayOfItems = [];
			if (arrayOfArrays.length > 1) {
				var arrayOfKeys = arrayOfArrays[0];
				for (var i = 1; i < arrayOfArrays.length; ++i) {
					var row = arrayOfArrays[i];
					var item = {};
					for (var j in row) {
						var value = row[j];
						var key = arrayOfKeys[j];
						item[key] = value;
					}
					arrayOfItems.push(item);
				}
			}
			return arrayOfItems; // Array
		}
});

Other Struts examples (source code examples)

Here is a short list of links related to this Struts CsvStore.js source code file:

... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.