package com.vst.webapp.action;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Blob;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.servlet.ModelAndView;
import com.vst.Constants;
import com.vst.model.BuildingObject;
import com.vst.model.ObjectPhoto;
import com.vst.service.BuildingObjectManager;
import com.vst.util.FileHelper;
public class BuildingObjectController extends AbstractVstController {
protected static final Log log = LogFactory.getLog(BuildingObjectController.class);
private BuildingObjectManager buildingObjectManager = null;
private BuildingObject selectedBuildingObject = null;
public void setBuildingObjectManager(
BuildingObjectManager buildingObjectManager) {
this.buildingObjectManager = buildingObjectManager;
}
private void processParamPageNumber(HttpServletRequest request,
HttpServletResponse response) {
String pageNumber = request.getParameter("d-4453885-p");
if (pageNumber != null) {
request.setAttribute("pageNumber", "d-4453885-p=" + pageNumber);
}
}
private BuildingObject processParamObjectId(HttpServletRequest request,
HttpServletResponse response) {
BuildingObject buildingObject = null;
String objectId = request.getParameter("objectId");
if (objectId != null) {
// setting the object to the context
// buildingObject =
// buildingObjectManager.getBuildingObject(objectId);
buildingObject = buildingObjectManager
.getBuildingObjectForList(new Integer(objectId));
//buildingObjectManager.evict(buildingObject);
request.setAttribute("currentObjectUserId", buildingObject
.getUser().getId());
}
if (request.getParameter("objectId") != null) {
// setting the object to the context
request.getSession().setAttribute("buildingObjectName",
buildingObject.getName());
request.getSession().setAttribute(
"buildingObjectNameRef",
"buildingObjects.html?objectId="
+ buildingObject.getObjectId());
} else {
// destroying object breadcrump refference
request.getSession().setAttribute("buildingObjectName", "");
request.getSession().setAttribute("buildingObjectNameRef", "");
}
return buildingObject;
}
private boolean isSearchByNameParamPresent(HttpServletRequest request) {
return request.getParameter("isSearched") != null;
}
private boolean isOnlyOneObjectInList(HttpServletRequest request) {
return request.getParameter("type") != null
&& request.getParameter("type").equals("one");
}
private void doRemoveBuildingObject(HttpServletRequest request,
HttpServletResponse response) {
boolean hasFatalError = false;
String buildingObjectId = request.getParameter("id");
ResourceBundle bundle = ResourceBundle
.getBundle("ApplicationResources");
try {
if (buildingObjectManager.removeBuildingObject(buildingObjectId)) {
request.getSession().setAttribute("madeChanges",
new Boolean(true));
request.setAttribute("message",
bundle.getString("buildingObject.deleted"));
} else {
request.setAttribute("errormessage",
bundle.getString("buildingObject.isUsed"));
}
} catch (Exception e) {
hasFatalError = true;
}
if (hasFatalError) {
request.setAttribute("errormessage",
bundle.getString("commonMistake"));
}
}
private String buildCurrentPathParam(HttpServletRequest request) {
char[] c = FileHelper.getCurrentPath(request).toCharArray();
String s = "";
for (int i = 0; i < c.length; i++) {
s += c[i];
if (c[i] == '\\') {
s += '\\';
}
}
return s;
}
private void doCacheBuildingImages(HttpServletRequest request,
HttpServletResponse response, List<BuildingObject> buildingObjects)
throws IOException, SQLException {
// retrieving the first photo
for (int i = 0; i < buildingObjects.size(); i++) {
BuildingObject curObject = (BuildingObject) buildingObjects.get(i);
List<ObjectPhoto> photoes = buildingObjectManager
.getObjectPhotoes(curObject.getObjectId());
if (photoes.size() > 0) {
ObjectPhoto objectPhoto = (ObjectPhoto) photoes.get(0);
File file = new File(FileHelper.getCurrentPath(request)
+ objectPhoto.getWayToPhoto());
if (file.exists()) {
file.delete();
}
file.createNewFile();
FileOutputStream fileOutputStream = new FileOutputStream(
FileHelper.getCurrentPath(request)
+ objectPhoto.getWayToPhoto());
Blob blob = objectPhoto.getPhotoBlob();
byte[] bufer = new byte[62000];
InputStream inputStream = blob.getBinaryStream();
while (inputStream.read(bufer) != -1) {
fileOutputStream.write(bufer);
}
inputStream.close();
fileOutputStream.close();
}
}
}
private List<?> findBuildingObjectsForView(HttpServletRequest request,
HttpServletResponse response) {
BuildingObject buildingObject;
List buildingObjects = new ArrayList();
request.setAttribute("searchWord", request.getParameter("searchWord"));
buildingObject = new BuildingObject();
buildingObject.setName(request.getParameter("searchWord"));
if (("1".equals(request.getParameter("byFragments")))) {
request.setAttribute("byFragments", "true");
buildingObject.setByFragments(true);
}
if (isOnlyOneObjectInList(request)) {
if (request.getParameter("objectId") != null) {
buildingObjects.add(buildingObject);
}
} else {
buildingObjects = buildingObjectManager
.findBuildingObjectsByName(buildingObject);
}
return buildingObjects;
}
private List<?> fillBuildingObjectsForView(HttpServletRequest request,
HttpServletResponse response) {
List buildingObjects = new ArrayList();
if (request.getParameter("objectId") != null) {
buildingObjects.add(selectedBuildingObject);
} else {
buildingObjects = buildingObjectManager
.getBuildingObjectsForList();
}
request.setAttribute("searchWord", "Укажите название объекта");
return buildingObjects;
}
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
selectedBuildingObject = null;
// BasicDataSource basicDataSource = (BasicDataSource)
// BeanUtils.getBean("dataSource", request);
// System.out.println("basicDataSource.url====="+basicDataSource.getUrl());
long start = System.currentTimeMillis();
if (log.isDebugEnabled()) {
log.debug("start 'BuildingObjectController.handleRequest' method...");
}
selectedBuildingObject = processParamObjectId(request, response);
processParamPageNumber(request, response);
if (isDeleteParamPresent(request)) {
doRemoveBuildingObject(request, response);
}
// destroying constructiontypes, constructionexamples and defects
request.getSession().setAttribute("constructionTypeName", "");
request.getSession().setAttribute("constructionExampleName", "");
request.getSession().setAttribute("constructionDefectName", "");
processParamEdited(request, response);
List buildingObjects;
if (!isSearchByNameParamPresent(request)) {
buildingObjects = fillBuildingObjectsForView(request, response);
} else {
buildingObjects = findBuildingObjectsForView(request, response);
}
doCacheBuildingImages(request, response, buildingObjects);
// Deprecated call
// buildingObjectManager.fillQuestionsLists(buildingObjects);
ModelAndView modelAndView = new ModelAndView("buildingObjectList");
modelAndView.addObject(Constants.BUILDINGOBJECT_LIST, buildingObjects);
modelAndView.addObject("currentPath", buildCurrentPathParam(request));
request.getSession().setAttribute("pType", "buildingObject");
request.getSession().setAttribute("pId", request.getParameter("objectId"));
long end = System.currentTimeMillis();
if (log.isDebugEnabled()) {
log.debug("end 'BuildingObjectController.handleRequest' method. time="
+ (end - start));
}
return modelAndView;
}
}