提交 585065d8 编写于 作者: 扁舟科技's avatar 扁舟科技

Signed-off-by: wang dong <macplus@wcpdoc.com>

上级 facea2b8

要显示的变更太多。

To preserve performance only 1000 of 1000+ files are displayed.
/build/
/target/
/WebContent/
/.settings/
/.classpath
/.project
此差异已折叠。
mvn install:install-file -Dfile=IKAnalyzer-2012.jar -DgroupId=org.wltea -DartifactId=IKAnalyzer -Dversion=2012 -DcreateChecksum=true -Dpackaging=jar -DgeneratePom=true
pause
1.使用eclipse作为IDE搭建开发环境(也可用其他支持maven项目的IDE)
2.导入src目录下的所有项目
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" output="target/classes" path="src/main/java">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="target/test-classes" path="src/test/java">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
<attributes>
<attribute name="maven.pomderived" value="true"/>
<attribute name="org.eclipse.jst.component.nondependency" value=""/>
</attributes>
</classpathentry>
<classpathentry kind="output" path="target/classes"/>
</classpath>
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>farm-core</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.wst.common.project.facet.core.builder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.wst.validation.validationbuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.m2e.core.maven2Builder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.m2e.core.maven2Nature</nature>
<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
</natures>
</projectDescription>
eclipse.preferences.version=1
encoding//src/main/java=UTF-8
encoding//src/test/java=UTF-8
encoding/<project>=UTF-8
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
org.eclipse.jdt.core.compiler.compliance=1.7
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
org.eclipse.jdt.core.compiler.source=1.7
activeProfiles=
eclipse.preferences.version=1
resolveWorkspaceProjects=true
version=1
<?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0">
<wb-module deploy-name="farm-core">
<wb-resource deploy-path="/" source-path="/src/main/java"/>
</wb-module>
</project-modules>
<?xml version="1.0" encoding="UTF-8"?>
<faceted-project>
<installed facet="java" version="1.7"/>
<installed facet="jst.utility" version="1.0"/>
</faceted-project>
disabled=06target
eclipse.preferences.version=1
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.farm</groupId>
<artifactId>farm-core</artifactId>
<packaging>jar</packaging>
<version>${wcp.version}</version>
<name>核心包</name>
<properties>
<wcp.version>3.2.0</wcp.version>
<spring.version>4.1.6.RELEASE</spring.version>
<!-- 文件拷贝时的编码 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!-- 编译时的编码 -->
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.29</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.3.8.Final</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>com.sun.commons</groupId>
<artifactId>beanutils</artifactId>
<version>1.6.1-20070314</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.9</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2.1-b03</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.1</version>
<configuration>
<archive>
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
package com.farm.core;
import java.util.List;
import java.util.Set;
import com.farm.core.auth.domain.AuthKey;
import com.farm.core.auth.domain.LoginUser;
import com.farm.core.auth.domain.WebMenu;
import com.farm.core.auth.exception.LoginUserNoExistException;
/**
* 权限服务接口
*
* @author wangdong
* @version 2014-12
*
*/
public interface AuthorityService {
/**
* 验证用户是否合法
*
* @param loginName
* 用户登录名
* @param password
* 用户密码
* @return
*/
public boolean isLegality(String loginName, String password)
throws LoginUserNoExistException;
/**
* 获得用户对象
*
* @param loginName
* @return
*/
public LoginUser getUserByLoginName(String loginName);
/**获得用户岗位(用于工作流等应用中的对应KEY)
* @param userId
* @return
*/
public List<String> getUserPostKeys(String userId);
/**获得用户组织机构KEY
* @param userId
* @return
*/
public String getUserOrgKey(String userId);
/**
* 获得用户对象
*
* @param userId
* @return
*/
public LoginUser getUserById(String userId);
/**
* 获得用户权限关键字
*
* @param userId
* @return
*/
public Set<String> getUserAuthKeys(String userId);
/**
* 获得key对象(用于检查key权限)
*
* @param key
* @return
*/
public AuthKey getAuthKey(String key);
/**
* 获得用户的菜单
*
* @param userId
* @return
*/
public List<WebMenu> getUserMenu(String userId);
/**
* 登录成功时会调用此方法
*
* @param userId
*/
public void loginHandle(String userId);
}
package com.farm.core;
public class Context {
public static String MK;
public static String FK;
public static boolean FLAG;
}
package com.farm.core;
import com.farm.core.auth.util.AuthenticateInter;
import com.farm.core.auth.util.AuthenticateProvider;
import com.farm.core.config.PropertiesUtils;
import com.farm.core.time.TimeTool;
import com.farm.util.validate.ValidUtils;
import com.farm.util.web.FarmFormatUnits;
import com.farm.util.web.FarmproHotnum;
import com.farm.util.web.WebHotCase;
import com.farm.util.web.WebVisitBuff;
/**
* 平台工具类入口
*
* @author wangdong
*
*/
public class FarmUtils {
/**获得验证类工具
* @return
*/
public static ValidUtils getValidUtils() {
return new ValidUtils();
}
/**
* 获得加解密类工具
*
* @return
*/
public static AuthenticateInter getAuthUtils() {
return AuthenticateProvider.getInstance();
}
/**
* 获得Properties文件工具
*
* @param fileName
* 如jdbc.properties
* @return
*/
public static PropertiesUtils getPropertiesUtils(String fileName) {
return new PropertiesUtils(fileName);
}
/**
* 获得时间类工具
*
* @return
*/
public static TimeTool getTimeTools() {
return new TimeTool();
}
/**
* 获得格式化工具(友好的时间格式化,文件大小格式化)
*
* @return
*/
public static FarmFormatUnits getFormatUtils() {
return new FarmFormatUnits();
}
/**
* 访问热度计算工具
*
* @return
*/
public static FarmproHotnum getHotUtils() {
return new FarmproHotnum();
}
/**
* 计算热词(如搜索关键字的统计)
*
* @return
*/
public static WebHotCase getHotWordUtils() {
return new WebHotCase();
}
/**
* 判断用户在一定时间内是否访问的工具,用来计算一个KEY在一定时间内是否已经被标记(如控制相同用户不重复计算文章的访问量)
*
* @param domain
* 统计域,不同域被分隔开控制(相互间不受影响)
* @param maxNum
* 每个域中允许缓存的key数据量(超出后域被刷新)
* @return
*/
public static WebVisitBuff getWebVisitBuff(String domain, int maxNum) {
return WebVisitBuff.getInstance(domain, maxNum);
}
}
package com.farm.core;
/**
* 参数服务接口
*
* @author wangdong
* @version 2014-12
*
*/
public interface LogService {
/**
* 记录日志
*
* @param message
* 信息
* @param loginUserId
* 用户id
* @param level
* 日志级别
* @param methodName
* 程序方法名称
* @param className
* 程序类名
* @param ip
* 用户IP
*/
public void log(String info, String loginUserId, String level,
String methodName, String className, String ip);
}
package com.farm.core;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
/**
* 参数服务接口
*
* @author wangdong
* @version 2014-12
*
*/
public interface ParameterService {
/**
* 获得系统参数值(可以获得系统中各种参数:如系统参数、properties参数、系统常量)
*
* @return
*/
public String getParameter(String key);
/**
* 获得系统参数值(可以获得系统中各种参数:如用户个性化参数、系统参数、properties参数、系统常量)
*
* @return
*/
public String getParameter(String key, String userId);
/**
* 获得字典列表
*
* @param index
* @return
*/
public List<Entry<String, String>> getDictionaryList(String index);
/**
* 获得字典
*
* @param key
* @return
*/
public Map<String, String> getDictionary(String key);
}
package com.farm.core;
import java.net.NetworkInterface;
import java.util.Enumeration;
import com.farm.core.auth.util.MD5;
/**
* 机器码生成的通用服务
*
* @author 杨尚川
*/
public class SequenceService {
/**
* 对一段String生成MD5摘要信息
*
* @param message
* 要摘要的String
* @return 生成的MD5摘要信息
*/
protected static String getMD5(String message) {
String md5 = new MD5().getMD5ofStr(message);
return getSplitString(md5);
}
public static String InitKey() {
return getMD5(getSigarSequence());
}
/**
* 将很长的字符串以固定的位数分割开,以便于人类阅读
*
* @param str
* @return
*/
protected static String getSplitString(String str) {
return getSplitString(str.substring(0, 16), "-", 4);
}
/**
* 将很长的字符串以固定的位数分割开,以便于人类阅读 如将 71F5DA7F495E7F706D47F3E63DC6349A
* 以-,每4个一组,则分割为 71F5-DA7F-495E-7F70-6D47-F3E6-3DC6-349A
*
* @param str
* 字符串
* @param split
* 分隔符
* @param length
* 长度
* @return
*/
protected static String getSplitString(String str, String split, int length) {
int len = str.length();
StringBuilder temp = new StringBuilder();
for (int i = 0; i < len; i++) {
if (i % length == 0 && i > 0) {
temp.append(split);
}
temp.append(str.charAt(i));
}
String[] attrs = temp.toString().split(split);
StringBuilder finalMachineCode = new StringBuilder();
for (String attr : attrs) {
if (attr.length() == length) {
finalMachineCode.append(attr).append(split);
}
}
String result = finalMachineCode.toString().substring(0, finalMachineCode.toString().length() - 1);
return result;
}
/**
* 利用sigar来生成机器码,当然这个实现不是很好,无法获得CPU ID,希望有兴趣的朋友来改进这个实现
*
* @param osName
* 操作系统类型
* @return 机器码
*/
protected static String getSigarSequence() {
return "asdf";
}
/**
* 按照"XX-XX-XX-XX-XX-XX"格式,获取本机MAC地址
* @return
* @throws Exception
*/
public static String getMacAddress() throws Exception{
Enumeration<NetworkInterface> ni = NetworkInterface.getNetworkInterfaces();
while(ni.hasMoreElements()){
NetworkInterface netI = ni.nextElement();
byte[] bytes = netI.getHardwareAddress();
if(netI.isUp() && netI != null && bytes != null && bytes.length == 6){
StringBuffer sb = new StringBuffer();
for(byte b:bytes){
//与11110000作按位与运算以便读取当前字节高4位
sb.append(Integer.toHexString((b&240)>>4));
//与00001111作按位与运算以便读取当前字节低4位
sb.append(Integer.toHexString(b&15));
sb.append("-");
}
sb.deleteCharAt(sb.length()-1);
return sb.toString().toUpperCase();
}
}
return null;
}
public static void main(String[] args) {
System.out.println(SequenceService.InitKey());
}
}
\ No newline at end of file
package com.farm.core.auth.domain;
public interface AuthKey {
/**
* 是否需要用户登录使用
*
* @return
*/
public boolean isLogin();
/**
* 是否需要检查用户权限
*
* @return
*/
public boolean isCheck();
/**
* 是否可用
*
* @return
*/
public boolean isUseAble();
/**
* 获得名称
*
* @return
*/
public String getTitle();
}
package com.farm.core.auth.domain;
public interface LoginUser {
public String getId();
public String getName();
public String getLoginname();
}
package com.farm.core.auth.domain;
public interface WebMenu {
public String getParams();
public String getIcon();
public String getUrl();
public String getName();
public String getParentid();
public String getId();
}
package com.farm.core.auth.exception;
public class LoginUserNoExistException extends Exception {
public LoginUserNoExistException(String message) {
super(message);
}
/**
*
*/
private static final long serialVersionUID = 6482296763929242398L;
}
package com.farm.core.auth.impl;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.springframework.stereotype.Service;
import com.farm.core.AuthorityService;
import com.farm.core.auth.domain.AuthKey;
import com.farm.core.auth.domain.LoginUser;
import com.farm.core.auth.domain.WebMenu;
import com.farm.core.auth.exception.LoginUserNoExistException;
@Service
public class AuthTestImpl implements AuthorityService {
@Override
public void loginHandle(String userId) {
System.out.println("登录成功");
}
@Override
public Set<String> getUserAuthKeys(String userId) {
Set<String> map = new HashSet<String>();
map.add("AUTHKEY");
return map;
}
@Override
public LoginUser getUserById(String userId) {
LoginUser user = new LoginUser() {
@Override
public String getName() {
return "userName";
}
@Override
public String getLoginname() {
return "loginName";
}
@Override
public String getId() {
return "userId";
}
};
return user;
}
@Override
public LoginUser getUserByLoginName(String loginName) {
LoginUser user = new LoginUser() {
@Override
public String getName() {
return "userName";
}
@Override
public String getLoginname() {
return "loginName";
}
@Override
public String getId() {
return "userId";
}
};
return user;
}
@Override
public List<WebMenu> getUserMenu(String userId) {
List<WebMenu> list = new ArrayList<WebMenu>();
return list;
}
@Override
public boolean isLegality(String loginName, String password)
throws LoginUserNoExistException {
return true;
}
@Override
public AuthKey getAuthKey(String key) {
return new AuthKey() {
@Override
public boolean isLogin() {
return false;
}
@Override
public boolean isCheck() {
return false;
}
@Override
public boolean isUseAble() {
return true;
}
@Override
public String getTitle() {
return "权限名称(测试)";
}
};
}
@Override
public List<String> getUserPostKeys(String userId) {
List<String> list = new ArrayList<String>();
list.add("POSTID");
return list;
}
@Override
public String getUserOrgKey(String userId) {
return "ORGID";
}
}
package com.farm.core.auth.util;
/**
* 密码编码解码类
*
* @author 王东
*
*/
public interface AuthenticateInter {
/**
* 将明文加密
*
* @param password
* 传人明文
* @return
*/
public String encodeMacpro(String password);
/**
* 将密文解密
*
* @param password
* 传人密文
* @return
* @throws Exception
* 解码异常
*/
public String decodeMacpro(String password) throws Exception;
/**
* md5不可逆的编码
*
* @param password
* 传人明文
* @return
*/
public String encodeMd5(String password);
/**
* 判断是否是MD5密码
*
* @param password
* @return
*/
public boolean isMd5code(String password);
/**
* 加密用户密码MD5(password+loginname)
*
* @param password
* @return
*/
public String encodeLoginPasswordOnMd5(String password, String loginName);
}
package com.farm.core.auth.util;
import org.apache.commons.codec.binary.Base64;
public class AuthenticateProvider implements AuthenticateInter {
private AuthenticateProvider() {
}
public static AuthenticateInter getInstance() {
return new AuthenticateProvider();
}
public String decodeMacpro(String password) throws Exception {
byte[] fpass = Base64.decodeBase64(password.getBytes());
String str = new String(fpass);
return str;
}
public String encodeMacpro(String password) {
byte[] cpass = Base64.encodeBase64(password.getBytes());
String temp = new String(cpass);
return temp;
}
@Override
public String encodeMd5(String password) {
if (this.isMd5code(password)) {
return password;
} else {
return new MD5().getMD5ofStr(password);
}
}
@Override
public boolean isMd5code(String password) {
if (password.trim().length() == 32)
return true;
else
return false;
}
@Override
public String encodeLoginPasswordOnMd5(String password, String loginName) {
return encodeMd5(password + loginName);
}
}
package com.farm.core.auth.util;
public class KeyUtil {
@SuppressWarnings("unused")
private static String errorkey = "ERROR";
@SuppressWarnings("unused")
private static String CODE_C = "SADFSEV";
public static String getFkey(String mkey) {
return "NONE";
}
public static String getMKey() {
return "NONE";
}
}
package com.farm.core.auth.util;
/*************************************************
md5 类实现了RSA Data Security, Inc.在提交给IETF
的RFC1321中的MD5 message-digest 算法。
*************************************************/
public class MD5 {
/* 下面这些S11-S44实际上是一个4*4的矩阵,在原始的C实现中是用#define 实现的,
这里把它们实现成为static final是表示了只读,切能在同一个进程空间内的多个
Instance间共享*/
static final int S11 = 7;
static final int S12 = 12;
static final int S13 = 17;
static final int S14 = 22;
static final int S21 = 5;
static final int S22 = 9;
static final int S23 = 14;
static final int S24 = 20;
static final int S31 = 4;
static final int S32 = 11;
static final int S33 = 16;
static final int S34 = 23;
static final int S41 = 6;
static final int S42 = 10;
static final int S43 = 15;
static final int S44 = 21;
static final byte[] PADDING = { -128, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
/* 下面的三个成员是MD5计算过程中用到的3个核心数据,在原始的C实现中
被定义到MD5_CTX结构中
*/
private long[] state = new long[4]; // state (ABCD)
private long[] count = new long[2]; // number of bits, modulo 2^64 (lsb first)
private byte[] buffer = new byte[64]; // input buffer
/* digestHexStr是MD5的唯一一个公共成员,是最新一次计算结果的
  16进制ASCII表示.
*/
public String digestHexStr;
/* digest,是最新一次计算结果的2进制内部表示,表示128bit的MD5值.
*/
private byte[] digest = new byte[16];
/*
getMD5ofStr是类MD5最主要的公共方法,入口参数是你想要进行MD5变换的字符串
返回的是变换完的结果,这个结果是从公共成员digestHexStr取得的.
*/
public String getMD5ofStr(String inbuf) {
md5Init();
md5Update(inbuf.getBytes(), inbuf.length());
md5Final();
digestHexStr = "";
for (int i = 0; i < 16; i++) {
digestHexStr += byteHEX(digest[i]);
}
return digestHexStr;
}
// 这是MD5这个类的标准构造函数,JavaBean要求有一个public的并且没有参数的构造函数
public MD5() {
md5Init();
return;
}
/* md5Init是一个初始化函数,初始化核心变量,装入标准的幻数 */
private void md5Init() {
count[0] = 0L;
count[1] = 0L;
///* Load magic initialization constants.
state[0] = 0x67452301L;
state[1] = 0xefcdab89L;
state[2] = 0x98badcfeL;
state[3] = 0x10325476L;
return;
}
/* F, G, H ,I 是4个基本的MD5函数,在原始的MD5的C实现中,由于它们是
简单的位运算,可能出于效率的考虑把它们实现成了宏,在java中,我们把它们
  实现成了private方法,名字保持了原来C中的。 */
private long F(long x, long y, long z) {
return (x & y) | ((~x) & z);
}
private long G(long x, long y, long z) {
return (x & z) | (y & (~z));
}
private long H(long x, long y, long z) {
return x ^ y ^ z;
}
private long I(long x, long y, long z) {
return y ^ (x | (~z));
}
/*
FF,GG,HH和II将调用F,G,H,I进行近一步变换
FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
Rotation is separate from addition to prevent recomputation.
*/
private long FF(long a, long b, long c, long d, long x, long s,
long ac) {
a += F (b, c, d) + x + ac;
a = ((int) a << s) | ((int) a >>> (32 - s));
a += b;
return a;
}
private long GG(long a, long b, long c, long d, long x, long s,
long ac) {
a += G (b, c, d) + x + ac;
a = ((int) a << s) | ((int) a >>> (32 - s));
a += b;
return a;
}
private long HH(long a, long b, long c, long d, long x, long s,
long ac) {
a += H (b, c, d) + x + ac;
a = ((int) a << s) | ((int) a >>> (32 - s));
a += b;
return a;
}
private long II(long a, long b, long c, long d, long x, long s,
long ac) {
a += I (b, c, d) + x + ac;
a = ((int) a << s) | ((int) a >>> (32 - s));
a += b;
return a;
}
/*
md5Update是MD5的主计算过程,inbuf是要变换的字节串,inputlen是长度,这个
函数由getMD5ofStr调用,调用之前需要调用md5init,因此把它设计成private的
*/
private void md5Update(byte[] inbuf, int inputLen) {
int i, index, partLen;
byte[] block = new byte[64];
index = (int)(count[0] >>> 3) & 0x3F;
// /* Update number of bits */
if ((count[0] += (inputLen << 3)) < (inputLen << 3))
count[1]++;
count[1] += (inputLen >>> 29);
partLen = 64 - index;
// Transform as many times as possible.
if (inputLen >= partLen) {
md5Memcpy(buffer, inbuf, index, 0, partLen);
md5Transform(buffer);
for (i = partLen; i + 63 < inputLen; i += 64) {
md5Memcpy(block, inbuf, 0, i, 64);
md5Transform (block);
}
index = 0;
} else
i = 0;
///* Buffer remaining input */
md5Memcpy(buffer, inbuf, index, i, inputLen - i);
}
/*
md5Final整理和填写输出结果
*/
private void md5Final () {
byte[] bits = new byte[8];
int index, padLen;
///* Save number of bits */
Encode (bits, count, 8);
///* Pad out to 56 mod 64.
index = (int)(count[0] >>> 3) & 0x3f;
padLen = (index < 56) ? (56 - index) : (120 - index);
md5Update (PADDING, padLen);
///* Append length (before padding) */
md5Update(bits, 8);
///* Store state in digest */
Encode (digest, state, 16);
}
/* md5Memcpy是一个内部使用的byte数组的块拷贝函数,从input的inpos开始把len长度的
      字节拷贝到output的outpos位置开始
*/
private void md5Memcpy (byte[] output, byte[] input,
int outpos, int inpos, int len)
{
int i;
for (i = 0; i < len; i++)
output[outpos + i] = input[inpos + i];
}
/*
md5Transform是MD5核心变换程序,有md5Update调用,block是分块的原始字节
*/
private void md5Transform (byte block[]) {
long a = state[0], b = state[1], c = state[2], d = state[3];
long[] x = new long[16];
Decode (x, block, 64);
/* Round 1 */
a = FF (a, b, c, d, x[0], S11, 0xd76aa478L); /* 1 */
d = FF (d, a, b, c, x[1], S12, 0xe8c7b756L); /* 2 */
c = FF (c, d, a, b, x[2], S13, 0x242070dbL); /* 3 */
b = FF (b, c, d, a, x[3], S14, 0xc1bdceeeL); /* 4 */
a = FF (a, b, c, d, x[4], S11, 0xf57c0fafL); /* 5 */
d = FF (d, a, b, c, x[5], S12, 0x4787c62aL); /* 6 */
c = FF (c, d, a, b, x[6], S13, 0xa8304613L); /* 7 */
b = FF (b, c, d, a, x[7], S14, 0xfd469501L); /* 8 */
a = FF (a, b, c, d, x[8], S11, 0x698098d8L); /* 9 */
d = FF (d, a, b, c, x[9], S12, 0x8b44f7afL); /* 10 */
c = FF (c, d, a, b, x[10], S13, 0xffff5bb1L); /* 11 */
b = FF (b, c, d, a, x[11], S14, 0x895cd7beL); /* 12 */
a = FF (a, b, c, d, x[12], S11, 0x6b901122L); /* 13 */
d = FF (d, a, b, c, x[13], S12, 0xfd987193L); /* 14 */
c = FF (c, d, a, b, x[14], S13, 0xa679438eL); /* 15 */
b = FF (b, c, d, a, x[15], S14, 0x49b40821L); /* 16 */
/* Round 2 */
a = GG (a, b, c, d, x[1], S21, 0xf61e2562L); /* 17 */
d = GG (d, a, b, c, x[6], S22, 0xc040b340L); /* 18 */
c = GG (c, d, a, b, x[11], S23, 0x265e5a51L); /* 19 */
b = GG (b, c, d, a, x[0], S24, 0xe9b6c7aaL); /* 20 */
a = GG (a, b, c, d, x[5], S21, 0xd62f105dL); /* 21 */
d = GG (d, a, b, c, x[10], S22, 0x2441453L); /* 22 */
c = GG (c, d, a, b, x[15], S23, 0xd8a1e681L); /* 23 */
b = GG (b, c, d, a, x[4], S24, 0xe7d3fbc8L); /* 24 */
a = GG (a, b, c, d, x[9], S21, 0x21e1cde6L); /* 25 */
d = GG (d, a, b, c, x[14], S22, 0xc33707d6L); /* 26 */
c = GG (c, d, a, b, x[3], S23, 0xf4d50d87L); /* 27 */
b = GG (b, c, d, a, x[8], S24, 0x455a14edL); /* 28 */
a = GG (a, b, c, d, x[13], S21, 0xa9e3e905L); /* 29 */
d = GG (d, a, b, c, x[2], S22, 0xfcefa3f8L); /* 30 */
c = GG (c, d, a, b, x[7], S23, 0x676f02d9L); /* 31 */
b = GG (b, c, d, a, x[12], S24, 0x8d2a4c8aL); /* 32 */
/* Round 3 */
a = HH (a, b, c, d, x[5], S31, 0xfffa3942L); /* 33 */
d = HH (d, a, b, c, x[8], S32, 0x8771f681L); /* 34 */
c = HH (c, d, a, b, x[11], S33, 0x6d9d6122L); /* 35 */
b = HH (b, c, d, a, x[14], S34, 0xfde5380cL); /* 36 */
a = HH (a, b, c, d, x[1], S31, 0xa4beea44L); /* 37 */
d = HH (d, a, b, c, x[4], S32, 0x4bdecfa9L); /* 38 */
c = HH (c, d, a, b, x[7], S33, 0xf6bb4b60L); /* 39 */
b = HH (b, c, d, a, x[10], S34, 0xbebfbc70L); /* 40 */
a = HH (a, b, c, d, x[13], S31, 0x289b7ec6L); /* 41 */
d = HH (d, a, b, c, x[0], S32, 0xeaa127faL); /* 42 */
c = HH (c, d, a, b, x[3], S33, 0xd4ef3085L); /* 43 */
b = HH (b, c, d, a, x[6], S34, 0x4881d05L); /* 44 */
a = HH (a, b, c, d, x[9], S31, 0xd9d4d039L); /* 45 */
d = HH (d, a, b, c, x[12], S32, 0xe6db99e5L); /* 46 */
c = HH (c, d, a, b, x[15], S33, 0x1fa27cf8L); /* 47 */
b = HH (b, c, d, a, x[2], S34, 0xc4ac5665L); /* 48 */
/* Round 4 */
a = II (a, b, c, d, x[0], S41, 0xf4292244L); /* 49 */
d = II (d, a, b, c, x[7], S42, 0x432aff97L); /* 50 */
c = II (c, d, a, b, x[14], S43, 0xab9423a7L); /* 51 */
b = II (b, c, d, a, x[5], S44, 0xfc93a039L); /* 52 */
a = II (a, b, c, d, x[12], S41, 0x655b59c3L); /* 53 */
d = II (d, a, b, c, x[3], S42, 0x8f0ccc92L); /* 54 */
c = II (c, d, a, b, x[10], S43, 0xffeff47dL); /* 55 */
b = II (b, c, d, a, x[1], S44, 0x85845dd1L); /* 56 */
a = II (a, b, c, d, x[8], S41, 0x6fa87e4fL); /* 57 */
d = II (d, a, b, c, x[15], S42, 0xfe2ce6e0L); /* 58 */
c = II (c, d, a, b, x[6], S43, 0xa3014314L); /* 59 */
b = II (b, c, d, a, x[13], S44, 0x4e0811a1L); /* 60 */
a = II (a, b, c, d, x[4], S41, 0xf7537e82L); /* 61 */
d = II (d, a, b, c, x[11], S42, 0xbd3af235L); /* 62 */
c = II (c, d, a, b, x[2], S43, 0x2ad7d2bbL); /* 63 */
b = II (b, c, d, a, x[9], S44, 0xeb86d391L); /* 64 */
state[0] += a;
state[1] += b;
state[2] += c;
state[3] += d;
}
/*Encode把long数组按顺序拆成byte数组,因为java的long类型是64bit的,
只拆低32bit,以适应原始C实现的用途
*/
private void Encode (byte[] output, long[] input, int len) {
int i, j;
for (i = 0, j = 0; j < len; i++, j += 4) {
output[j] = (byte)(input[i] & 0xffL);
output[j + 1] = (byte)((input[i] >>> 8) & 0xffL);
output[j + 2] = (byte)((input[i] >>> 16) & 0xffL);
output[j + 3] = (byte)((input[i] >>> 24) & 0xffL);
}
}
/*Decode把byte数组按顺序合成成long数组,因为java的long类型是64bit的,
只合成低32bit,高32bit清零,以适应原始C实现的用途
*/
private void Decode (long[] output, byte[] input, int len) {
int i, j;
for (i = 0, j = 0; j < len; i++, j += 4)
output[i] = b2iu(input[j]) |
(b2iu(input[j + 1]) << 8) |
(b2iu(input[j + 2]) << 16) |
(b2iu(input[j + 3]) << 24);
return;
}
/*
b2iu是我写的一个把byte按照不考虑正负号的原则的"升位"程序,因为java没有unsigned运算
*/
public static long b2iu(byte b) {
return b < 0 ? b & 0x7F + 128 : b;
}
/*byteHEX(),用来把一个byte类型的数转换成十六进制的ASCII表示,
 因为java中的byte的toString无法实现这一点,我们又没有C语言中的
sprintf(outbuf,"%02X",ib)
*/
public static String byteHEX(byte ib) {
char[] Digit = { '0','1','2','3','4','5','6','7','8','9',
'A','B','C','D','E','F' };
char [] ob = new char[2];
ob[0] = Digit[(ib >>> 4) & 0X0F];
ob[1] = Digit[ib & 0X0F];
String s = new String(ob);
return s;
}
}
package com.farm.core.auth.util;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
/**
* 权限验证帮助类
*
* @author WangDong
* @date Mar 14, 2010
*
*/
public class Urls {
/**
* 验证权限是否符合系统验证
*
* @param actionMap
* 全部监控权限
* @param useraction
* 用户拥有权限
* @param url
* 当前URL
* @return 是否符合验证
*/
@SuppressWarnings("unused")
private boolean checkpopedom(Map<String, Object> actionMap, Map<String, Map<String, String>> useraction,
String url) {
// 查看是否是受控权限
if (actionMap == null) {
return false;
}
if (actionMap.get(url) != null) {
// 是受检权限,看用户是否拥有该权限
if (useraction == null) {
return false;
}
if (useraction.get(url) != null) {
return true;
} else {
return false;
}
} else {
// 不是受检权限
return true;
}
}
// struts2的请求
/**
* 将url解析为系统可识别的url transact Url to Url(Admin/Xxxx.do)
*
* @param requestUrl
* url
* @return transacted url * if(return is null )then(this url is error)
*/
public static String formatUrl(String requestUrl, String basePath) {
// 去掉basepath
requestUrl = requestUrl.replace(basePath, "");
// 截去url参数
int num = requestUrl.indexOf("?");
if (num > 0) {
requestUrl = requestUrl.substring(0, num);
}
// 截去url前缀
// int num2 = requestUrl.replace("\\", "/").lastIndexOf("/");
// requestUrl = requestUrl.substring(num2);
return requestUrl;
}
/**
* 是否是actionURL
*
* @param Url
* @return
*/
public static boolean isActionByUrl(String _Url, String _postfix) {
if (_Url.indexOf(".") < 0) {
return false;
}
_Url = _Url.trim();
String postfix = _Url.substring(_Url.lastIndexOf(".") + 1);
if (postfix.toUpperCase().equals(_postfix.toUpperCase())) {
return true;
}
return false;
}
/**
* 获得URLIndex xxxx/Xxxx.do transact Url to Url(Xxxx/xxx)
*
* @param Url
* @return
*/
public static String getActionKey(String formatUrl) {
String name = formatUrl.substring(0, formatUrl.lastIndexOf("."));
// if (name.lastIndexOf("/") >= 0) {
// name = name.substring(name.lastIndexOf("/") + 1);
// }
// if (name.lastIndexOf("\\") >= 0) {
// name = name.substring(name.lastIndexOf("\\") + 1);
// }
return name;
}
public static String getActionSubKey(String actionkey) {
// 截去url前缀
int num2 = actionkey.replace("\\", "/").lastIndexOf("/");
if (num2 >= 0) {
actionkey = actionkey.substring(num2);
}
return actionkey;
}
/**
* 获得当前连接的IP地址
*
* @param request
* 请求对象
* @return ip
*/
public static String getIpAddr(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}
/**
* 获得所有request的参数并拼接成get参数
*
* @param request
* @return
*/
public static String getUrlParameters(HttpServletRequest request) {
@SuppressWarnings("unchecked")
Set<Entry<String, String[]>> entrySet = request.getParameterMap().entrySet();
StringBuffer urlp = new StringBuffer();
for (Entry<String, String[]> node : entrySet) {
if (node.getValue() != null & node.getValue().length > 0) {
if (urlp.length() > 0) {
urlp.append("&");
urlp.append(node.getKey() + "=" + node.getValue()[0]);
} else {
urlp.append(node.getKey() + "=" + node.getValue()[0]);
}
}
}
return urlp.toString();
}
/**
* 验证用户是否拥有权限
*
* @param URL_index
* actionIndex URl关键字不包括后缀和前缀
* @param userUrl
* 用户权限集合《URL_index,URL_Id》
* @return 是否有权限
*/
public boolean isHavePop(String URL_index, Map<String, String> userUrl) {
return false;
}
}
\ No newline at end of file
package com.farm.core.config;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import org.apache.log4j.Logger;
/**
* 应用参数工具类,获得config中定义的参数
*
* @author wangdong
*
*/
public class AppConfig {
private static final String BUNDLE_NAME = "config"; //$NON-NLS-1$
private static final Logger log = Logger.getLogger(AppConfig.class);
private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
private AppConfig() {
}
/**
* 从properties文件中获得配置值
*
* @param key
* 配置文件的key
* @return
*/
public static String getString(String key) {
if (key.equals("PRO")) {
return "PRO";
}
try {
String messager = RESOURCE_BUNDLE.getString(key);
return messager;
} catch (MissingResourceException e) {
String messager = "不能在配置文件" + BUNDLE_NAME + "中发现参数:" + '!' + key + '!';
log.error(messager);
throw new RuntimeException(messager);
}
}
}
package com.farm.core.config;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Properties;
import org.apache.log4j.Logger;
public class PropertiesUtils {
private String PROPERTY_FILE;
private static final Logger log = Logger.getLogger(PropertiesUtils.class);
/**
* @param fileName 如jdbc.properties
*/
public PropertiesUtils(String fileName) {
PROPERTY_FILE = PropertiesUtils.class.getResource("/").getPath()
.toString()
+ fileName;
}
/**
* 根据Key 读取Value
*/
public String getData(String key) {
Properties props = new Properties();
try {
InputStream in = new BufferedInputStream(new FileInputStream(
PROPERTY_FILE));
props.load(in);
in.close();
String value = props.getProperty(key);
return value;
} catch (Exception e) {
log.error(e.getMessage());
return null;
}
}
/**
* 修改或添加键值对 如果key存在,修改 反之,添加。
*/
public void setData(String key, String value) {
Properties prop = new Properties();
OutputStream fos = null;
InputStream fis = null;
try {
File file = new File(PROPERTY_FILE);
if (!file.exists())
file.createNewFile();
fis = new FileInputStream(file);
prop.load(fis);
} catch (IOException e) {
System.err.println("Visit " + PROPERTY_FILE + " for updating "
+ value + " value error");
} finally {
try {
fis.close();// 一定要在修改值之前关闭fis
} catch (IOException e) {
}
}
try {
fos = new FileOutputStream(PROPERTY_FILE);
prop.setProperty(key, value);
prop.store(fos, "Update '" + key + "' value");
prop.store(fos, "just for test");
} catch (IOException e) {
System.err.println("Visit " + PROPERTY_FILE + " for updating "
+ value + " value error");
} finally {
try {
fos.close();
} catch (IOException e) {
}
}
}
}
package com.farm.core.config;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import com.farm.core.Context;
import com.farm.core.auth.util.KeyUtil;
/**
* 读取licence
*
* @author macplus
*
*/
public class ReadKey {
private static boolean isOk = false;
public static void read(String path) {
try {
if (isOk == false) {
Context.FK = readTxtFile(path + File.separator + "licence");
Context.FLAG = KeyUtil.getFkey(KeyUtil.getMKey()).equals(Context.FK);
isOk = true;
}
} catch (Exception e) {
Context.FK = "NONE1";
}
}
public static String readTxtFile(String filePath) {
try {
File file = new File(filePath);
if (file.isFile() && file.exists()) { // 判断文件是否存在
InputStreamReader read = new InputStreamReader(new FileInputStream(file), "utf-8");// 考虑到编码格式
BufferedReader bufferedReader = new BufferedReader(read);
String lineTxt = null;
while ((lineTxt = bufferedReader.readLine()) != null) {
return lineTxt;
}
read.close();
}
} catch (Exception e) {
}
return "none";
}
}
package com.farm.core.page;
/**
* 页面类型
*
* @author wangdong
*
*/
public enum OperateType {
/**
* 展示
*/
SHOW(0), /**
* 新增
*/
ADD(1), /**
* 修改
*/
UPDATE(2),
/**
* 删除
*/
DEL(4),
/**
* 其他
*/
OTHER(3);
public int value;
private OperateType(int var) {
value = var;
}
/**根据数值获得页面类型枚举对象
* @param type
* @return
*/
public static OperateType getEnum(int type) {
if (type == 0)
return OperateType.SHOW;
if (type == 1)
return OperateType.ADD;
if (type == 2)
return OperateType.UPDATE;
return null;
}
}
package com.farm.core.page;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpSession;
import org.apache.log4j.Logger;
import com.farm.core.auth.domain.LoginUser;
/**
* 封装一次页面请求的状态
*
* @author wangdong
*
*/
public class RequestMode implements java.io.Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
static final Logger log = Logger.getLogger(RequestMode.class);
private Map<String, String> data;
/**
* 页面类型
*/
private int operateType;
/**
* 消息
*/
private String message = "";
/**
* 记录集id集合
*/
private String ids;
/**
* 当前实体id
*/
private String currentKeyid;
// ------------------------------------------------------------------------------
/**
* 当前主键
*
* @return
*/
public String getCurrentKeyid() {
return currentKeyid;
}
/**
* 设置参数
*
* @return
*/
public void putParameters(String key, String val) {
if (this.data == null) {
this.data = new HashMap<String, String>();
}
this.data.put(key, val);
}
/**
* 获得参数
*
* @param key
* @return
*/
public String getParameters(String key) {
return this.data.get(key);
}
/**
* 获得当前业务id
*
* @param currentKeyid
*/
public void setCurrentKeyid(String currentKeyid) {
this.currentKeyid = currentKeyid;
}
public RequestMode() {
}
public RequestMode(OperateType operate) {
operateType = operate.value;
}
public RequestMode(OperateType operate, String message) {
operateType = operate.value;
this.message = message;
}
/**
* 设置一个PageSet 而且PageSet可以为空
*
* @param pageSet
* 页面状态对象
* @param pageType
* 页面类型
* @param commitType
* 提交状态
* @param e
* 异常
* @return pageSet 页面状态对象
*/
public static RequestMode initPageSet(RequestMode pageSet,
OperateType operateType, Exception e) {
if (pageSet == null) {
pageSet = new RequestMode(OperateType.OTHER);
}
if (e != null) {
pageSet.setMessage(e.getMessage());
log.error(pageSet.getMessage());
}
if (operateType != null) {
pageSet.setOperateType(operateType.value);
}
return pageSet;
}
/**
* 设置状态
*
* @param pageType
* 页面类型对象
* @param commitType
* 提交状态对象
*/
public void SetVar(OperateType operateType) {
if (operateType != null)
this.operateType = operateType.value;
}
/**
* 设置状态
*
* @param pageType
* 页面类型对象
* @param commitType
* 提交状态对象
* @param message
* 消息内容
*/
public void SetVar(OperateType operateType,
String message) {
if (operateType != null)
this.operateType = operateType.value;
if (message != null)
this.message = message;
}
/**
* 获得消息
*
* @return
*/
public String getMessage() {
return message;
}
/**
* 设置消息内容
*
* @param message
*/
public void setMessage(String message) {
this.message = message;
}
public int getOperateType() {
return operateType;
}
public void setOperateType(int operateType) {
this.operateType = operateType;
}
/**
* 获得id集合
*
* @return
*/
public String getIds() {
return ids;
}
/**
* 设置id集合
*
* @param ids
*/
public void setIds(String ids) {
this.ids = ids;
}
public Map<String, String> getData() {
return data;
}
public void setData(Map<String, String> data) {
this.data = data;
}
}
package com.farm.core.page;
/**
* 提交状态,用来标志操作是否成功,多用于页面对后台操作的判断
*
* @author wangdong
*
*/
public enum StateType {
/**
* 成功
*/
SUCCESS(0), /**
* 失败
*/
ERROR(1);
public int value;
private StateType(int var) {
value = var;
}
}
package com.farm.core.page;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import org.springframework.web.servlet.ModelAndView;
/**
* ajax请求时的json模型
*
* @author wangdong
*
*/
public class ViewMode {
private final static Logger log = Logger.getLogger(ViewMode.class);
private Map<String, Object> attrs = new HashMap<String, Object>();
public static ViewMode getInstance() {
ViewMode obj = new ViewMode();
obj.attrs.put("STATE", StateType.SUCCESS.value);
obj.attrs.put("OPERATE", OperateType.OTHER.value);
return obj;
}
/**
* 装入json返回值
*
* @param key
* @param value
* @return
*/
public ViewMode putAttr(String key, String value) {
attrs.put(key, value);
return this;
}
public ViewMode putAttr(String key, Object value) {
attrs.put(key, value);
return this;
}
public ViewMode putAttrs(Map<String, Object> map) {
attrs.putAll(map);
return this;
}
/**
* 装入错误
*
* @param message
* 错误消息
* @return
*/
public ViewMode setError(String message) {
attrs.put("MESSAGE", message);
attrs.put("STATE", StateType.ERROR.value);
log.error(message);
return this;
}
public ViewMode setOperate(OperateType type) {
attrs.put("OPERATE", type.value);
return this;
}
/**
* 返回map格式json
*
* @return
*/
public Map<String, Object> returnObjMode() {
return attrs;
}
/**
* 返回spring的ModelAndView(如jsp)
*
* @param path
* @return
*/
public ModelAndView returnModelAndView(String path) {
log.debug(path);
return new ModelAndView(path, this.returnObjMode());
}
/**
* 重定向到URL地址
*
* @param path
* @return
*/
public ModelAndView returnRedirectUrl(String path) {
String paras = null;
for (String name : attrs.keySet()) {
String val = attrs.get(name).toString();
if (paras == null) {
paras = name + "=" + val;
} else {
paras = paras + "&" + name + "=" + val;
}
}
if (paras == null) {
paras = "";
}
if (path.indexOf("?") > 0) {
path = path + "&" + paras;
} else {
if (!paras.equals("")) {
path = path + "?" + paras;
}
}
return new ModelAndView("redirect:" + path);
}
/**
* 返回文本格式json(暂未实现)
*
* @return
*/
@Deprecated
public String returnStrMode() {
// TODO
return "String";
}
public static List<?> returnListObjMode(List<?> list) {
return list;
}
}
package com.farm.core.para.impl;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import com.farm.core.ParameterService;
public class ParaTestImpl implements ParameterService {
@Override
public Map<String, String> getDictionary(String key) {
// TODO Auto-generated method stub
return null;
}
@Override
public List<Entry<String, String>> getDictionaryList(String index) {
// TODO Auto-generated method stub
return null;
}
@Override
public String getParameter(String key) {
// TODO Auto-generated method stub
return null;
}
@Override
public String getParameter(String key, String userId) {
// TODO Auto-generated method stub
return null;
}
}
package com.farm.core.sql.query;
import com.farm.core.Context;
import com.farm.core.auth.util.KeyUtil;
public class CoreHandle {
public static boolean runLce() {
Context.MK = KeyUtil.getMKey();
return true;
}
}
package com.farm.core.sql.query;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
/**
* 查询条件的封装类,配合DataQuery使用
*
* @author 王东
* @date 2012-12-30
*/
public class DBRule {
private String key;// where key
private Object value;// where value
private String comparaSign;// like,}��% = > < >= <=
private List<DBRule> rules = new ArrayList<DBRule>();
/**
* 将一个条件对象添加到条件序列中
*
* @param ruleList
* @param key
* @param value
* @param comString
* @return
*/
public static List<DBRule> addRule(List<DBRule> ruleList, String key,
String value, String comString) {
DBRule cRule = new DBRule(key, value, comString);
ruleList.add(cRule);
return ruleList;
}
/**
* 将一个条件对象添加到条件序列中
*
* @param key
* @param value
* @param comString
* @return
*/
public DBRule addRule(String key, String value, String comString) {
DBRule cRule = new DBRule(key, value, comString);
rules.add(cRule);
return this;
}
/**
* 获得条件序列
*
* @return
*/
public List<DBRule> getDBRules() {
return rules;
}
/**
* 将条件序列转义为条件字符串
*
* @param ruleList
* 条件序列
* @return
*/
public static String makeWhereStr(List<DBRule> ruleList) {
StringBuffer str = new StringBuffer();
for (DBRule node : ruleList) {
str.append(node.getThisLimit());
}
return str.toString();
}
/**
* 构造一个查询条件
*
* @param key
* 字段名
* @param value
* 字段值
* @param comString
* 匹配类型 like(-like坐标自由匹配) IS NOT = > < >= <=
*/
public DBRule(String key, Object value, String comString) {
DataQuerys.wipeVirus(key);
DataQuerys.wipeVirus(value.toString());
DataQuerys.wipeVirus(comString);
this.key = key.trim().toUpperCase();
this.value = value;
this.comparaSign = comString.trim().toUpperCase();
this.rules.add(this);
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getValue() {
return value.toString();
}
public void setValue(String value) {
this.value = value;
}
public String getComparaSign() {
return comparaSign;
}
public void setComparaSign(String comparaSign) {
this.comparaSign = comparaSign;
}
public String getThisLimit() {
StringBuffer where_ = new StringBuffer();
comparaSign = comparaSign.toUpperCase();
if (key != null && value != null && comparaSign != null) {
where_.append(" AND ");
where_.append(key);
if (comparaSign.indexOf("LIKE") >= 0) {
where_.append(" ");
where_.append("LIKE");
} else {
where_.append(" ");
where_.append(comparaSign);
}
where_.append(expendVal());
where_.append(" ");
}
return where_.toString();
}
private String expendVal() {
StringBuffer valStr = new StringBuffer();
if (comparaSign.equals("LIKE")) {
valStr.append(" '%");
valStr.append(value.toString());
valStr.append("%'");
} else if (comparaSign.equals("-LIKE")) {
valStr.append(" '%");
valStr.append(value.toString());
valStr.append("'");
} else if (comparaSign.equals("LIKE-")) {
valStr.append(" '");
valStr.append(value.toString());
valStr.append("%'");
} else if (comparaSign.equals("IS NOT")) {
valStr.append(" ");
valStr.append(value.toString());
valStr.append(" ");
} else {
if (value instanceof String) {
valStr.append(" '");
valStr.append(value.toString());
valStr.append("'");
} else if (value instanceof BigDecimal) {
valStr.append(" ");
valStr.append(value.toString());
valStr.append("");
} else {
valStr.append(" ");
valStr.append(value.toString());
valStr.append("");
}
}
return valStr.toString();
}
}
package com.farm.core.sql.query;
import java.util.ArrayList;
import java.util.List;
/**
* 查询条件的封装类
*
* @author 王东
* @date 2015-01-28
*/
public class DBRuleList {
@SuppressWarnings("unused")
private static final long serialVersionUID = 1L;
private List<DBRule> list = new ArrayList<DBRule>();
public DBRuleList() {
}
public DBRuleList add(DBRule rule) {
list.add(rule);
return this;
}
public List<DBRule> toList() {
return list;
}
}
package com.farm.core.sql.query;
/**
* 排序方式的封装类,配合DataQuery使用
*
* @author 王东
* @date 2012-12-30
*/
public class DBSort {
private String sortTitleText;// 排序字段
private String sortTypeText;// 排序类型
private String isValidate;
@SuppressWarnings("unused")
private DBSort() {
}
/**
* 构造一个排序方式
*
* @param title
* 排序字段
* @param type
* 排序类型ASC/DESC
*/
public DBSort(String title, String type) {
DataQuerys.wipeVirus(type);
DataQuerys.wipeVirus(title);
sortTitleText = title;
sortTypeText = type;
}
public DBSort(String title, String type, boolean isValidate) {
if (isValidate) {
DataQuerys.wipeVirus(type);
DataQuerys.wipeVirus(title);
}
sortTitleText = title;
sortTypeText = type;
}
public void setSortTitleText(String sortTitleText) {
this.sortTitleText = sortTitleText;
}
/**
* 数据库中的字段不能够带下划线(_)否则会被转义为点(.)
*
* @return
*/
public String getSortTitleText() {
if (sortTitleText == null
|| sortTitleText.trim().toUpperCase().equals("NULL")) {
return null;
}
return sortTitleText.replace("_", ".");
}
public String getSortTypeText() {
return sortTypeText;
}
public void setSortTypeText(String sortTypeText) {
this.sortTypeText = sortTypeText;
}
public String getIsValidate() {
return isValidate;
}
public void setIsValidate(String isValidate) {
this.isValidate = isValidate;
}
}
package com.farm.core.sql.query;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import org.hibernate.Session;
import com.farm.core.auth.util.AuthenticateInter;
import com.farm.core.auth.util.AuthenticateProvider;
import com.farm.core.sql.result.DataResult;
import com.farm.core.sql.result.DataResults;
import com.farm.util.spring.HibernateSessionFactory;
/**
* 数据库查询封装类
*
* @author 王东
* @version 2012
* @version 2014-10-29 重构:1.缓存带分页2.重构代码3.缓存更新时使用线程
*
*/
public class DataQuery {
static final Logger log = Logger.getLogger(DataQuery.class);
private final static int CACHE_MAX_SIZE = 1000;
/**
* 缓存器单位枚举值
*
* @author Administrator
*
*/
public enum CACHE_UNIT {
/**
* 毫秒
*/
Millisecond(1), /**
* 秒
*/
second(1000), /**
* 分
*/
minute(1000 * 60);
int num;
CACHE_UNIT(int val) {
num = val;
}
}
private int pagesize = 10;
private boolean isCount = true;
private String currentPage;// 当前页
private String sortTitleText;// 排序字段ok
private String sortTypeText;// 排序类型ok
private String ruleText;// 查询条件
private String titles;// 结果集中展示的字段
private String tables;// 表名或者内建视图
private String userWhere;// 自定义查询条件
private DBSort defaultSort;// 默认排序条件
private String countSql;
protected static final Map<String, DataResult> resultCache = new HashMap<String, DataResult>();// 结果集合的缓存
private boolean DISTINCT = false;
private long cacheMillisecond;// 启用缓存(毫秒数):只要该数字大于0则表示启用,从缓存区读取数据如果缓存区没有数据则数据库查询并更新到缓冲区
protected List<DBSort> sort = new ArrayList<DBSort>();
protected List<DBRule> queryRule = new ArrayList<DBRule>();
/**
* 获得查询对象实例
*
* @param currentPage
* 当前页
* @param titles
* 展现字段
* @param tables
* 表描述
* @return
*/
public static DataQuery getInstance(String currentPage, String titles, String tables) {
DataQuery query = new DataQuery();
query.setCurrentPage(currentPage);
query.setTitles(titles);
query.setTables(tables);
return query;
}
public static DataQuery getInstance(int currentPage, String titles, String tables) {
return getInstance(String.valueOf(currentPage), titles, tables);
}
/**
* 执行查询,该方法适用于sever中,没有对用于页面状态的序列化,没有缓存功能
*
* @param session
* @return
* @throws SQLException
*/
public DataResult search(Session session) throws SQLException {
String key = null;
// -------------------缓存查询----------------------------
if (cacheMillisecond > 0) {
key = getQueryMD5Key(this);
if (key != null) {
// 启用缓存功能
{
DataResult dr = resultCache.get(key);
// 是否已经有缓存
if (dr != null) {
long time = new Date().getTime() - dr.getCtime().getTime();
// 判断缓存是否超时
if (time < cacheMillisecond) {
// 缓存可用
return dr;
} else {
// 启动线程的时候就预先更新缓存时间避免在线程运行中启动多次线程
dr.setCtime(new Date());
// 超时也返回过时的,并启动线程查询
Searcher search = new Searcher(this);
Thread searchThread = new Thread(search);
searchThread.start();
return dr;
}
}
}
}
// 缓存中超出缓存最大值的时候就将缓存清空
if (resultCache.size() > CACHE_MAX_SIZE) {
resultCache.clear();
}
}
// -------------------缓存查询----------------------------
if (sort.size() <= 0) {
sort.add(defaultSort);
}
DataResult result = null;
try {
Searcher search = new Searcher(this);
result = search.doSearch(session);
result.setTitles(DataResults.getTitles(titles));
result.setSortTitleText(sortTitleText);
result.setSortTypeText(sortTypeText);
} catch (Exception e) {
throw new SQLException(e);
}
if (cacheMillisecond > 0) {
// 启用缓存功能,将当前结果存入缓存
if (key != null) {
result.setCtime(new Date());
resultCache.put(key, result);
}
}
return result;
}
/**
* 执行查询,序列化页面状态,可配置为缓存
*
* @return
* @throws SQLException
*/
public DataResult search() throws SQLException {
Session session = HibernateSessionFactory.getSession();
DataResult result = null;
try {
result = search(session);
} finally {
session.close();
}
return result;
}
/**
* 将查询对象转换为MD5验证码
*
* @param query
* @return
*/
protected static String getQueryMD5Key(DataQuery query) {
String sql = "";
try {
sql = HibernateQueryHandle.praseSQL(query) + ",PAGE:" + query.getCurrentPage();
AuthenticateInter ai = AuthenticateProvider.getInstance();
sql = ai.encodeMd5(sql);
} catch (SQLException e) {
log.error(e + e.getMessage());
return null;
}
return sql;
}
/**
* 添加一个排序
*
* @param dbsort
* @return
*/
public DataQuery addSort(DBSort dbsort) {
sort.add(dbsort);
return this;
}
/**
* 添加一个默认排序
*
* @param dbsort
* @return
*/
public DataQuery addDefaultSort(DBSort dbsort) {
defaultSort = dbsort;
return this;
}
/**
* 清除排序
*
* @param sort
*/
public DataQuery clearSort() {
this.sort.clear();
return this;
}
/**
* 添加一个过滤条件
*
* @param sort
*/
public DataQuery addRule(DBRule rule) {
DataQuerys.wipeVirus(rule.getValue());
this.queryRule.add(rule);
return this;
}
/**
* 获得一个查询条件并从query中移除该条件
*
* @param index
* 查询条件索引号
* @return
*/
public DBRule getAndRemoveRule(int index) {
DBRule dbrule = this.queryRule.get(index);
queryRule.remove(index);
ruleText = parseRules();
return dbrule;
}
/**
* 获得一个查询条件并从query中移除该条件,每次获得匹配到得第一个titleName 查询条件字段名
*
* @param titleName
* 查询条件字段名
* @return
*/
public DBRule getAndRemoveRule(String titleName) {
int n = -1;
for (int i = 0; i < queryRule.size(); i++) {
if (queryRule.get(i).getKey().equals(titleName.toUpperCase())) {
n = i;
}
}
DBRule dbrule = null;
if (n >= 0) {
dbrule = getAndRemoveRule(n);
}
return dbrule;
}
/**
* 将条件对象集合转换为条件字符串
*
* @return
*/
private String parseRules() {
StringBuffer sb = null;
for (DBRule node : queryRule) {
// parentid:=:NONE_,_
if (sb == null) {
sb = new StringBuffer();
} else {
sb.append("_,_");
}
sb.append(node.getKey());
sb.append(":");
sb.append(node.getComparaSign());
sb.append(":");
sb.append(node.getValue());
}
if (sb == null) {
return "";
} else {
return sb.toString();
}
}
/**
* 清除排序
*
* @param sort
*/
public DataQuery clearRule() {
this.queryRule.clear();
return this;
}
/**
* 是否在SQL中加入distinct
*
* @param var
* true||false
*/
public DataQuery setDistinct(boolean var) {
DISTINCT = var;
return this;
}
/**
* 是否加入了distinct关键字
*
* @return
*/
public boolean isDistinct() {
return DISTINCT;
}
// pojo-------------------------------
/**
* 获得每页记录条数
*
* @return
*/
public int getPagesize() {
return pagesize;
}
/**
* 设置每页记录条数
*
* @param pagesize
*/
public DataQuery setPagesize(int pagesize) {
this.pagesize = pagesize;
return this;
}
/**
* 获得当前页
*
* @return
*/
public String getCurrentPage() {
if (currentPage == null || currentPage.trim().length() <= 0) {
return "1";
}
return currentPage;
}
/**
* 设置当前页
*
* @param currentPage
*/
public DataQuery setCurrentPage(String currentPage) {
this.currentPage = currentPage;
return this;
}
/**
* 设置当前页
*
* @param currentPage
*/
public DataQuery setCurrentPage(int currentPage) {
this.currentPage = String.valueOf(currentPage);
return this;
}
/**
* 获得排序字段
*
* @return
*/
public String getSortTitleText() {
return sortTitleText;
}
/**
* 获得排序类型
*
* @return
*/
public String getSortTypeText() {
return sortTypeText;
}
/**
* 设置排序字段,但是会清理掉已有排序
*
* @param sortTitleText
*/
public void setSortTitleText(String sortTitleText) {
this.sortTitleText = sortTitleText;
if (this.sortTitleText != null && this.sortTypeText != null) {
sort.clear();
sort.add(new DBSort(this.sortTitleText, this.sortTypeText));
}
}
/**
* 设置排序类型
*
* @param sortTypeText
* ASC||DESC
*/
public void setSortTypeText(String sortTypeText) {
if (sortTypeText != null && sortTypeText.toUpperCase().trim().equals("NULL")) {
sortTypeText = null;
}
this.sortTypeText = sortTypeText;
if (this.sortTitleText != null && this.sortTypeText != null) {
sort.clear();
sort.add(new DBSort(this.sortTitleText, this.sortTypeText));
}
}
/**
* 获得条件描述字符串
*
* @return
*/
public String getRuleText() {
return ruleText;
}
/**
* 设置查询条件,但是会清理掉已有条件
*
* @param ruleText
* 查询条件
*/
public void setRuleText(String ruleText) {
this.ruleText = ruleText;
List<DBRule> list = null;
if (!checkStringForLimitDomain(ruleText)) {
list = new ArrayList<DBRule>();
} else {
ruleText = ruleText.replace("_D_", ":");
String[] strarray = ruleText.split("_,_");
list = new ArrayList<DBRule>();
for (String onestr : strarray) {
if (onestr != null && !onestr.trim().equals("")) {
String[] valueT = onestr.split(":");
if (valueT.length >= 3 && valueT[0] != null && valueT[1] != null && valueT[2] != null) {
if (!valueT[0].equals("") && !valueT[0].equals("") && !valueT[0].equals("")) {
DBRule dbrule = new DBRule(valueT[0], valueT[2], valueT[1]);
list.add(dbrule);
}
}
}
}
}
queryRule.clear();
queryRule.addAll(list);
}
/**
* 获得结果集字段
*
* @return
*/
public String getTitles() {
return titles;
}
/**
* 设置结果集字段
*
* @return
*/
public void setTitles(String titles) {
this.titles = titles;
}
/**
* 获得表描述
*
* @return
*/
public String getTables() {
return tables;
}
/**
* 设置表描述
*
* @param tables
*/
public void setTables(String tables) {
this.tables = tables;
}
/**
* 对一个查询条件类型的数据进行验证
*
* @param str
* @return
*/
private boolean checkStringForLimitDomain(String str) {
if (str == null)
return false;
else
return true;
}
/**
* 获得用户自定义查询条件
*
* @return
*/
public String getUserWhere() {
return userWhere;
}
/**
* 设置自定义条件
*
* @param userWhere
* 需要添加 AND关键字
*/
public void setSqlRule(String sql) {
this.userWhere = sql;
}
/**
* 增加自定义条件
*
* @param userWhere
* 需要添加 AND关键字
*/
public DataQuery addSqlRule(String SQLString) {
if (this.userWhere == null) {
this.userWhere = "";
}
this.userWhere = this.userWhere + SQLString;
return this;
}
/**
* 初始化查询类
*
* @param query
* 对象引用
* @param tables
* 表
* @param titles
* 字段
*/
public static DataQuery init(DataQuery query, String tables, String titles) {
if (query == null) {
query = new DataQuery();
}
query.setTables(tables);
query.setTitles(titles);
if (query.sortTypeText == null) {
query.sortTypeText = "asc";
}
if (query.getCurrentPage() == null) {
query.setCurrentPage("1");
}
// 删除所有排序字段不合乎要求的
{
int n = 0;
List<Integer> indexArray = new ArrayList<Integer>();
for (; n < query.sort.size(); n++) {
if (query.sort.get(n).getSortTitleText() == null
|| query.sort.get(n).getSortTitleText().trim().toUpperCase().equals("NULL")) {
indexArray.add(n);
}
}
for (Integer index : indexArray) {
query.sort.remove(index.intValue());
}
}
return query;
}
/**
* 获得默认排序
*
* @return
*/
public DBSort getDefaultSort() {
return defaultSort;
}
/**
* 设置数据缓存
*
* @param cachetime
* 缓存时间长
* @param cache_unit
* 缓存时间单位
*/
public void setCache(int cachetime, CACHE_UNIT cache_unit) {
this.cacheMillisecond = cachetime * cache_unit.num;
}
/**
* 设置默认排序
*
* @param defaultSort
*/
public void setDefaultSort(DBSort defaultSort) {
this.defaultSort = defaultSort;
}
/**
* 获得查询条件格式序列
*
* @return
*/
public List<DBRule> getQueryRule() {
return queryRule;
}
/**
* 只查询结果不计算总页数
*/
public void setNoCount() {
this.isCount = false;
}
/**
* 是执行记录条数统计COUNT(*)的SQL语句
*
* @return
*/
public boolean isCount() {
return isCount;
}
public String getCountSql() {
return countSql;
}
/**
* 如果传入该参数则按照该SQL进行结果集数量查询
*
* @param countSql
*/
public void setCountSql(String countSql) {
this.countSql = countSql;
}
/**
* 获取一个查询条件
*
* @param string
* @return
*/
public String getRule(String key) {
for (DBRule rule : this.queryRule) {
if (rule.getKey().equals(key)) {
return rule.getValue();
}
}
return null;
}
}
package com.farm.core.sql.query;
import org.apache.commons.lang.StringEscapeUtils;
/**
* 查询工具工具类
*
* @author Administrator
*
*/
public class DataQuerys {
/**
* 检查SQL注入风险
*
* @param var
* 拼写SQL的值,仅仅用于对值的处理
*/
public static void wipeVirus(String var) {
//防止sql注入的字符转义
var = StringEscapeUtils.escapeSql(var);
if (var.indexOf("(") + var.indexOf(")") + var.indexOf("||") + var.indexOf("||") > 0) {
throw new RuntimeException("违反SQL注入风险约束!");
}
}
}
package com.farm.core.sql.query;
import java.sql.SQLException;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import com.farm.core.sql.result.DataResult;
import com.farm.core.sql.result.DataResults;
/**
* hibernate的帮助类
*
* @author 王东
* @date 2012-12-30
*/
public class HibernateQueryHandle {
private static final String SqlSelectSize = " select count(*) num "; // 默认查询数量头
/**
* sql查询
*
* @param session
* hibernateSession
* @param sql
* @param pagesize
* 每页多少条
* @param currentPage
* 当前页
* @return
* @throws SQLException
*/
protected static DataResult runSqlQuery(Session session, String querysql,
String countsql, int pagesize, int currentPage) throws SQLException {
long startTime = new Date().getTime();
if (querysql.indexOf("*") > 0) {
throw new SQLException("*不能存在于查询语句中,请明确查询字段!");
}
querysql = querysql.toUpperCase();
DataResult result = null;
int firstResourt;// 开始条数
int sizeResourt;// 单页显示
sizeResourt = pagesize;
firstResourt = (currentPage - 1) * sizeResourt;
String titles = querysql.substring(0, querysql.indexOf("FROM"));
List<Map<String, Object>> limap = DataResults.getMaps(titles,
runLimitQuery(session, querysql, firstResourt, sizeResourt));
result = DataResult.getInstance(limap, countsql == null ? limap.size()
: runLimitQueryNum(session, countsql), currentPage, pagesize);
long endTime = new Date().getTime();
result.setRuntime(endTime - startTime);
return result;
}
/**
* DataQuery查询
*
* @param session
* hibernate会话
* @param dataquery
* @return
* @throws SQLException
*/
protected static DataResult runDataQuery(Session session,
DataQuery dataquery) throws SQLException {
long startTime = new Date().getTime();
DataResult result = null;
try {
int firstResourt;// 开始条数
int sizeResourt;// 单页显示
String upsql = praseSQL(dataquery);
String partSql = upsql.substring(upsql.indexOf(" FROM "));
String headsql = upsql.substring(0, upsql.indexOf(" FROM "));
if (headsql.indexOf("*") >= 0) {
throw new SQLException("select can't contain *");
}
sizeResourt = dataquery.getPagesize();
firstResourt = (Integer.valueOf(dataquery.getCurrentPage().trim()) - 1)
* sizeResourt;
// 将一个pageDomain中的list<object>解析为map<String,String>
List<Map<String, Object>> limap = DataResults.getMaps(dataquery
.getTitles(), runLimitQuery(session, upsql, firstResourt,
sizeResourt));
if (dataquery.isDistinct()) {
if (upsql.indexOf("ORDER BY") > 0) {
upsql = upsql.substring(0, upsql.indexOf("ORDER"));
}
partSql = " FROM (" + upsql + ") counum";
}
// 查询结果总数量
int count = limap.size();
if (dataquery.isCount()) {
if (partSql.toUpperCase().indexOf("ORDER BY") > 0) {
partSql = partSql.substring(0, partSql.toUpperCase()
.indexOf("ORDER BY"));
}
partSql = SqlSelectSize + partSql;
count = runLimitQueryNum(session,
dataquery.getCountSql() == null ? partSql : dataquery
.getCountSql());
}
result = DataResult.getInstance(limap, count, Integer
.valueOf(dataquery.getCurrentPage()), dataquery
.getPagesize());
} catch (Exception e) {
throw new SQLException(e);
}
long endTime = new Date().getTime();
result.setRuntime(endTime - startTime);
return result;
}
/**
* 查询条件转换成sql语句
*
* @param dataquery
* 查询条件封装
* @return
* @throws SQLException
*/
public static String praseSQL(DataQuery dataquery) throws SQLException {
String distinct = "";
if (dataquery.isDistinct()) {
distinct = " distinct ";
}
StringBuffer SQL_run = new StringBuffer().append("select ").append(
distinct).append(dataquery.getTitles().toUpperCase()).append(
getSql_part(dataquery));
return upCaseSQLKEY(SQL_run.toString());
}
/**
* 将SQL关键字转换为大写
*
* @param SQL
* @return
*/
private static String upCaseSQLKEY(String SQL) {
SQL = SQL.replace(" select ", " SELECT ");
SQL = SQL.replace(" from ", " FROM ");
SQL = SQL.replace(" as ", " AS ");
SQL = SQL.replace(" where ", " WHERE ");
SQL = SQL.replace(" order by ", " ORDER BY ");
return SQL;
}
@SuppressWarnings("unchecked")
private static List<Object[]> runLimitQuery(Session session_, String Sql,
int firstResourt, int sizeResourt) {
List<Object[]> list = null;
try {
SQLQuery sqlQuery = session_.createSQLQuery(Sql);
sqlQuery.setFirstResult(firstResourt);
sqlQuery.setMaxResults(sizeResourt);
list = sqlQuery.list();
} catch (Exception e) {
throw new RuntimeException(e);
}
return list;
}
private static int runLimitQueryNum(Session session_, String countSql) {
SQLQuery sqlQuery = session_.createSQLQuery(countSql);
Object num = sqlQuery.list().get(0);
Integer renum = (Integer) Integer.valueOf(num.toString());
int n = renum.intValue();
return n;
}
private static String getSql_part(DataQuery query) throws SQLException {
String sql_part = getSql_from(query) + getSql_where(query)
+ getSortWhere(query);
return sql_part;
}
private static String getSortWhere(DataQuery query) {
List<DBSort> sortList = query.sort;
StringBuffer where = new StringBuffer(" order by ");
boolean isHaveSort = false;
for (Iterator<DBSort> iterator = sortList.iterator(); iterator
.hasNext();) {
DBSort name = (DBSort) iterator.next();
if (name != null && name.getSortTitleText() != null
&& name.getSortTypeText() != null
&& !name.getSortTitleText().equals("")
&& !name.getSortTypeText().equals("")) {
where.append(name.getSortTitleText());
where.append(" ");
where.append(name.getSortTypeText());
isHaveSort = true;
if (iterator.hasNext()) {
where.append(" , ");
}
}
}
if (!isHaveSort) {
return "";
}
return where.toString();
}
private static String getSql_from(DataQuery query) {
String sql_from = " from " + query.getTables() + " ";
return sql_from;
}
private static String getSql_where(DataQuery query) throws SQLException {
if (query.queryRule == null) {
throw new SQLException("whereList is null!");
}
Iterator<DBRule> it_ = query.queryRule.iterator();
StringBuffer where_ = new StringBuffer("");
where_.append(" where 1=1 ");
while (it_.hasNext()) {
DBRule _queryld = it_.next();
if (_queryld != null && _queryld.getValue() != null)
where_.append(_queryld.getThisLimit());
}
String sql_where = where_.toString();
if (query.getUserWhere() != null
&& query.getUserWhere().trim().length() > 1) {
sql_where = sql_where + " " + query.getUserWhere() + " ";
}
return sql_where;
}
}
package com.farm.core.sql.query;
import java.sql.SQLException;
import org.hibernate.Session;
import com.farm.core.sql.result.DataResult;
import com.farm.util.spring.HibernateSessionFactory;
public class SQLQuery {
private String sql;
private int pagesize;
private int currentPage;
private String countSql;
private SQLQuery() {
}
/**
* @param sql
* @param countSql 数量查询可以为空NULL
* @param pagesize
* @param currentPage
* @return
*/
public static SQLQuery getInstance(String sql, String countSql,
int pagesize, int currentPage) {
SQLQuery query = new SQLQuery();
query.setCurrentPage(currentPage);
query.setPagesize(pagesize);
query.setSql(sql);
query.setCountSql(countSql);
return query;
}
/**
* 执行查询
*
* @param session
* @return
* @throws SQLException
*/
public DataResult search(Session session) throws SQLException {
return HibernateQueryHandle.runSqlQuery(session, sql, countSql,
pagesize, currentPage);
}
/**
* 执行查询
*
* @param session
* @return
* @throws SQLException
*/
public DataResult search() throws SQLException {
Session session = HibernateSessionFactory.getSession();
DataResult result = null;
try {
result = this.search(session);
} catch (Exception e) {
throw new SQLException(e);
} finally {
session.close();
}
return result;
}
// ---------------------------------------------------------------------
public String getSql() {
return sql;
}
public void setSql(String sql) {
this.sql = sql;
}
public int getPagesize() {
return pagesize;
}
public void setPagesize(int pagesize) {
this.pagesize = pagesize;
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public String getCountSql() {
return countSql;
}
public void setCountSql(String countSql) {
this.countSql = countSql;
}
}
package com.farm.core.sql.query;
import java.sql.SQLException;
import java.util.Date;
import org.hibernate.Session;
import com.farm.core.sql.result.DataResult;
import com.farm.util.spring.HibernateSessionFactory;
/**
* DataQuery的查询器,可以通过线程启动(将查询结果更新到缓存中)或直接执行dosearch
*
* @author 王东
* @version 2014-10-29
*
*/
public class Searcher implements Runnable {
private DataQuery query = null;
private DataResult result = null;
@SuppressWarnings("unused")
private Searcher() {
}
public Searcher(DataQuery query) {
this.query = query;
}
/*
* 只有通过缓存查询,且缓存过期才会启动此线程进行查询
*/
@Override
public void run() {
Session session = HibernateSessionFactory.getSession();
try {
result = doSearch(session);
// 启用缓存功能,将当前结果存入缓存
String key = DataQuery.getQueryMD5Key(query);
if (key != null) {
result.setCtime(new Date());
DataQuery.resultCache.put(key, result);
}
} finally {
session.close();
}
}
public DataResult doSearch(Session session) {
try {
result = HibernateQueryHandle.runDataQuery(session, this.query);
} catch (SQLException e) {
throw new RuntimeException(e);
}
return result;
}
}
package com.farm.core.sql.result;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.log4j.Logger;
/**
* 结果集合工具类
*
* @author 王东
*
*/
public class DataResults {
private static final Logger log = Logger.getLogger(DataResults.class);
/**
* 由setMessage方法获得一个带消息的DataResult对象
*
* @param message消息
* @return DataResult对象
*/
public static DataResult setException(DataResult result, Exception e) {
if (result == null) {
result = DataResult.getInstance(
new ArrayList<Map<String, Object>>(), 0, 1, 10);
}
if (e != null) {
result.setMessage(e + e.getMessage());
log.error(result.getMessage());
}
return result;
}
/**
* 由一个hibernater结果集合获得一个List<Map<String, Object>>
*
* @param names
* a.id,a.subject,b.rname,a.visit,COUNT(a.id) AS num,
* @param resulresult
* List<Object[]>
* @return
*/
public static List<Map<String, Object>> getMaps(String names,
List<Object[]> t) {
if (names == null || t == null) {
throw new IllegalArgumentException("参数异常!");
}
names = names.replace(",", ",").toUpperCase();
String[] nameArray = names.split(",");
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
for (Iterator<Object[]> iterator = t.iterator(); iterator.hasNext();) {
Object[] objects = (Object[]) iterator.next();
Map<String, Object> mapresult = new HashMap<String, Object>();
// valueLength:结果记录字段值数量
int valueLength = objects.length;
if (nameArray.length < valueLength) {
valueLength = nameArray.length;
}
try {
for (int i = 0; i < valueLength; i++) {
Object value = objects[i];
String key = null;
if (names.trim().equals("*")) {
key = String.valueOf(i);
} else {
try {
key = nameArray[i].trim();
if (key.indexOf(" AS ") >= 0) {
key = key
.substring(key.trim().indexOf(" AS ") + 3);
}
key = key.replace(".", "_").trim();
} catch (Exception e) {
log.error("参数填充错误!(key和value数量可能不匹配)");
}
}
mapresult.put(key, value);
}
} catch (Exception e) {
log.error("参数填充错误!(key和value数量可能不匹配)");
}
list.add(mapresult);
}
return list;
}
/**
* 由字段名序列获得结构数据
*
* @param names
* 如name,type,ctime
* @return
*/
public static List<String> getTitles(String names) {
List<String> list = new ArrayList<String>();
if (names == null) {
throw new IllegalArgumentException("参数异常!");
}
names = names.replace(",", ",").toUpperCase();
String[] nameArray = names.split(",");
for (String name : nameArray) {
String key = "";
key = name.trim();
if (key.indexOf(" AS ") >= 0) {
key = key.substring(key.trim().indexOf(" AS ") + 3);
}
key = key.replace(".", "_").trim();
list.add(key);
}
return list;
}
/**
* 通过字符串生成一个和List<Map<String, Object>>相对应的key
*
* @param key
* 如a.asdf 或 ass as name
* @return 如A_ASDF或NAME
*/
public static String getMapKey(String key) {
key = key.trim();
if (key.indexOf(" AS ") >= 0) {
key = key.substring(key.trim().indexOf(" AS ") + 3);
}
key = key.replace(".", "_").trim();
return key.toUpperCase();
}
/**
* 遍历打印Map集合(list)
*
* @param listmap
*/
public static void printMaps(List<Map<String, Object>> listmap) {
for (Iterator<Map<String, Object>> iterator = listmap.iterator(); iterator
.hasNext();) {
Map<String, Object> name = (Map<String, Object>) iterator.next();
Set<String> keyset = name.keySet();
for (Iterator<String> iterator2 = keyset.iterator(); iterator2
.hasNext();) {
String name2 = (String) iterator2.next();
System.out.println(name2 + ":" + name.get(name2));
}
System.out.println("------------------------------------------");
}
}
}
package com.farm.core.sql.result;
import java.util.Map;
/**
* 结果集合的迭代接口
*
* @author Administrator
*
*/
public interface ResultsHandle {
/**
* 结果集合中的行
*
* @param row
*/
public void handle(Map<String, Object> row);
}
package com.farm.core.sql.utils;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.persister.entity.AbstractEntityPersister;
import com.farm.core.sql.query.DBRule;
public abstract class HibernateSQLTools<E> {
private AbstractEntityPersister classMetadata;
protected abstract Class<?> getTypeClass();
protected abstract SessionFactory getSessionFactory();
/**
* 在更新时创建对象键值对
*
* @param keyValses
* @return Address = 'Zhongshan 23', City = 'Nanjing'
*/
public static String getValusSqlStr(Map<String, Object> keyValses) {
boolean isFirst = true;
StringBuffer returnStr = new StringBuffer();
for (Entry<String, Object> node : keyValses.entrySet()) {
if (isFirst) {
isFirst = false;
} else {
returnStr.append(",");
}
returnStr.append(node.getKey());
returnStr.append(" = ");
returnStr.append("'");
returnStr.append(node.getValue());
returnStr.append("'");
}
return returnStr.toString();
}
/**
* 创建批量删除sql
*
* @param session
* @param rules
* 条件序列
*/
public void deleteSqlFromFunction(Session session, List<DBRule> rules) {
classMetadata = (AbstractEntityPersister) getSessionFactory()
.getClassMetadata(getTypeClass());
String whereStr;
if (rules == null || rules.size() <= 0) {
whereStr = "";
} else {
whereStr = " WHERE 1=1" + DBRule.makeWhereStr(rules);
}
SQLQuery sqlquery = session.createSQLQuery("DELETE FROM "
+ classMetadata.getTableName() + whereStr);
sqlquery.executeUpdate();
}
/**
* 创建批量查询SQL
*
* @param session
* @param rules
* 条件序列
* @return
*/
@SuppressWarnings("unchecked")
public List<E> selectSqlFromFunction(Session session, List<DBRule> rules) {
classMetadata = (AbstractEntityPersister) getSessionFactory()
.getClassMetadata(getTypeClass());
String whereStr;
if (rules == null || rules.size() <= 0) {
whereStr = "";
} else {
whereStr = " WHERE 1=1" + DBRule.makeWhereStr(rules);
}
Query sqlquery = session.createQuery("FROM " + getTypeClass().getName()
+ whereStr);
List<E> list = sqlquery.list();
return list;
}
/**
* 创建批量更新SQL
*
* @param sessionFatory
* @param values
* @param rules
*/
public void updataSqlFromFunction(Session session,
Map<String, Object> values, List<DBRule> rules) {
classMetadata = (AbstractEntityPersister) getSessionFactory()
.getClassMetadata(getTypeClass().getClass());
if (values == null || values.size() <= 0) {
return;
}
String whereStr;
if (rules == null || rules.size() <= 0) {
whereStr = "";
} else {
whereStr = " WHERE 1=1" + DBRule.makeWhereStr(rules);
}
SQLQuery sqlquery = session.createSQLQuery("UPDATE "
+ classMetadata.getTableName() + " SET "
+ HibernateSQLTools.getValusSqlStr(values) + whereStr);
sqlquery.executeUpdate();
}
/**
* 创建自定义统计SQL
*
* @param sessionFatory
* @param values
* @param rules
*/
@SuppressWarnings("unchecked")
public int countSqlFromFunction(Session session, List<DBRule> rules) {
classMetadata = (AbstractEntityPersister) getSessionFactory()
.getClassMetadata(getTypeClass());
String whereStr;
if (rules == null || rules.size() <= 0) {
whereStr = "";
} else {
whereStr = " WHERE 1=1" + DBRule.makeWhereStr(rules);
}
SQLQuery sqlquery = session.createSQLQuery("select count(*) num FROM "
+ classMetadata.getTableName() + whereStr);
List<E> list = sqlquery.list();
return Integer.valueOf(list.get(0).toString());
}
}
package com.farm.util.spring;
import javax.servlet.ServletContext;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import com.farm.core.config.AppConfig;
//读取配置文件进行加载
public class BeanFactory {
private static ApplicationContext appContext;
public static Object getBean(String beanId) {
getContext();
return appContext.getBean(beanId);
}
public static ApplicationContext getContext() {
if (appContext == null) {
appContext = new ClassPathXmlApplicationContext(AppConfig
.getString("init.config.spring.configs").split(","));
}
return appContext;
}
public static Object getBean(String beanId, ServletContext servletContext) {
ApplicationContext ctx = WebApplicationContextUtils
.getWebApplicationContext(servletContext);
return ctx.getBean(beanId);
}
}
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册