package net.agef.jobexchange.pages.administration;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import net.agef.jobexchange.annotation.InjectSelectionModel;
import net.agef.jobexchange.application.DataProviderWorker;
import net.agef.jobexchange.application.FieldOfOccupationWorker;
import net.agef.jobexchange.application.JobWorker;
import net.agef.jobexchange.application.LocationWorker;
import net.agef.jobexchange.application.LoginUserWorker;
import net.agef.jobexchange.application.UserWorker;
import net.agef.jobexchange.domain.AbstractUserRoleData;
import net.agef.jobexchange.domain.Address;
import net.agef.jobexchange.domain.ContactPerson;
import net.agef.jobexchange.domain.Country;
import net.agef.jobexchange.domain.Currency;
import net.agef.jobexchange.domain.DataProvider;
import net.agef.jobexchange.domain.JobImpl;
import net.agef.jobexchange.domain.LoginUser;
import net.agef.jobexchange.domain.OccupationalField;
import net.agef.jobexchange.domain.OrganisationRole;
import net.agef.jobexchange.domain.OrganisationRoleData;
import net.agef.jobexchange.domain.Territory;
import net.agef.jobexchange.domain.User;
import net.agef.jobexchange.exceptions.DataProviderNotFoundException;
import net.agef.jobexchange.exceptions.JobOfferNotFoundException;
import net.agef.jobexchange.exceptions.LoginUserNotFoundException;
import net.agef.jobexchange.exceptions.ObjectNotSavedException;
import net.agef.jobexchange.exceptions.OccupationalFieldNotFoundException;
import net.agef.jobexchange.exceptions.PassedAttributeIsNullException;
import net.agef.jobexchange.integration.CurrencyDAO;
import net.agef.jobexchange.integration.JobDAO;
import net.agef.jobexchange.integration.OccupationalFieldDAO;
import net.agef.jobexchange.services.recaptcha.ReCaptcha;
import net.agef.jobexchange.services.recaptcha.ReCaptchaResponse;
import org.apache.lucene.queryParser.ParseException;
import org.apache.tapestry5.corelib.components.Grid;
import org.apache.tapestry5.annotations.Cached;
import org.apache.tapestry5.annotations.OnEvent;
import org.apache.tapestry5.annotations.Persist;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.Block;
import org.apache.tapestry5.ComponentResources;
import org.apache.tapestry5.SelectModel;
import org.apache.tapestry5.annotations.Component;
import org.apache.tapestry5.beaneditor.BeanModel;
import org.apache.tapestry5.corelib.components.BeanEditor;
import org.apache.tapestry5.corelib.components.Form;
import org.apache.tapestry5.hibernate.annotations.CommitAfter;
import org.apache.tapestry5.internal.SelectModelImpl;
import org.apache.tapestry5.ioc.Messages;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.json.JSONArray;
import org.apache.tapestry5.json.JSONObject;
import org.apache.tapestry5.services.BeanModelSource;
import org.slf4j.Logger;
/**
* Start page of application app.
*/
@SuppressWarnings("unused")
public class AddJobOfferPage
{
@Inject
private Logger logger;
@Inject
private JobWorker jw;
@Inject
private UserWorker uw;
@Inject
private LocationWorker lw;
@Inject
private LoginUserWorker luw;
@Inject
private FieldOfOccupationWorker foOW;
@Inject
private CurrencyDAO currencyDAO;
@Inject
private JobDAO jobDAO;
@Inject
private DataProviderWorker dpw;
/*@Inject
private HttpServletRequest request;*/
@Inject
private BeanModelSource beanModelSource;
@Inject
private Messages messages;
@Property
@Component(id = "beanForm")
private Form form;
@Property
@Component(id="beanEditor")
private BeanEditor beanEditor;
//@Property
//@Persist("Flash")
private LoginUser loginUser;
@Property
@Persist("Flash")
private JobImpl jobOffer;
@Persist("Flash")
//@Property
private User jobOwner;
@Persist("Flash")
//@Property
private ContactPerson contactPerson;
private Collection<JobImpl> jobSearchList;
@InjectSelectionModel(labelField = "nameEnglish", idField = "id")
private List<Territory> territoryList = new ArrayList<Territory>();
//@Persist("Flash")
@InjectSelectionModel(labelField = "shortEnglishName", idField = "id")
private List<Country> countryDummyList;
@InjectSelectionModel(labelField = "organisationName", idField = "owner.id")
private List<OrganisationRoleData> orgUserDataList = new ArrayList<OrganisationRoleData>();
@InjectSelectionModel(labelField = "toString", idField = "intValue")
private List<Integer> jobAmountList = new ArrayList<Integer>();
@InjectSelectionModel(labelField = "fieldNameEnglish", idField = "id")
private List<OccupationalField> occupationalFieldList = new ArrayList<OccupationalField>();
@InjectSelectionModel(labelField = "nameEnglish", idField = "id")
private List<Currency> salaryCurrencyList = new ArrayList<Currency>();
@Persist
private List<Country> countryList;
@Property
@Persist("Flash")
private Territory territoryItem;
@Property
//@Persist
private Country countryDummyItem;
//@Property
@Persist
private Country countryItem;
@Property
@Persist("Flash")
private OrganisationRoleData orgUserDataItem;
@Property
@Persist("Flash")
private Integer jobAmountItem;
@Property
@Persist("Flash")
private OccupationalField occupationalFieldItem;
@Property
private Currency salaryCurrencyItem;
@Property
@Persist("Flash")
private Boolean modified;
@SuppressWarnings("unchecked")
private final BeanModel jobOfferModel;
{
jobOfferModel = beanModelSource.createEditModel(JobImpl.class, messages);
jobOfferModel.exclude("jobOfferId","organisationName","attachmentLocation");
jobOfferModel.add("salaryCurrency",null);
jobOfferModel.add("territoryOfEmployment",null);
jobOfferModel.add("experiencesAndKnowledge",null);
jobOfferModel.reorder("numberOfJobs","jobDescription","taskDescription","territoryOfEmployment","locationOfEmployment","minimumRequirementsForEducation","furtherCommentsRegardingEducation","desiredProfession","alternativeprofession","workExperience","experiencesAndKnowledge","languageSkillsGerman","languageSkillsEnglish","computerSkills","computerSkillsComments","drivingLicence","specialKnowledge","furtherRequirements","possibleCommencementDate","durationOfContract","weeklyHoursOfWork","salary","salaryCurrency","miscellaneousServices","commentsRegardingApplicationProcedure","applicationExpireDate","preferredPublication","jobOfferExpireDate","furtherComments");
}
/**
* setup page properties before after activation
*/
public void onPrepare(){
this.jobAmountList = new ArrayList<Integer>();
for(int i = 1;i<=25;i++){
jobAmountList.add(new Integer(i));
}
try {
this.occupationalFieldList = (List<OccupationalField>) foOW.getOccupationalMainFields();
} catch (OccupationalFieldNotFoundException e) {
form.recordError("Error while initializing Occupational field list. Please contact your administrator.");
e.printStackTrace();
}
this.salaryCurrencyList = currencyDAO.findAll();
//this.loginUser = null;
this.countryList = new ArrayList<Country>();
this.countryDummyList = new ArrayList<Country>();
}
Object onActivate(JobImpl jobOffer){
this.modified = true;
logger.info("OnActivate from JobOffer");
this.territoryList = lw.getAllTerritories();
if(luw.isLoggedInUser()){
try {
this.loginUser = luw.getLoggedInUser();
} catch (LoginUserNotFoundException e) {
luw.logoutUser();
}
} else luw.logoutUser();
try {
this.orgUserDataList = uw.getOrganisationUserDataByLoginUser(this.loginUser);
} catch (PassedAttributeIsNullException e) {
e.printStackTrace();
luw.logoutUser();
}
this.jobOffer = jobOffer;
if(this.jobOffer == null){
return ManageJobOffersPage.class;
}
this.orgUserDataItem = (OrganisationRoleData) jobOffer.getJobOfferOwner().getUserRoleData();
this.jobAmountItem = jobOffer.getNumberOfJobs();
this.salaryCurrencyItem = jobOffer.getCurrency();
this.occupationalFieldItem = jobOffer.getOccupationalField();
if(this.countryItem==null){
logger.info("Setze CountryItem auf "+jobOffer.getCountryOfEmployment().getShortEnglishName() );
this.countryItem = jobOffer.getCountryOfEmployment();
}
if(this.countryItem!=null){
this.territoryItem = this.countryItem.getParentTerritory();
this.countryList = lw.getRelatedCountries(this.territoryItem);
this.countryDummyList = this.countryList;
this.countryDummyItem = this.countryItem;
}
return true;
}
void onActivate(){
logger.info("OnActivate");
this.territoryList = lw.getAllTerritories();
if(luw.isLoggedInUser()){
try {
this.loginUser = luw.getLoggedInUser();
} catch (LoginUserNotFoundException e) {
luw.logoutUser();
}
} else luw.logoutUser();
try {
this.orgUserDataList = uw.getOrganisationUserDataByLoginUser(this.loginUser);
} catch (PassedAttributeIsNullException e) {
e.printStackTrace();
luw.logoutUser();
}
// if(this.territoryItem!=null){
// this.countryList = lw.getRelatedCountries(this.territoryItem);
// this.countryDummyList = this.countryList;
// }
if(this.loginUser!=null && this.loginUser.getLoginUserAddress()!=null){
if(this.countryItem==null){
this.countryItem=this.loginUser.getLoginUserAddress().getCountry();
}
logger.info("CountryItem: "+countryItem.getShortEnglishName());
this.territoryItem = this.countryItem.getParentTerritory();
this.countryList = lw.getRelatedCountries(this.territoryItem);
this.countryDummyList = this.countryList;
this.countryDummyItem = this.countryItem;
} else logger.info("CountryItem ist null");
}
Object onSuccess(){
logger.info("Bin im onSuccess");
if(orgUserDataItem!=null){
this.jobOwner = orgUserDataItem.getOwner();
} else {
form.recordError("Please provide the Organisation the job offer belongs to.");
return null;
}
if (this.countryItem != null) logger.error("Current countryItem: "+this.countryItem.getOfficialEnglishName());
else logger.error("Current countryItem ist null");
if (this.territoryItem != null) logger.error("Current territoryItem: "+this.territoryItem.getNameEnglish());
else logger.error("Current territoryItem ist null");
if(this.loginUser!= null){
jobOffer.setGetjobsLoginUser(this.loginUser);
}
jobOffer.setNumberOfJobs(this.jobAmountItem);
jobOffer.setOccupationalField(this.occupationalFieldItem);
if(this.countryItem!=null){
jobOffer.setCountryOfEmployment(lw.getCountryById(this.countryItem.getId()));
} else {
form.recordError("Please select a value for 'Country of employment'.");
return null;
}
jobOffer.setCurrency(this.salaryCurrencyItem);
jobOffer.setJobOfferOwner(this.jobOwner);
DataProvider dataProvider;
try {
dataProvider = dpw.getDataProviderByName("GETJOBS");
} catch (DataProviderNotFoundException e1) {
e1.printStackTrace();
form.recordError("Error while retrieving DataProvider.");
return null;
}
jobOffer.setDataProvider(dataProvider);
try {
jw.addJobOffer(jobOffer);
} catch (ObjectNotSavedException e) {
e.printStackTrace();
form.recordError("Error while saving job offer.");
return null;
} catch (PassedAttributeIsNullException e) {
e.printStackTrace();
form.recordError("Error while saving job offer, no attribute passed.");
return null;
}
return OverviewPage.class;
}
public JobImpl onPassivate(){
if(modified!=null && modified){
return jobOffer;
} else return null;
}
@OnEvent(component = "territorySelect", value = "change")
JSONObject territoryElementChanged(String value) {
JSONObject json = new JSONObject();
if(!value.equals("")){
this.territoryItem = lw.getTerritoryById(new Long(value));
logger.error("Territory : "+this.territoryItem.getNameEnglish()+"---- value: "+value );
this.countryList = lw.getRelatedCountries(territoryItem);
String queryString = new String();
Iterator<Country> it = this.countryList.iterator();
int counter = 0;
while(it.hasNext()){
Country tempCountry = it.next();
if (counter == 0) {
queryString = "[['"+tempCountry.getId()+"', '"+tempCountry.getShortEnglishName()+"']";
} else queryString = queryString+", ['"+tempCountry.getId()+"', '"+tempCountry.getShortEnglishName()+"']";
//logger.error("QueryString : "+ queryString);
counter++;
}
queryString = queryString+"]";
//logger.error("QueryStringGesamt : "+ queryString);
json.put("result", new JSONArray(queryString));
} else json.put("result", new JSONArray("[]"));
return json;
}
@OnEvent(component = "countrySelect", value = "change")
void countryElementChanged(String value) {
if(!value.equals("")){
this.countryItem = lw.getCountryById(new Long(value));
logger.error("Country : "+this.countryItem.getShortEnglishName()+"---- value: "+value );
}
}
void cleanupRender() {
form.clearErrors();
// Clear the flash-persisted fields to prevent anomalies in onActivate when we hit refresh on page or browser button
logger.info("Bin Im cleanupRender.");
this.jobOffer = null;
this.orgUserDataItem = null;
this.occupationalFieldItem = null;
this.jobAmountItem = null;
this.jobOwner = null;
this.countryItem = null;
this.territoryItem = null;
this.salaryCurrencyItem = null;
}
public Date getCurrentTime()
{
return new Date();
}
/**
* @return the beanModelSource
*/
public BeanModelSource getBeanModelSource() {
return beanModelSource;
}
/**
* @param beanModelSource the beanModelSource to set
*/
public void setBeanModelSource(BeanModelSource beanModelSource) {
this.beanModelSource = beanModelSource;
}
/**
* @return the _model
*/
@SuppressWarnings("unchecked")
public BeanModel getJobOfferModel() {
return jobOfferModel;
}
/**
* @return the territoryList
*/
@Cached
public List<Territory> getTerritoryList() {
return territoryList;
}
/**
* @param territoryList the territoryList to set
*/
public void setTerritoryList(List<Territory> territoryList) {
this.territoryList = territoryList;
}
/**
* @return the addAddress
*/
public Address getContactAddress() {
return jobOffer.getCurrentContactAddress();
}
/**
* @param addAddress the addAddress to set
*/
public void setContactAddress(Address contactAddress) {
this.jobOffer.setCurrentContactAddress(contactAddress);
}
public Address getCurrentContactAddress(){
return this.jobOwner.getCurrentContactAddress();
}
}