提交 d6c99332 编写于 作者: Z zhangnan

next round

<<<<<<< HEAD
spring-mvc-test是一个完整的,轻量、简单的Java项目,基于Spring MVC. spring-mvc-test是一个完整的,轻量、简单的Java项目,基于Spring MVC.
里面有基本的增删改查的功能。而且无需修改任何内容,就可以直接跑起来。 里面有基本的增删改查的功能。而且无需修改任何内容,就可以直接跑起来。
下面是Spring MVC的Guide页面,这个项目很多是基于它编写的。 下面是Spring MVC的Guide页面,这个项目很多是基于它编写的。
...@@ -80,3 +81,91 @@ If you want to deploy this project to Linux server, you might need to edit conf ...@@ -80,3 +81,91 @@ If you want to deploy this project to Linux server, you might need to edit conf
$ spring-oss-mini\resources\application.properties $ spring-oss-mini\resources\application.properties
=======
> 我叫Jerry, 本科毕业于2009年,而后开发和维护[Nokia NetAct](http://networks.nokia.com/portfolio/solutions/netact)系统至2016年7月。
> 我于2016年8月8日起开始在,USC 美国南加州大学攻读 计算机科学 硕士学位。
> My Linkedin: (https://www.linkedin.com/in/hot13399).
Spring-mvc-mini是一个完整的,轻量、简单的Java项目,适合于初学者学习Spring MVC.
里面有基本的增删改查的功能。无需修改任何内容,就可以直接跑起来。
下面是Spring MVC的Guide页面,这个项目很多是基于它编写的。
http://spring.io/guides
-------------------
在这个项目里主要实现了以下技术:
* spring-webmvc 实现Model-View-Control
* svnkit 实现自动checkout checkin SVN
* jgit 实现自动 pull push GIT
* javax.mail 实现自动发送IMAP email
* jasypt 实现用户密码加密
* dom4j 实现解析XML
* spring scheduler 实现定时任务
如何运行:
-------------------
在Windows的CMD:
$ cd spring-mvc-mini
$ mvn tomcat7:run
通过浏览器打开:http://localhost:8080/spring-mvc-mini
如果你想要学习或贡献和这个项目:
就通过maven把它build成一个IDE项目,执行以下命令,打开CMD:
$ cd spring-mvc-mini
$ mvn eclipse:eclipse or mvn idea:idea
通过Eclipse或IDEA导入即可。
Note:
-------------------
如果你要在Linux环境运行,以下的文件需要修改。
$ spring-oss-mini\src\main\webapp\WEB-INF\spring\appServlet\servlet-context.xml:
<context:property-placeholder location="file:/opt/web/spring-mvc-mini/resources/application.properties"/>
$ spring-oss-mini\src\main\resources\logback.xml
$ spring-oss-mini\resources\application.properties
最后通过Maven build一个war包部署即可。
--------------------
Spring-mvc-mini is a mini project using Spring MVC.
In this project, you can see the code of:
* spring-webmvc
* svnkit
* javax.mail
* jasypt
* dom4j
* spring scheduler
To run the application:
From the command line with Maven:
$ cd spring-mvc-mini
$ mvn tomcat7:run [-Dmaven.tomcat.port=<port no.>] (In case 8080 is busy]
Access the deployed web application at: http://localhost:8080/spring-mvc-mini
To contribute to this project:
In your preferred IDE such as Eclipse:
$ cd spring-mvc-mini
$ mvn eclipse:eclipse
Import spring-mvc-mini as a Maven Project
If you want to deploy this project to Linux server, you might need to edit conf files:
$ spring-oss-mini\src\main\webapp\WEB-INF\spring\appServlet\servlet-context.xml:
<context:property-placeholder location="file:/opt/web/spring-mvc-mini/resources/application.properties"/>
$ spring-oss-mini\src\main\resources\logback.xml
$ spring-oss-mini\resources\application.properties
>>>>>>> 158cee89e79a15fb22fc10af26bd6a164bf0bb02
<<<<<<< HEAD
package com.spring.mvc.mini.git; package com.spring.mvc.mini.git;
import com.jcraft.jsch.JSch; import com.jcraft.jsch.JSch;
...@@ -110,3 +111,101 @@ public class GitHandler { ...@@ -110,3 +111,101 @@ public class GitHandler {
} }
} }
=======
package com.spring.mvc.mini.git;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.TransportConfigCallback;
import org.eclipse.jgit.api.errors.*;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.storage.file.FileRepositoryBuilder;
import org.eclipse.jgit.transport.*;
import org.eclipse.jgit.util.FS;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.Iterator;
/**
* Created by n2zhang on 2015/7/31.
*/
@Component
public class GitHandler {
static Logger LOGGER = LoggerFactory.getLogger(GitHandler.class);
@Value("${path.git.ssh}")
private String gitSshPath;
@Value("${path.git.ssh.key}")
private String gitSshKey;
public void checkin() {
File repositoryPath = new File(gitSshPath);
Repository repository = null;
try {
repository = FileRepositoryBuilder.create(new File(repositoryPath, ".git"));
Git git = new Git(repository);
git.add()
.addFilepattern(".")
.call();
git.commit()
.setMessage("new managed object commited")
.call();
final SshSessionFactory sshSessionFactory = new JschConfigSessionFactory() {
@Override
protected void configure(OpenSshConfig.Host host, Session session) {
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
}
@Override
protected JSch createDefaultJSch(FS fs) throws JSchException {
JSch defaultJSch = super.createDefaultJSch(fs);
defaultJSch.addIdentity(gitSshKey);
return defaultJSch;
}
};
Iterable resultIterable = git.push().setRemote(gitSshPath).setTransportConfigCallback(new TransportConfigCallback() {
@Override
public void configure(Transport transport) {
SshTransport sshTransport = (SshTransport) transport;
sshTransport.setSshSessionFactory(sshSessionFactory);
}
}).call();
Iterator iterator = resultIterable.iterator();
while (iterator.hasNext () ) {
PushResult result = (PushResult) iterator.next ();
LOGGER.info(result.getMessages());
}
LOGGER.info("Json SVN Checked in at " + new Date());
} catch (IOException | UnmergedPathsException | WrongRepositoryStateException | ConcurrentRefUpdateException
| NoFilepatternException | AbortedByHookException | NoHeadException | InvalidRemoteException
| TransportException | NoMessageException e) {
LOGGER.error(e.toString());
} catch (GitAPIException e) {
LOGGER.error(e.toString());
} finally {
repository.close();
}
}
}
>>>>>>> 158cee89e79a15fb22fc10af26bd6a164bf0bb02
<<<<<<< HEAD
package com.spring.mvc.mini.json; package com.spring.mvc.mini.json;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
...@@ -67,3 +68,74 @@ public class RequestStatusJsonParser { ...@@ -67,3 +68,74 @@ public class RequestStatusJsonParser {
} }
=======
package com.spring.mvc.mini.json;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.spring.mvc.mini.pojo.ObjectClass;
import com.spring.mvc.mini.pojo.RequestStatus;
import com.spring.mvc.mini.pojo.RequestStatusListType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.io.File;
import java.io.IOException;
import java.util.List;
@Component
public class RequestStatusJsonParser {
private static final Logger LOG = LoggerFactory.getLogger(RequestStatusJsonParser.class);
@Value("${path.json}")
private String jsonPath;
public int getMaxIntClass() {
List<RequestStatus> list = this.readStatus();
List<ObjectClass> objectClasses = list.get(list.size() - 1).getObjectClassesType().getObjectClasses();
return objectClasses.get(objectClasses.size() - 1).getIntclass();
}
public int getLatestmocrid() {
List<RequestStatus> mrsList = this.readStatus();
return mrsList.get(mrsList.size() - 1).getmocrid();
}
public void writeStatus(RequestStatusListType mrslt) {
try {
new ObjectMapper().writeValue(new File(jsonPath), mrslt);
} catch (IOException e) {
LOG.error(e.toString());
}
}
public List<RequestStatus> readStatus() {
RequestStatusListType type = null;
try {
type = new ObjectMapper().readValue(new File(jsonPath), RequestStatusListType.class);
LOG.debug(type.toString());
} catch (IOException e) {
LOG.error(e.toString());
}
return type.getRequestStatuses();
}
}
>>>>>>> 158cee89e79a15fb22fc10af26bd6a164bf0bb02
<<<<<<< HEAD
package com.spring.mvc.mini.pojo; package com.spring.mvc.mini.pojo;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -23,3 +24,30 @@ public class ObjectClassesType { ...@@ -23,3 +24,30 @@ public class ObjectClassesType {
return "ObjectClassesType [objectClasses=" + sb + "]"; return "ObjectClassesType [objectClasses=" + sb + "]";
} }
} }
=======
package com.spring.mvc.mini.pojo;
import java.util.List;
public class ObjectClassesType {
private List<ObjectClass> objectClasses;
public List<ObjectClass> getObjectClasses() {
return objectClasses;
}
public void setObjectClasses(List<ObjectClass> objectClasses) {
this.objectClasses = objectClasses;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
for (ObjectClass item : objectClasses) {
sb.append(item);
}
return "ObjectClassesType [objectClasses=" + sb + "]";
}
}
>>>>>>> 158cee89e79a15fb22fc10af26bd6a164bf0bb02
<<<<<<< HEAD
package com.spring.mvc.mini.pojo; package com.spring.mvc.mini.pojo;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -26,3 +27,33 @@ public class RequestStatusListType { ...@@ -26,3 +27,33 @@ public class RequestStatusListType {
} }
=======
package com.spring.mvc.mini.pojo;
import java.util.List;
public class RequestStatusListType {
private List<RequestStatus> requestStatuses;
public List<RequestStatus> getRequestStatuses() {
return requestStatuses;
}
public void setRequestStatuses(List<RequestStatus> requestStatuses) {
this.requestStatuses = requestStatuses;
}
@Override
public String toString() {
StringBuilder s = new StringBuilder();
for (RequestStatus r: requestStatuses){
s.append(r);
}
return "RequestStatusListType [requestStatuses=" + s + "]";
}
}
>>>>>>> 158cee89e79a15fb22fc10af26bd6a164bf0bb02
<<<<<<< HEAD
package com.spring.mvc.mini.schedule; package com.spring.mvc.mini.schedule;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -102,3 +103,109 @@ public class ScheduleFileUpdator { ...@@ -102,3 +103,109 @@ public class ScheduleFileUpdator {
mailSender.sendMail(userInfo.getUsername(), userInfo.getPassword(), userInfo.getEmail(), toAddress, subject, text); mailSender.sendMail(userInfo.getUsername(), userInfo.getPassword(), userInfo.getEmail(), toAddress, subject, text);
} }
} }
=======
package com.spring.mvc.mini.schedule;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.mail.Address;
import javax.mail.internet.InternetAddress;
import org.joda.time.DateTime;
import org.joda.time.Days;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import com.spring.mvc.mini.json.RequestStatusJsonParser;
import com.spring.mvc.mini.mail.MailSender;
import com.spring.mvc.mini.pojo.RequestStatus;
import com.spring.mvc.mini.pojo.RequestStatusListType;
import com.spring.mvc.mini.pojo.ObjectClass;
import com.spring.mvc.mini.pojo.StatusType;
import com.spring.mvc.mini.pojo.UserInfo;
import com.spring.mvc.mini.svn.SVNHandler;
import com.spring.mvc.mini.xml.ObjectClassXMLPaser;
public class ScheduleFileUpdator {
private static final Logger LOG = LoggerFactory.getLogger(ScheduleFileUpdator.class);
@Autowired
private RequestStatusJsonParser jsonParser;
@Autowired
private SVNHandler svnHandler;
@Autowired
private ObjectClassXMLPaser objectClassXMLPaser;
@Autowired
private MailSender mailSender;
public void commitObjectClassXml() {
Calendar calendar = Calendar.getInstance();
Date currentTime = calendar.getTime();
LOG.info("Scheduler start at:" + currentTime);
List<RequestStatus> requestStatuses = jsonParser.readStatus();
for (RequestStatus status : requestStatuses) {
int daysBetweenSubmitAndCurrent = Days.daysBetween(new DateTime(status.getSubmitDate()), new DateTime(currentTime)).getDays();
if (StatusType.ongoing.equals(status.getStatus())) {
if (daysBetweenSubmitAndCurrent >= 5) {
setCommitDateAndStatus(currentTime, requestStatuses, status);
LOG.info("MO CR " + status.getmocrid() + " was checked at:" + new Date());
try {
this.commitAndSendMail(status.getUserinfo(), appendCommitMessage(status), "Congratulation!");
} catch (Exception e) {
LOG.error(e.toString());
}
}
}
}
RequestStatusListType type = new RequestStatusListType();
type.setRequestStatuses(requestStatuses);
jsonParser.writeStatus(type);
svnHandler.svnCheckin();
}
private String appendCommitMessage(RequestStatus status) {
StringBuilder s = new StringBuilder();
s.append("Final approval of MO CR ");
s.append(status.getmocrid());
s.append(" for ");
for (ObjectClass objcls : status.getObjectClassesType().getObjectClasses()) {
objectClassXMLPaser.AddObjectClass(objcls);
s.append(objcls.getAbbreviation());
}
return s.toString();
}
private static void setCommitDateAndStatus(Date currentTime, List<RequestStatus> requestStatuses, RequestStatus status) {
int requestStatusIndex;
requestStatusIndex = requestStatuses.indexOf(status);
requestStatuses.get(requestStatusIndex).setCommitDate(currentTime);
requestStatuses.get(requestStatusIndex).setStatus(StatusType.commited);
}
public void commitAndSendMail(UserInfo userInfo, String subject, String text) throws Exception {
Address[] toAddress = {new InternetAddress(userInfo.getEmail())};
mailSender.sendMail(userInfo.getUsername(), userInfo.getPassword(), userInfo.getEmail(), toAddress, subject, text);
}
}
>>>>>>> 158cee89e79a15fb22fc10af26bd6a164bf0bb02
<<<<<<< HEAD
package com.spring.mvc.mini.svn; package com.spring.mvc.mini.svn;
import org.slf4j.Logger; import org.slf4j.Logger;
...@@ -133,3 +134,142 @@ public class SVNHandler { ...@@ -133,3 +134,142 @@ public class SVNHandler {
} }
} }
=======
package com.spring.mvc.mini.svn;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.tmatesoft.svn.core.SVNDepth;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
import org.tmatesoft.svn.core.io.SVNRepository;
import org.tmatesoft.svn.core.io.SVNRepositoryFactory;
import org.tmatesoft.svn.core.wc.*;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.util.Date;
@Component
public class SVNHandler {
private static final Logger LOG = LoggerFactory.getLogger(SVNHandler.class);
@Value("${svn.rep.url}")
private String repURL;
@Value("${path.rep}")
private String repPath;
@Value("${svn.username}")
private String username;
@Value("${svn.password}")
private String password;
@Value("${path.json}")
private String jsonPath;
@Value("${path.xml}")
private String xmlPath;
public void svnCheckin() {
SVNRepository repository;
SVNClientManager ourClientManager = SVNClientManager.newInstance();
try {
repository = SVNRepositoryFactory.create(SVNURL.parseURIDecoded(repURL));
ISVNAuthenticationManager authManager =
SVNWCUtil.createDefaultAuthenticationManager(username, password);
repository.setAuthenticationManager(authManager);
LOG.info("Repository Root: " + repository.getRepositoryRoot(true));
LOG.info("Repository UUID: " + repository.getRepositoryUUID(true));
LOG.info("Repository Latest Revision: " + repository.getLatestRevision());
ourClientManager.setAuthenticationManager(authManager);
SVNCommitClient commitClient = ourClientManager.getCommitClient();
SVNDiffClient diffClient = ourClientManager.getDiffClient();
File xmlfile = new File(xmlPath);
File jsonfile = new File(jsonPath);
File[] xmlfilearray = {xmlfile};
File[] jsonfilearray = {jsonfile};
final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
diffClient.doDiff(xmlfile, SVNRevision.UNDEFINED, SVNRevision.BASE, SVNRevision.WORKING,
SVNDepth.INFINITY, true, outputStream, null);
if (outputStream.size() > 0) {
commitClient.doCommit(xmlfilearray, false, outputStream.toString("UTF-8"), false, true);
LOG.info("XML Checked in at " + new Date());
}
diffClient.doDiff(jsonfile, SVNRevision.UNDEFINED, SVNRevision.BASE, SVNRevision.WORKING,
SVNDepth.INFINITY, true, outputStream, null);
if (outputStream.size() > 0) {
commitClient.doCommit(jsonfilearray, false, outputStream.toString("UTF-8"), false, true);
LOG.info("Json SVN Checked in at " + new Date());
}
} catch (SVNException|UnsupportedEncodingException e) {
LOG.error(e.toString());
} finally {
ourClientManager.dispose();
}
}
public void svnCheckout() {
File svnTempDir = new File(repPath);
if (svnTempDir.exists()) {
return;
}
SVNRepository repository;
try {
//initiate the reporitory from the url
repository = SVNRepositoryFactory.create(SVNURL.parseURIDecoded(repURL));
//create authentication data
ISVNAuthenticationManager authManager =
SVNWCUtil.createDefaultAuthenticationManager(username, password);
repository.setAuthenticationManager(authManager);
//need to identify latest revision
long latestRevision = repository.getLatestRevision();
//create client manager and set authentication
SVNClientManager ourClientManager = SVNClientManager.newInstance();
ourClientManager.setAuthenticationManager(authManager);
//use SVNUpdateClient to do the export
SVNUpdateClient updateClient = ourClientManager.getUpdateClient();
updateClient.setIgnoreExternals(false);
updateClient.doCheckout(repository.getLocation(), svnTempDir,
SVNRevision.create(latestRevision), SVNRevision.create(latestRevision), true);
} catch (SVNException e) {
LOG.error(e.toString());
} finally {
LOG.info("resources/svn_temp checked outs");
}
}
}
>>>>>>> 158cee89e79a15fb22fc10af26bd6a164bf0bb02
<<<<<<< HEAD
package com.spring.mvc.mini.validation; package com.spring.mvc.mini.validation;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -58,3 +59,65 @@ public class ObjectClassDataValidator { ...@@ -58,3 +59,65 @@ public class ObjectClassDataValidator {
} }
} }
} }
=======
package com.spring.mvc.mini.validation;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.spring.mvc.mini.pojo.ObjectClass;
import com.spring.mvc.mini.xml.ObjectClassXMLPaser;
@Component
public class ObjectClassDataValidator {
@Autowired
private ObjectClassXMLPaser objectClassXMLPaser;
public void checkData(List<ObjectClass> objclsListFormIn) throws Exception{
List<ObjectClass> objclsListXmlIn = objectClassXMLPaser.objectClassMapping();
for (ObjectClass objclsItemFormIn:objclsListFormIn){
boolean parentsMark = false;
if(!objclsItemFormIn.getAbbreviation().equals(objclsItemFormIn.getAbbreviation().toUpperCase())){
throw new ObjectClassDataValidationException("FAILED:ObjectClass abbrev:\""+objclsItemFormIn.getAbbreviation()+"\" should be all uppercase.");
}
for (ObjectClass objclsItemXmlIn:objclsListXmlIn){
if(objclsItemXmlIn.getId().equals(objclsItemFormIn.getId())){
throw new ObjectClassDataValidationException("FAILED:ObjectClass id:\""+objclsItemFormIn.getId()+"\" is already reserved.");
}
if(objclsItemXmlIn.getAbbreviation().equals(objclsItemFormIn.getAbbreviation())){
throw new ObjectClassDataValidationException("FAILED:ObjectClass abbrev:\""+objclsItemFormIn.getAbbreviation()+"\" is already reserved.");
}
if(objclsItemXmlIn.getId().equals(objclsItemFormIn.getParents())){
parentsMark = true;
}
}
for (ObjectClass objclsItemFormInInner:objclsListFormIn){
if(objclsItemFormInInner.getId().equals(objclsItemFormIn.getParents())){
parentsMark = true;
}
}
if (!parentsMark){
throw new ObjectClassDataValidationException("FAILED:ObjectClass parent:\""+objclsItemFormIn.getParents()+"\" is not existing.");
}
}
}
public void checkmocrid(String mocrid,int latestmocrid) throws Exception{
if (Integer.parseInt(mocrid) <= latestmocrid ){
throw new ObjectClassDataValidationException("FAILED:MO CR ID:\""+mocrid+"\" is not valid anymore, please refresh and recommit again.");
}
}
}
>>>>>>> 158cee89e79a15fb22fc10af26bd6a164bf0bb02
<<<<<<< HEAD
package com.spring.mvc.mini.web; package com.spring.mvc.mini.web;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
...@@ -207,3 +208,216 @@ public class ObjectClassFormController { ...@@ -207,3 +208,216 @@ public class ObjectClassFormController {
} }
} }
=======
package com.spring.mvc.mini.web;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.mail.Address;
import javax.mail.internet.InternetAddress;
import javax.validation.Valid;
import com.spring.mvc.mini.pojo.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mvc.extensions.ajax.AjaxUtils;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import com.spring.mvc.mini.json.RequestStatusJsonParser;
import com.spring.mvc.mini.mail.MailSender;
import com.spring.mvc.mini.pojo.RequestStatus;
import com.spring.mvc.mini.validation.ObjectClassDataValidator;
@Controller
@RequestMapping("/objectclassform")
@SessionAttributes({"ojbclslisttype", "userinfo", "mocrid"})
public class ObjectClassFormController {
private static final Logger LOG = LoggerFactory.getLogger(ObjectClassFormController.class);
private static final String MESSAGE = "message";
@Value("${mail.to}")
private String mailto;
@Value("${web.hostname}")
private String webHostname;
@Autowired
private RequestStatusJsonParser requestStatusJsonParser;
@Autowired
private ObjectClassDataValidator objectClassDataValidator;
@Autowired
private MailSender mailSender;
@ModelAttribute
public void ajaxAttribute(WebRequest request, Model model) {
model.addAttribute("ajaxRequest", AjaxUtils.isAjaxRequest(request));
}
@ModelAttribute("userinfo")
public UserInfo createUserinfo() {
return new UserInfo();
}
@ModelAttribute("mocrid")
public String createMocrid() {
return String.valueOf(1 + requestStatusJsonParser.getLatestmocrid());
}
@RequestMapping(method = RequestMethod.GET)
public void handleObjectClassForm(Model model, @ModelAttribute("userinfo") UserInfo userinfo, @ModelAttribute("mocrid") String mocrid) {
ObjectClassesType objectClassesType = new ObjectClassesType();
List<ObjectClass> objectClasses = new ArrayList<ObjectClass>();
objectClasses.add(createObjectClassInstance(0, userinfo, mocrid));
objectClassesType.setObjectClasses(objectClasses);
model.addAttribute("objectClassesType", objectClassesType);
}
//Add More
@RequestMapping(params = {"objclscount"}, method = RequestMethod.POST)
public void handleObjectClassFormWithParam(@Valid ObjectClassesType objectClassesType, @ModelAttribute("userinfo") UserInfo userinfo, @ModelAttribute("mocrid") String mocrid, @RequestParam String ObjectClassCount, Model model) {
List<ObjectClass> objectClasses = objectClassesType.getObjectClasses();
objectClasses.add(createObjectClassInstance(Integer.parseInt(ObjectClassCount), userinfo, mocrid));
objectClassesType.setObjectClasses(objectClasses);
model.addAttribute("ObjectClassesType", objectClassesType);
}
//Submit
@RequestMapping(method = RequestMethod.POST)
public String handleSubmit(ObjectClassesType objectClassesType, @ModelAttribute("userinfo") UserInfo userinfo,
@ModelAttribute("mocrid") String mocrid,
@ModelAttribute("ajaxRequest") boolean ajaxRequest,
Model model, RedirectAttributes redirectAttrs) {
if (userinfo.getUsername() == null) {
model.addAttribute(MESSAGE, "Sorry, Please submit UserInfoForm at first. ");
return null;
}
List<ObjectClass> objectClasses = objectClassesType.getObjectClasses();
try {
objectClassDataValidator.checkData(objectClasses);
objectClassDataValidator.checkmocrid(mocrid, requestStatusJsonParser.getLatestmocrid());
} catch (Exception e) {
model.addAttribute(MESSAGE, e.toString());
return null;
}
constructDebugMessage(objectClasses);
RequestStatus s = new RequestStatus();
Calendar cal = Calendar.getInstance();
s.setSubmitDate(cal.getTime());
s.setmocrid(Integer.parseInt(mocrid));
s.setObjectClassesType(objectClassesType);
s.setStatus(StatusType.ongoing);
s.setUserinfo(userinfo);
List<RequestStatus> l = requestStatusJsonParser.readStatus();
l.add(s);
RequestStatusListType type = new RequestStatusListType();
type.setRequestStatuses(l);
requestStatusJsonParser.writeStatus(type);
try {
this.commitAndSendMail(userinfo, constructMailSubject(mocrid, objectClasses), constructMailText(userinfo, mocrid));
} catch (Exception e) {
model.addAttribute(MESSAGE, e.toString());
return null;
}
String message = "MO CR:" + mocrid + " committed. System will send mail to reviewers.";
if (ajaxRequest) {
model.addAttribute(MESSAGE, message);
return null;
} else {
redirectAttrs.addFlashAttribute(MESSAGE, message);
return "redirect:/objectclassform";
}
}
private String constructMailText(@ModelAttribute("userinfo") UserInfo userinfo, @ModelAttribute("mocrid") String mocrid) {
StringBuilder textsb = new StringBuilder();
textsb.append("Hi,\r\n\r\nThese MO CR's shall be approved if no other comments.\r\nIf you have any comment, please comment on this page:\r\n");
textsb.append("http://");
textsb.append(webHostname);
textsb.append(":8080/spring-mvc-mini/requeststatus?mocrid=");
textsb.append(mocrid);
textsb.append("\r\nor mailto:");
textsb.append(userinfo.getEmail());
textsb.append("\r\n");
textsb.append("The request will be committed in 5 days.\r\n\r\nThanks.\r\n");
textsb.append("http://");
textsb.append(webHostname);
textsb.append(":8080/spring-mvc-mini/");
return textsb.toString();
}
private String constructMailSubject(@ModelAttribute("mocrid") String mocrid, List<ObjectClass> objectClasses) {
StringBuilder subjectsb = new StringBuilder();
subjectsb.append("Forthcoming approval of MO CR ");
subjectsb.append(mocrid);
subjectsb.append(" for ");
for (ObjectClass objcls : objectClasses) {
subjectsb.append(objcls.getAbbreviation());
}
return subjectsb.toString();
}
private static void constructDebugMessage(List<ObjectClass> objectClasses) {
StringBuilder debugmessage = new StringBuilder();
for (ObjectClass objcls : objectClasses) {
debugmessage.append(objcls);
}
LOG.debug(debugmessage.toString());
}
private ObjectClass createObjectClassInstance(int i, UserInfo userinfo, String mocrid) {
ObjectClass objcls = new ObjectClass();
objcls.setIntclass(requestStatusJsonParser.getMaxIntClass() + 1 + i);
Calendar cal = Calendar.getInstance();
Date currenttime = cal.getTime();
SimpleDateFormat sdf = new SimpleDateFormat("YYYY.MM.DD");
objcls.setComment("# " + userinfo.getEmail() + " " + sdf.format(currenttime) + " MO CR " + mocrid);
return objcls;
}
public void commitAndSendMail(UserInfo userinfo, String subject, String text) throws Exception {
Address[] toAddress = {new InternetAddress(mailto), new InternetAddress(userinfo.getEmail())};
mailSender.sendMail(userinfo.getUsername(), userinfo.getPassword(), userinfo.getEmail(), toAddress, subject, text);
}
}
>>>>>>> 158cee89e79a15fb22fc10af26bd6a164bf0bb02
<<<<<<< HEAD
package com.spring.mvc.mini.web; package com.spring.mvc.mini.web;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -133,3 +134,142 @@ public class ObjectClassesController { ...@@ -133,3 +134,142 @@ public class ObjectClassesController {
} }
} }
=======
package com.spring.mvc.mini.web;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.support.PagedListHolder;
import org.springframework.mvc.extensions.ajax.AjaxUtils;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import com.spring.mvc.mini.pojo.ObjectClass;
import com.spring.mvc.mini.xml.ObjectClassXMLPaser;
@Controller
@RequestMapping("/objectClasses")
@SessionAttributes("productList")
public class ObjectClassesController {
private static final Logger LOG = LoggerFactory.getLogger(ObjectClassesController.class);
private static final String PRODUCT_LIST = "productList";
@Autowired
private ObjectClassXMLPaser objectClassXMLPaser;
@ModelAttribute
public void ajaxAttribute(WebRequest request, Model model) {
model.addAttribute("ajaxRequest", AjaxUtils.isAjaxRequest(request));
}
@RequestMapping(method = RequestMethod.GET)
public String enrichobjectClassesType(Model model, @ModelAttribute("page") String page) {
List<ObjectClass> ojbclslist = getObjectClasses();
Collections.reverse(ojbclslist);
PagedListHolder productList = new PagedListHolder(ojbclslist);
productList.setPageSize(100);
model.addAttribute(PRODUCT_LIST, productList);
return null;
}
private List<ObjectClass> getObjectClasses() {
List<ObjectClass> ojbclslist = null;
try {
ojbclslist = objectClassXMLPaser.objectClassMapping();
} catch (Exception e) {
LOG.error("get XML Object Class exception", e);
}
return ojbclslist;
}
@RequestMapping(params = {"jumppage"}, method = RequestMethod.GET)
public String handleObjectClassPagination(Model model, @ModelAttribute("jumppage") String jumppage, @ModelAttribute(PRODUCT_LIST) PagedListHolder<ArrayList<ObjectClass>> productList) {
LOG.info("@RequestMapping(params={\"jumppage\"}, method = RequestMethod.GET)");
if (jumppage != null) {
if ("next".equals(jumppage)) {
productList.nextPage();
} else if ("previous".equals(jumppage)) {
productList.previousPage();
} else if (isInteger(jumppage) > 0) {
productList.setPage(isInteger(jumppage));
}
}
model.addAttribute(PRODUCT_LIST, productList);
return null;
}
@RequestMapping(params = {"searchcritical"}, method = RequestMethod.GET)
public String searchObjectClass(Model model, @ModelAttribute("searchcritical") String searchcritical) {
LOG.info("@RequestMapping(params={\"searchcritical\"}, method = RequestMethod.GET)");
List<ObjectClass> searchOjbclslist = null;
if (searchcritical != null) {
List<ObjectClass> ojbclslist = getObjectClasses();
searchOjbclslist = new ArrayList<ObjectClass>();
for (ObjectClass ojbcls : ojbclslist) {
if (ojbcls.match(searchcritical)) {
searchOjbclslist.add(ojbcls);
}
}
}
PagedListHolder<ArrayList<ObjectClass>> productList = new PagedListHolder(searchOjbclslist);
productList.setPageSize(50);
model.addAttribute(PRODUCT_LIST, productList);
return null;
}
@RequestMapping(method = RequestMethod.POST)
public String submit(Model model, @ModelAttribute("page") String page,
@ModelAttribute(PRODUCT_LIST) PagedListHolder<ArrayList<ObjectClass>> productList,
@ModelAttribute("ajaxRequest") boolean ajaxRequest, RedirectAttributes redirectAttrs) {
LOG.info("@RequestMapping(method=RequestMethod.POST)");
String message = "Form submitted successfully. Bound ";
if (ajaxRequest) {
model.addAttribute("message", message);
return null;
} else {
redirectAttrs.addFlashAttribute("message", message);
return "redirect:/objectClasses";
}
}
private static int isInteger(String s) {
int i;
try {
i = Integer.parseInt(s);
} catch (NumberFormatException e) {
return -1;
}
return i;
}
}
>>>>>>> 158cee89e79a15fb22fc10af26bd6a164bf0bb02
<<<<<<< HEAD
package com.spring.mvc.mini.web; package com.spring.mvc.mini.web;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -162,3 +163,171 @@ public class RequestStatusController { ...@@ -162,3 +163,171 @@ public class RequestStatusController {
} }
} }
=======
package com.spring.mvc.mini.web;
import java.util.List;
import javax.mail.Address;
import javax.mail.internet.InternetAddress;
import com.spring.mvc.mini.pojo.RequestStatus;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mvc.extensions.ajax.AjaxUtils;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import com.spring.mvc.mini.json.RequestStatusJsonParser;
import com.spring.mvc.mini.mail.MailSender;
import com.spring.mvc.mini.pojo.RequestStatusListType;
import com.spring.mvc.mini.pojo.UserInfo;
@Controller
@RequestMapping("/requeststatus")
public class RequestStatusController {
private static final Logger LOGGER = LoggerFactory.getLogger(RequestStatusController.class);
private static final String REQUEST_STATUS = "requestStatus";
private static final String MESSAGE = "message";
@Autowired
private RequestStatusJsonParser requestStatusJsonParser;
@Autowired
private MailSender mailSender;
@ModelAttribute
public void ajaxAttribute(WebRequest request, Model model) {
model.addAttribute("ajaxRequest", AjaxUtils.isAjaxRequest(request));
}
@RequestMapping(method = RequestMethod.GET)
public void handleObjectClassForm(Model model) {
model.addAttribute(REQUEST_STATUS, new RequestStatus());
}
@RequestMapping(params={"mocrid"},method=RequestMethod.GET)
public void enrichObjectClassFormWithParam(@RequestParam String mocrid, Model model) {
List<RequestStatus> mrsList = requestStatusJsonParser.readStatus();
for(RequestStatus mrs:mrsList){
if(mrs.getmocrid() == Integer.parseInt(mocrid)){
LOGGER.debug("mrs.getmocrid() is:"+mrs.getmocrid());
model.addAttribute(REQUEST_STATUS, mrs);
}
}
}
@RequestMapping(method=RequestMethod.POST)
public String submit(@ModelAttribute(REQUEST_STATUS) RequestStatus requestStatus,
@ModelAttribute("ajaxRequest") boolean ajaxRequest,
Model model, RedirectAttributes redirectAttrs) {
if(requestStatus.getObjectClassesType() == null){
List<RequestStatus> mrsList = requestStatusJsonParser.readStatus();
if (isMocridEquals(requestStatus, model, mrsList)){
model.addAttribute(MESSAGE, "SUCCESS:MO CR ID:"+requestStatus.getmocrid()+" is presenting.");
return null;
} else {
model.addAttribute(REQUEST_STATUS, new RequestStatus());
model.addAttribute(MESSAGE, "FAILED:MO CR ID:"+requestStatus.getmocrid()+" is not existing.");
}
}
List<RequestStatus> requestStatuses = requestStatusJsonParser.readStatus();
int index = 0;
for (RequestStatus item:requestStatuses){
if(item.getmocrid() == requestStatus.getmocrid()){
index = requestStatuses.indexOf(item);
break;
}
}
requestStatuses.get(index).setComments(requestStatus.getComments());
requestStatuses.get(index).setObjectClassesType(requestStatus.getObjectClassesType());
RequestStatusListType type = new RequestStatusListType();
type.setRequestStatuses(requestStatuses);
requestStatusJsonParser.writeStatus(type);
LOGGER.debug(type.toString());
try {
this.commentAndSendMail(requestStatuses.get(index).getUserinfo(), constructMailSubject(requestStatus), constructMailText(requestStatus, requestStatuses, index));
} catch (Exception e) {
model.addAttribute(MESSAGE, e.toString());
return null;
}
String message = "Your update was submitted.";
if (ajaxRequest) {
model.addAttribute(MESSAGE, message);
return null;
} else {
return "redirect:/requeststatus";
}
}
private String constructMailText(@ModelAttribute(REQUEST_STATUS) RequestStatus requestStatus, List<RequestStatus> requestStatuses, int index) {
StringBuilder textsb = new StringBuilder();
textsb.append("New Comments: \r\n");
textsb.append(requestStatus.getComments());
textsb.append(" \r\n");
if(!requestStatuses.get(index).getObjectClassesType().equals(requestStatus.getObjectClassesType())){
textsb.append("Object Classes updated: \r\n");
textsb.append(requestStatus.getObjectClassesType().toString());
}
textsb.append("http://localhost:8080/spring-mvc-mini/requeststatus?mocrid=");
textsb.append(requestStatus.getmocrid());
textsb.append(" \r\n");
textsb.append(" \r\n");
return textsb.toString();
}
private String constructMailSubject(@ModelAttribute(REQUEST_STATUS) RequestStatus requestStatus) {
StringBuilder subjectsb = new StringBuilder();
subjectsb.append("MO CR:");
subjectsb.append(requestStatus.getmocrid());
subjectsb.append(" Updated");
return subjectsb.toString();
}
private boolean isMocridEquals(@ModelAttribute(REQUEST_STATUS) RequestStatus requestStatus, Model model, List<RequestStatus> mrsList) {
boolean boo = false;
for(RequestStatus mrs:mrsList){
if(mrs.getmocrid() == requestStatus.getmocrid()){
model.addAttribute(REQUEST_STATUS, mrs);
boo = true;
}
}
return boo;
}
public void commentAndSendMail(UserInfo userinfo ,String subject, String text) throws Exception{
Address[] toAddress = {new InternetAddress(userinfo.getEmail())};
mailSender.sendMail(userinfo.getUsername(), userinfo.getPassword(), userinfo.getEmail(), toAddress, subject, text);
}
}
>>>>>>> 158cee89e79a15fb22fc10af26bd6a164bf0bb02
<<<<<<< HEAD
package com.spring.mvc.mini.web; package com.spring.mvc.mini.web;
import javax.mail.Address; import javax.mail.Address;
...@@ -78,3 +79,87 @@ public class UserInfoFormController { ...@@ -78,3 +79,87 @@ public class UserInfoFormController {
} }
} }
=======
package com.spring.mvc.mini.web;
import javax.mail.Address;
import javax.mail.MessagingException;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mvc.extensions.ajax.AjaxUtils;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import com.spring.mvc.mini.mail.MailSender;
import com.spring.mvc.mini.pojo.UserInfo;
@Controller
@RequestMapping("/userinfoform")
@SessionAttributes("userinfo")
public class UserInfoFormController {
private static final String MESSAGE = "message";
@Autowired
private MailSender ms;
@ModelAttribute
public void ajaxAttribute(WebRequest request, Model model) {
model.addAttribute("ajaxRequest", AjaxUtils.isAjaxRequest(request));
}
@ModelAttribute("userinfo")
public UserInfo createUserinfo() {
return new UserInfo();
}
@RequestMapping(method=RequestMethod.GET)
public void userinfoForm() {
}
@RequestMapping(method=RequestMethod.POST)
public String submit(UserInfo userinfo,
@ModelAttribute("ajaxRequest") boolean ajaxRequest,
Model model, RedirectAttributes redirectAttrs) {
try {
loginAndSendMail(userinfo);
} catch (Exception e) {
model.addAttribute(MESSAGE, "Login Failed:"+e.toString());
return null;
}
String message="Login Successful, Click ObjecClassForm to continue.";
model.addAttribute("userinfo", userinfo);
if (ajaxRequest) {
model.addAttribute(MESSAGE, message);
return null;
} else {
redirectAttrs.addFlashAttribute(MESSAGE, message);
return "redirect:/";
}
}
private void loginAndSendMail(UserInfo userinfo) throws Exception{
String subject = "Login successfully to mvc mini";
String text="Welcome you,"+userinfo.getUsername()+"!\r\nYou can reserve the object classes now.";
Address[] toAddress = {new InternetAddress(userinfo.getEmail())};
ms.sendMail(userinfo.getUsername(), userinfo.getPassword(), userinfo.getEmail(),toAddress, subject, text);
}
}
>>>>>>> 158cee89e79a15fb22fc10af26bd6a164bf0bb02
<<<<<<< HEAD
package com.spring.mvc.mini.xml; package com.spring.mvc.mini.xml;
import com.spring.mvc.mini.pojo.ObjectClass; import com.spring.mvc.mini.pojo.ObjectClass;
...@@ -143,3 +144,151 @@ public class ObjectClassXMLPaser { ...@@ -143,3 +144,151 @@ public class ObjectClassXMLPaser {
} }
} }
=======
package com.spring.mvc.mini.xml;
import com.spring.mvc.mini.pojo.ObjectClass;
import com.spring.mvc.mini.svn.SVNHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.w3c.dom.*;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
@Component
public class ObjectClassXMLPaser {
private static final Logger LOGGER = LoggerFactory.getLogger(ObjectClassXMLPaser.class);
@Value("${path.xml}")
private String xmlPath;
@Autowired
private SVNHandler svnHandler;
public List<ObjectClass> objectClassMapping() throws Exception {
LOGGER.info("Start to checkout");
svnHandler.svnCheckout();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
File objectClassesFile = new File(xmlPath);
Document document = builder.parse(objectClassesFile);
List<ObjectClass> objectClasses = new ArrayList<>();
NodeList nodeList = document.getDocumentElement().getChildNodes();
ObjectClass objectClass = null;
int commentcount = 0;
int elementcount = 0;
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
if (node instanceof Comment) {
objectClass = setCommentToObject((Comment) node);
commentcount++;
}
if (node instanceof Element) {
setElementToObject(objectClass, (Element) node);
elementcount++;
objectClasses.add(objectClass);
}
}
LOGGER.debug("commentcount is:" + commentcount);
LOGGER.debug("elementcount is:" + elementcount);
return objectClasses;
}
private static ObjectClass setCommentToObject(Comment node) {
ObjectClass objectClass;
objectClass = new ObjectClass();
objectClass.setComment(node.getData());
return objectClass;
}
private static void setElementToObject(ObjectClass objectClass, Element node) {
objectClass.setId(node.getAttribute("id"));
objectClass.setAbbreviation(node.getAttribute("abbrev"));
objectClass.setIntclass(Integer.parseInt(node.getAttribute("intclass")));
objectClass.setName(node.getAttribute("name"));
objectClass.setParents(node.getAttribute("parents"));
objectClass.setPackageName(node.getAttribute("adaID"));
}
public void AddObjectClass(ObjectClass objectClass) {
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
File objectClassesFile = new File(xmlPath);
Document document = builder.parse(objectClassesFile);
Comment c = document.createComment(objectClass.getComment());
document.getDocumentElement().appendChild(c);
document.getDocumentElement().appendChild(getElementOfObjectClass(objectClass, document));
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(new File(xmlPath));
transformer.transform(source, result);
} catch (Exception e) {
LOGGER.error(e.toString());
}
}
private static Element getElementOfObjectClass(ObjectClass objectClass, Document document) {
Element e = document.createElement("objclass");
e.setAttribute("id", objectClass.getId());
e.setAttribute("intclass", String.valueOf(objectClass.getIntclass()));
e.setAttribute("abbrev", objectClass.getAbbreviation());
e.setAttribute("adaID", objectClass.getPackageName());
e.setAttribute("name", objectClass.getName());
e.setAttribute("parents", objectClass.getParents());
return e;
}
public byte[] getTextConent() throws Exception {
LOGGER.info("Start to checkout");
svnHandler.svnCheckout();
Path path = Paths.get(xmlPath);
return Files.readAllBytes(path);
}
}
>>>>>>> 158cee89e79a15fb22fc10af26bd6a164bf0bb02
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册