/**
* Sencha GXT 3.0.0b - Sencha for GWT
* Copyright(c) 2007-2012, Sencha, Inc.
* licensing@sencha.com
*
* http://www.sencha.com/products/gxt/license/
*/
package com.sencha.gxt.examples.resources.server;
import java.io.File;
import java.io.FilenameFilter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.sencha.gxt.core.client.util.DateWrapper;
import com.sencha.gxt.data.shared.SortInfo;
import com.sencha.gxt.data.shared.loader.FilterConfig;
import com.sencha.gxt.data.shared.loader.FilterPagingLoadConfig;
import com.sencha.gxt.data.shared.loader.PagingLoadConfig;
import com.sencha.gxt.data.shared.loader.PagingLoadResult;
import com.sencha.gxt.data.shared.loader.PagingLoadResultBean;
import com.sencha.gxt.examples.resources.client.ExampleService;
import com.sencha.gxt.examples.resources.client.TestData;
import com.sencha.gxt.examples.resources.client.model.BaseDto;
import com.sencha.gxt.examples.resources.client.model.FolderDto;
import com.sencha.gxt.examples.resources.client.model.MusicDto;
import com.sencha.gxt.examples.resources.client.model.Photo;
import com.sencha.gxt.examples.resources.client.model.Post;
import com.sencha.gxt.examples.resources.client.model.Stock;
import com.sencha.gxt.examples.resources.server.data.Folder;
import com.sencha.gxt.examples.resources.server.data.Music;
public class ExampleServiceImpl extends RemoteServiceServlet implements ExampleService {
private List<Post> posts;
private List<Photo> photos;
private List<Stock> stocks;
@Override
public List<BaseDto> getMusicFolderChildren(FolderDto folder) {
Folder f = null;
if (folder == null) {
f = Folder.getRootFolder();
} else {
f = Folder.findFolder(folder.getId());
}
List<BaseDto> children = new ArrayList<BaseDto>();
for (Folder sub : f.getSubFolders()) {
children.add(new FolderDto(sub.getId(), sub.getName()));
}
for (Music m : f.getChildren()) {
children.add(new MusicDto(m.getId(), m.getName(), m.getGenre(), m.getAuthor()));
}
return children;
}
@Override
public FolderDto getMusicRootFolder() {
Folder root = Folder.getRootFolder();
FolderDto rootDto = new FolderDto(root.getId(), root.getName());
processFolder(root, rootDto);
return rootDto;
}
@Override
public List<Photo> getPhotos() {
if (photos == null) {
loadPhotos();
}
return photos;
}
@Override
public PagingLoadResult<Post> getPosts(PagingLoadConfig config) {
if (posts == null) {
loadPosts();
}
if (config.getSortInfo().size() > 0) {
SortInfo sort = config.getSortInfo().get(0);
if (sort.getSortField() != null) {
final String sortField = sort.getSortField();
if (sortField != null) {
Collections.sort(posts, sort.getSortDir().comparator(new Comparator<Post>() {
public int compare(Post p1, Post p2) {
if (sortField.equals("forum")) {
return p1.getForum().compareTo(p2.getForum());
} else if (sortField.equals("username")) {
return p1.getUsername().compareTo(p2.getUsername());
} else if (sortField.equals("subject")) {
return p1.getSubject().compareTo(p2.getSubject());
} else if (sortField.equals("date")) {
return p1.getDate().compareTo(p2.getDate());
}
return 0;
}
}));
}
}
}
ArrayList<Post> sublist = new ArrayList<Post>();
int start = config.getOffset();
int limit = posts.size();
if (config.getLimit() > 0) {
limit = Math.min(start + config.getLimit(), limit);
}
for (int i = config.getOffset(); i < limit; i++) {
sublist.add(posts.get(i));
}
return new PagingLoadResultBean<Post>(sublist, posts.size(), config.getOffset());
}
@Override
public PagingLoadResult<Stock> getStocks(FilterPagingLoadConfig config) {
if (stocks == null) {
stocks = TestData.getStocks();
}
ArrayList<Stock> temp = new ArrayList<Stock>();
ArrayList<Stock> remove = new ArrayList<Stock>();
for (Stock s : stocks) {
temp.add(s);
}
if (config.getSortInfo().size() > 0) {
SortInfo sort = config.getSortInfo().get(0);
if (sort.getSortField() != null) {
final String sortField = sort.getSortField();
if (sortField != null) {
Collections.sort(temp, sort.getSortDir().comparator(new Comparator<Stock>() {
public int compare(Stock s1, Stock s2) {
if (sortField.equals("name")) {
return s1.getName().compareTo(s2.getName());
} else if (sortField.equals("lastTrans")) {
return s1.getLastTrans().compareTo(s2.getLastTrans());
} else if (sortField.equals("split")) {
Boolean b1 = s1.isSplit();
Boolean b2 = s2.isSplit();
return b1.compareTo(b2);
} else if (sortField.equals("industry")) {
return s1.getIndustry().compareTo(s2.getIndustry());
}
return 0;
}
}));
}
}
}
List<FilterConfig> filters = config.getFilters();
for (FilterConfig f : filters) {
String type = f.getType();
String test = f.getValue();
String path = f.getField();
String comparison = f.getComparison();
String safeTest = test == null ? "" : test.toString();
for (Stock s : stocks) {
String value = getStockValue(s, path);
String safeValue = value == null ? null : value.toString();
if (safeTest.length() == 0 && (safeValue == null || safeValue.length() == 0)) {
continue;
} else if (safeValue == null) {
remove.add(s);
continue;
}
if ("string".equals(type)) {
if (safeValue.toLowerCase().indexOf(safeTest.toLowerCase()) == -1) {
remove.add(s);
}
} else if ("date".equals(type)) {
if (isDateFiltered(safeTest, comparison, safeValue)) {
remove.add(s);
}
} else if ("boolean".equals(type)) {
if (isBooleanFiltered(safeTest, comparison, safeValue)) {
remove.add(s);
}
} else if ("list".equals(type)) {
if (isListFiltered(safeTest, safeValue)) {
remove.add(s);
}
} else if ("numeric".equals(type)) {
if (isNumberFiltered(safeTest, comparison, safeValue)) {
remove.add(s);
}
}
}
}
for (Stock s : remove) {
temp.remove(s);
}
ArrayList<Stock> sublist = new ArrayList<Stock>();
int start = config.getOffset();
int limit = temp.size();
if (config.getLimit() > 0) {
limit = Math.min(start + config.getLimit(), limit);
}
for (int i = config.getOffset(); i < limit; i++) {
sublist.add(temp.get(i));
}
return new PagingLoadResultBean<Stock>(sublist, temp.size(), config.getOffset());
}
private String getStockValue(Stock s, String property) {
if (property.equals("name")) {
return s.getName();
} else if (property.equals("lastTrans")) {
return String.valueOf(s.getLastTrans().getTime());
} else if (property.equals("split")) {
return String.valueOf(s.isSplit());
} else if (property.equals("last")) {
return String.valueOf(s.getLast());
} else if (property.equals("industry")) {
return s.getIndustry();
}
return "";
}
private String getValue(NodeList fields, int index) {
NodeList list = fields.item(index).getChildNodes();
if (list.getLength() > 0) {
return list.item(0).getNodeValue();
} else {
return "";
}
}
private boolean isBooleanFiltered(String test, String comparison, String value) {
if (value == null) {
return true;
}
boolean t = Boolean.valueOf(test);
boolean v = Boolean.parseBoolean(value);
return t != v;
}
private boolean isDateFiltered(String test, String comparison, String value) {
Date t = new Date(Long.valueOf(test));
Date v = new Date(Long.valueOf(value));
if (value == null) {
return false;
}
if ("after".equals(comparison)) {
return v.before(t);
} else if ("before".equals(comparison)) {
return v.after(t);
} else if ("on".equals(comparison)) {
t = new DateWrapper(t).resetTime().asDate();
v = new DateWrapper(v).resetTime().asDate();
return !v.equals(t);
}
return true;
}
private boolean isListFiltered(String test, String value) {
String[] tests = test.split("::");
for (int i = 0; i < tests.length; i++) {
if (tests[i].equals(value)) {
return false;
}
}
return true;
}
private boolean isNumberFiltered(String test, String comparison, String value) {
if (value == null) {
return false;
}
double t = Double.valueOf(test);
double v = Double.valueOf(value);
if ("gt".equals(comparison)) {
return t >= v;
} else if ("lt".equals(comparison)) {
return t <= v;
} else if ("eq".equals(comparison)) {
return t != v;
}
return false;
}
private void loadPhotos() {
photos = new ArrayList<Photo>();
String url = getThreadLocalRequest().getSession().getServletContext().getRealPath("/examples/images/photos");
// %20 will be converted to a space
File folder = new File(url);
File[] pics = folder.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
return !name.startsWith(".");
}
});
Arrays.sort(pics, new Comparator<File>() {
public int compare(File o1, File o2) {
return o1.getName().compareTo(o2.getName());
}
});
for (File pic : pics) {
Photo photo = new Photo();
photo.setName(pic.getName());
photo.setDate(new Date(pic.lastModified()));
photo.setSize(pic.length());
photo.setPath("examples/images/photos/" + pic.getName());
photos.add(photo);
}
}
private void loadPosts() {
posts = new ArrayList<Post>();
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(getClass().getResourceAsStream("posts.xml"));
doc.getDocumentElement().normalize();
NodeList nodeList = doc.getElementsByTagName("row");
for (int s = 0; s < nodeList.getLength(); s++) {
Node fstNode = nodeList.item(s);
if (fstNode.getNodeType() == Node.ELEMENT_NODE) {
Element fstElmnt = (Element) fstNode;
NodeList fields = fstElmnt.getElementsByTagName("field");
Post p = new Post();
p.setForum(getValue(fields, 0));
p.setDate(sf.parse(getValue(fields, 1)));
p.setSubject(getValue(fields, 2));
p.setUsername(getValue(fields, 4));
posts.add(p);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void processFolder(Folder folder, FolderDto folderDto) {
List<BaseDto> children = new ArrayList<BaseDto>();
for (Folder f : folder.getSubFolders()) {
FolderDto sub = new FolderDto(f.getId(), f.getName());
processFolder(f, sub);
children.add(sub);
}
for (Music m : folder.getChildren()) {
MusicDto musicDto = new MusicDto(m.getId(), m.getName(), m.getGenre(), m.getAuthor());
children.add(musicDto);
}
folderDto.setChildren(children);
}
}