package org.openswing.swing.table.profiles.client;
import java.io.*;
import java.math.*;
import java.text.*;
import java.util.*;
import org.openswing.swing.message.send.java.*;
import org.openswing.swing.table.profiles.java.*;
import org.openswing.swing.util.java.Consts;
/**
* <p>Title: OpenSwing Framework</p>
* <p>Description: Grid profile manager: it manages grid profile storing and fetching.
* This implementation is based on the file system: it stores and retrieves user profiles from the user's local file system.
* User profile files are stored in the default user home.</p>
* <p>Copyright: Copyright (C) 2006 Mauro Carniel</p>
*
* <p> This file is part of OpenSwing Framework.
* This library is free software; you can redistribute it and/or
* modify it under the terms of the (LGPL) Lesser General Public
* License as published by the Free Software Foundation;
*
* GNU LESSER GENERAL PUBLIC LICENSE
* Version 2.1, February 1999
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* The author may be contacted at:
* maurocarniel@tin.it</p>
*
* @author Mauro Carniel
* @version 1.0
*/
public class FileGridProfileManager extends GridProfileManager {
private SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
public FileGridProfileManager() {
}
/**
* @param functionId identifier (functionId) associated to the grid
* @return list of GridProfileDescription objects
* @throws Throwable throwed if fetching operation does not correctly accomplished
*/
public ArrayList getUserProfiles(final String functionId) throws Throwable {
String userHome = System.getProperty("user.home").replace('\\','/');
if (!userHome.endsWith("/"))
userHome += "/";
userHome += "profiles";
File dir = new File(userHome);
File[] files = dir.listFiles(new FileFilter() {
public boolean accept(File pathname) {
return
pathname.getName().startsWith(functionId.replace(' ','_')+"_"+getUsername().replace(' ','_')+"_") &&
pathname.getName().endsWith(".cfg");
}
});
ArrayList profiles = new ArrayList();
GridProfile profile = null;
if (files!=null)
for(int i=0;i<files.length;i++) {
try {
profile = getUserProfile(functionId, files[i].getName());
}
catch (Throwable ex) {
}
if (profile!=null)
profiles.add(new GridProfileDescription(files[i].getName(),profile.getDescription(),profile.isDefaultProfile()));
}
return profiles;
}
/**
* @return default user profile; null if the default profile has not been yet stored
* @throws Throwable throwed if fetching operation does not correctly accomplished
*/
public final GridProfile getDefaultProfile(final String functionId) throws Throwable {
String userHome = System.getProperty("user.home").replace('\\','/');
if (!userHome.endsWith("/"))
userHome += "/";
userHome += "profiles";
File dir = new File(userHome);
File[] files = dir.listFiles(new FileFilter() {
public boolean accept(File pathname) {
return
pathname.getName().startsWith(functionId.replace(' ','_')+"_"+getUsername().replace(' ','_')+"_") &&
pathname.getName().endsWith(".cfg");
}
});
GridProfile profile = null;
if (files!=null)
for(int i=0;i<files.length;i++) {
profile = getUserProfile(functionId,files[i].getName());
if (profile.isDefaultProfile())
return profile;
}
return null;
}
/**
* @param id grid profile identifier
* @return user profile
* @throws Throwable throwed if fetching operation does not correctly accomplished
*/
public GridProfile getUserProfile(String functionId,Object id) throws Throwable {
String userHome = System.getProperty("user.home").replace('\\','/');
if (!userHome.endsWith("/"))
userHome += "/";
userHome += "profiles";
File dir = new File(userHome);
File f = new File(userHome+"/"+id);
if (!f.exists())
throw new IOException("File not found: "+id);
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(new FileInputStream(f)));
String description = br.readLine(); // description
functionId = br.readLine(); // functionId
String username = br.readLine(); // username
String aux = br.readLine(); // currentSortedColumns
ArrayList currentSortedColumns = new ArrayList();
StringTokenizer st = new StringTokenizer(aux,",");
while(st.hasMoreTokens())
currentSortedColumns.add( st.nextToken() );
aux = br.readLine(); // currentSortedVersusColumns
ArrayList currentSortedVersusColumns = new ArrayList();
st = new StringTokenizer(aux,",");
while(st.hasMoreTokens())
currentSortedVersusColumns.add( st.nextToken() );
aux = br.readLine(); // columnsAttribute
st = new StringTokenizer(aux,",");
int cols = st.countTokens();
String[] columnsAttribute = new String[cols];
int i = 0;
while(st.hasMoreTokens())
columnsAttribute[i++] = st.nextToken();
aux = br.readLine(); // columnsVisibility
boolean[] columnsVisibility = new boolean[cols];
st = new StringTokenizer(aux,",");
i = 0;
while(st.hasMoreTokens())
columnsVisibility[i++] = st.nextToken().toLowerCase().equals("true");
aux = br.readLine(); // columnsWidth
int[] columnsWidth = new int[cols];
st = new StringTokenizer(aux,",");
i = 0;
while(st.hasMoreTokens())
columnsWidth[i++] = Integer.parseInt( st.nextToken().trim() );
aux = br.readLine(); // defaultProfile
boolean defaultProfile = aux.toLowerCase().endsWith("true");
// quickFilterValues
HashMap quickFilterValues = new HashMap(); // hashtable which contains the associations: attribute name, new FilterWhereClause[2] {FilterWhereClause,FilterWhereClause})
String attributeName = null;
String operator1,typevalue1,operator2,typevalue2;
Object value1,value2;
FilterWhereClause[] filter = new FilterWhereClause[2];
ArrayList values = null;
String[] tokens = null;
while((aux = br.readLine())!=null) { // aux = attribute name,operator1,typevalue1,value1a\tvalue1b\tvalue1c[,operator2,typevalue2,value2...]
filter = new FilterWhereClause[2];
st = new StringTokenizer(aux,",");
attributeName = st.nextToken();
operator1 = st.nextToken();
typevalue1 = st.nextToken();
value1 = st.nextToken();
tokens = value1.toString().split("\t");
if (tokens.length==1 && !operator1.equals(Consts.IN)) {
if (typevalue1.equals("D"))
value1 = sdf.parse(value1.toString());
else if (typevalue1.equals("N"))
value1 = new BigDecimal(value1.toString());
}
else {
values = new ArrayList();
for(int j=0;j<tokens.length;j++)
if (typevalue1.equals("D"))
values.add(sdf.parse(tokens[j]));
else if (typevalue1.equals("N"))
values.add(new BigDecimal(tokens[j]));
else
values.add(tokens[j]);
value1 = values;
}
filter[0] = new FilterWhereClause(attributeName,operator1,value1);
if (st.hasMoreTokens()) {
operator2 = st.nextToken();
typevalue2 = st.nextToken();
value2 = st.nextToken();
tokens = value2.toString().split("\t");
if (tokens.length==1 && !operator2.equals(Consts.IN)) {
if (typevalue1.equals("D"))
value2 = sdf.parse(value2.toString());
else if (typevalue1.equals("N"))
value2 = new BigDecimal(value2.toString());
}
else {
values = new ArrayList();
for(int j=0;j<tokens.length;j++)
if (typevalue2.equals("D"))
values.add(sdf.parse(tokens[j]));
else if (typevalue2.equals("N"))
values.add(new BigDecimal(tokens[j]));
else
values.add(tokens[j]);
value2 = values;
}
filter[1] = new FilterWhereClause(attributeName,operator2,value2);
}
else
filter[1] = null;
quickFilterValues.put( attributeName,filter );
}
return new GridProfile(
id,
description, // description
functionId, // functionId
username, // username
currentSortedColumns, // currentSortedColumns
currentSortedVersusColumns, // currentSortedVersusColumns
quickFilterValues, // quickFilterValues
columnsAttribute, // columnsAttribute
columnsVisibility, // columnsVisibility
columnsWidth, // columnsWidth
defaultProfile // defaultProfile
);
}
catch (Throwable t) {
throw new IOException(t.getMessage());
}
finally {
try {
br.close();
}
catch (Exception ex) {
}
}
}
/**
* Store the specified grid profile.
* @param profile profile to store
* @return profile id
* @throws Throwable throwed if storing operation does not correctly accomplished
* Note: if profile.getId() is null then this method must define id property.
*/
public Object storeUserProfile(GridProfile profile) throws Throwable {
if (profile.getId()==null)
profile.setId(
profile.getFunctionId().replace(' ','_')+"_"+getUsername().replace(' ','_')+"_"+System.currentTimeMillis()+".cfg"
);
String userHome = System.getProperty("user.home").replace('\\','/');
if (!userHome.endsWith("/"))
userHome += "/";
userHome += "profiles";
File dir = new File(userHome);
dir.mkdirs();
File f = new File(userHome+"/"+profile.getId());
if (f.exists())
f.delete();
PrintWriter pw = null;
try {
pw = new PrintWriter(new FileOutputStream(f));
pw.println(profile.getDescription());
pw.println(profile.getFunctionId());
pw.println(profile.getUsername());
String currentSortedColumns = "";
for(int i=0;i<profile.getCurrentSortedColumns().size();i++)
currentSortedColumns += profile.getCurrentSortedColumns().get(i)+",";
if (currentSortedColumns.length()>0)
currentSortedColumns = currentSortedColumns.substring(0,currentSortedColumns.length()-1);
pw.println(currentSortedColumns);
String currentSortedVersusColumns = "";
for(int i=0;i<profile.getCurrentSortedVersusColumns().size();i++)
currentSortedVersusColumns += profile.getCurrentSortedVersusColumns().get(i)+",";
if (currentSortedVersusColumns.length()>0)
currentSortedVersusColumns = currentSortedVersusColumns.substring(0,currentSortedVersusColumns.length()-1);
pw.println(currentSortedVersusColumns);
String columnsAttribute = "";
for(int i=0;i<profile.getColumnsAttribute().length;i++)
columnsAttribute += profile.getColumnsAttribute()[i]+",";
if (columnsAttribute.length()>0)
columnsAttribute = columnsAttribute.substring(0,columnsAttribute.length()-1);
pw.println(columnsAttribute);
String columnsVisibility = "";
for(int i=0;i<profile.getColumnsVisibility().length;i++)
columnsVisibility += profile.getColumnsVisibility()[i]+",";
if (columnsVisibility.length()>0)
columnsVisibility = columnsVisibility.substring(0,columnsVisibility.length()-1);
pw.println(columnsVisibility);
String columnsWidth = "";
for(int i=0;i<profile.getColumnsWidth().length;i++)
columnsWidth += profile.getColumnsWidth()[i]+",";
if (columnsWidth.length()>0)
columnsWidth = columnsWidth.substring(0,columnsWidth.length()-1);
pw.println(columnsWidth);
pw.println(profile.isDefaultProfile());
Iterator it = profile.getQuickFilterValues().keySet().iterator();
String aux = "";
FilterWhereClause[] filter = null;
String attributeName = null;
while(it.hasNext()) {
attributeName = it.next().toString();
filter = (FilterWhereClause[])profile.getQuickFilterValues().get(attributeName);
aux = attributeName+","+filter[0].getOperator()+",";
if (filter[0].getValue()!=null) {
if (filter[0].getOperator().equals(Consts.IN) || filter[0].getValue() instanceof ArrayList) {
ArrayList values = (ArrayList)filter[0].getValue();
if (values.size()>0)
if (values.get(0) instanceof Date)
aux += "D,";
else if (values.get(0) instanceof Number)
aux += "N,";
else
aux += "T,";
for(int j=0;j<values.size();j++)
if (values.get(j) instanceof Date)
aux += sdf.format( values.get(j) )+"\t";
else if (values.get(j) instanceof Number)
aux += values.get(j)+"\t";
else
aux += values.get(j)+"\t";
}
else {
if (filter[0].getValue() instanceof Date)
aux += "D,"+sdf.format( filter[0].getValue() );
else if (filter[0].getValue() instanceof Number)
aux += "N,"+filter[0].getValue();
else
aux += "T,"+filter[0].getValue();
}
}
if (filter[1]!=null) {
aux += ","+filter[1].getOperator()+",";
if (filter[1].getValue()!=null) {
if (filter[1].getOperator().equals(Consts.IN) || filter[1].getValue() instanceof ArrayList) {
ArrayList values = (ArrayList)filter[1].getValue();
if (values.size()>0)
if (values.get(0) instanceof Date)
aux += "D,";
else if (values.get(0) instanceof Number)
aux += "N,";
else
aux += "T,";
for(int j=0;j<values.size();j++)
if (values.get(j) instanceof Date)
aux += sdf.format( values.get(j) )+"\t";
else if (values.get(j) instanceof Number)
aux += values.get(j)+"\t";
else
aux += values.get(j)+"\t";
}
else {
if (filter[1].getValue() instanceof Date)
aux += "D,"+sdf.format( filter[1].getValue() );
else if (filter[1].getValue() instanceof Number)
aux += "N,"+filter[1].getValue();
else
aux += "T,"+filter[1].getValue();
}
}
}
pw.println(aux);
}
return profile.getId();
}
catch (Throwable t) {
throw new IOException(t.getMessage());
}
finally {
try {
pw.close();
}
catch (Exception ex) {
}
}
}
/**
* Delete the specified grid profile.
* @param id grid profile identifier
* @throws Throwable throwed if deleting operation does not correctly accomplished
*/
public void deleteUserProfile(String functionId,Object id) throws Throwable {
String userHome = System.getProperty("user.home").replace('\\','/');
if (!userHome.endsWith("/"))
userHome += "/";
userHome += "profiles";
File dir = new File(userHome);
dir.mkdirs();
File f = new File(userHome+"/"+id);
if (f.exists())
f.delete();
else
throw new IOException("File not found: "+id);
}
/**
* Delete all grid profiles, independently from the current user.
* This method is automatically invoked if "grid digest" comparison lead to discover a grid change: in this case all grid profiles must be removed.
* @param functionId identifier (functionId) associated to the grid
* @throws Throwable throwed if deleting operation does not correctly accomplished
*/
public void deleteAllGridProfiles(final String functionId) throws Throwable {
String userHome = System.getProperty("user.home").replace('\\','/');
if (!userHome.endsWith("/"))
userHome += "/";
userHome += "profiles";
File dir = new File(userHome);
File[] files = dir.listFiles(new FileFilter() {
public boolean accept(File pathname) {
return
pathname.getName().indexOf(functionId.replace(' ','_')+"_")!=-1 &&
pathname.getName().endsWith(".cfg");
}
});
if (files!=null)
for(int i=0;i<files.length;i++) {
files[i].delete();
}
}
/**
* Store the "grid digest", i.e. a value that globally identify the current grid configuration.
* @throws Throwable throwed if storing operation does not correctly accomplished
*/
public void storeGridDigest(String functionId,String gridDigest) throws Throwable {
String userHome = System.getProperty("user.home").replace('\\','/');
if (!userHome.endsWith("/"))
userHome += "/";
userHome += "profiles";
File dir = new File(userHome);
dir.mkdirs();
File f = new File(userHome+"/"+functionId.replace(' ','_')+".dig");
if (f.exists())
f.delete();
PrintWriter pw = null;
try {
pw = new PrintWriter(new FileOutputStream(f));
pw.println(gridDigest);
} catch (Throwable ex){
throw new IOException(ex.getMessage());
}
finally {
try {
pw.close();
}
catch (Exception ex1) {
}
}
}
/**
* @return retrieve the "grid digest", i.e. a value that globally identify the current grid configuration; this digest is used to check if grid columns have been changed from last grid execution: in this case all grid profiles will be deleted
* @throws Throwable throwed if fetching operation does not correctly accomplished
* Note: this method returns null if no digest has been yet stored (i.e. this is the first time the grid is being viewed)
*/
public String getLastGridDigest(String functionId) throws Throwable {
String userHome = System.getProperty("user.home").replace('\\','/');
if (!userHome.endsWith("/"))
userHome += "/";
userHome += "profiles";
File dir = new File(userHome);
dir.mkdirs();
File f = new File(userHome+"/"+functionId.replace(' ','_')+".dig");
if (!f.exists())
return null;
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(new FileInputStream(f)));
return br.readLine();
} catch (Throwable ex){
throw new IOException(ex.getMessage());
}
finally {
try {
br.close();
}
catch (Exception ex1) {
}
}
}
/**
* @return retrieve the last profile identifier in action
* @throws Throwable throwed if fetching operation does not correctly accomplished
* Note: this method returns null if no profile identifier has been yet stored (i.e. this is the first time the grid is being viewed)
*/
public Object getLastGridProfileId(String functionId) throws Throwable {
String userHome = System.getProperty("user.home").replace('\\','/');
if (!userHome.endsWith("/"))
userHome += "/";
userHome += "profiles";
File dir = new File(userHome);
dir.mkdirs();
File f = new File(userHome+"/"+functionId.replace(' ','_')+"_"+getUsername().replace(' ','_')+".ini");
if (!f.exists())
return null;
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(new FileInputStream(f)));
return br.readLine();
} catch (Throwable ex){
throw new IOException(ex.getMessage());
}
finally {
try {
br.close();
}
catch (Exception ex1) {
}
}
}
/**
* Store the current profile identifier in action.
* @throws Throwable throwed if storing operation does not correctly accomplished
*/
public void storeGridProfileId(String functionId,Object id) throws Throwable {
String userHome = System.getProperty("user.home").replace('\\','/');
if (!userHome.endsWith("/"))
userHome += "/";
userHome += "profiles";
File dir = new File(userHome);
dir.mkdirs();
File f = new File(userHome+"/"+functionId.replace(' ','_')+"_"+getUsername().replace(' ','_')+".ini");
if (f.exists())
f.delete();
PrintWriter pw = null;
try {
pw = new PrintWriter(new FileOutputStream(f));
pw.println(id);
} catch (Throwable ex){
throw new IOException(ex.getMessage());
}
finally {
try {
pw.close();
}
catch (Exception ex1) {
}
}
}
/**
* Delete all grid profiles identifiers for the current user.
* This method is automatically invoked if "grid digest" comparison lead to discover a grid change.
* @throws Throwable throwed if storing operation does not correctly accomplished
*/
public void deleteAllGridProfileIds(String functionId) throws Throwable {
String userHome = System.getProperty("user.home").replace('\\','/');
if (!userHome.endsWith("/"))
userHome += "/";
userHome += "profiles";
File dir = new File(userHome);
dir.mkdirs();
File f = new File(userHome+"/"+functionId.replace(' ','_')+"_"+getUsername().replace(' ','_')+".ini");
if (f.exists())
f.delete();
}
}