/* * Copyright 2006-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jrecruiter.service.system.impl; import java.io.InputStream; import java.math.BigDecimal; import java.util.Calendar; import java.util.List; import java.util.Random; import java.util.Set; import org.jrecruiter.common.CollectionUtils; import org.jrecruiter.common.Constants.JobStatus; import org.jrecruiter.common.Constants.OfferedBy; import org.jrecruiter.dao.BackupDao; import org.jrecruiter.dao.IndustryDao; import org.jrecruiter.dao.JobDao; import org.jrecruiter.dao.RegionDao; import org.jrecruiter.dao.RoleDao; import org.jrecruiter.dao.SchemaMigrationDao; import org.jrecruiter.dao.SystemDao; import org.jrecruiter.dao.UserDao; import org.jrecruiter.model.Industry; import org.jrecruiter.model.Job; import org.jrecruiter.model.Region; import org.jrecruiter.model.Role; import org.jrecruiter.model.SchemaMigration; import org.jrecruiter.model.User; import org.jrecruiter.model.UserToRole; import org.jrecruiter.model.export.Backup; import org.jrecruiter.service.SystemSetupService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.InvalidDataAccessResourceUsageException; import org.springframework.orm.jpa.JpaSystemException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import de.svenjacobs.loremipsum.LoremIpsum; /** * @author Gunnar Hillert */ @Service("systemSetupService") public class SystemSetupServiceImpl implements SystemSetupService { private static final Logger LOGGER = LoggerFactory.getLogger(SystemSetupServiceImpl.class); private @Autowired RegionDao regionDao; private @Autowired RoleDao roleDao; private @Autowired UserDao userDao; private @Autowired JobDao jobDao; private @Autowired IndustryDao industryDao; private @Autowired SystemDao systemDao; private @Autowired BackupDao backupDao; private @Autowired SchemaMigrationDao schemaMigrationDao; /** {@inheritDoc} */ @Override @Transactional public void createDemoJobs(final User user, final Integer numberOfJobsToCreate) { final LoremIpsum loremIpsum = new LoremIpsum(); Random random = new Random(); final Industry demoIndustry = industryDao.get(1L); if (demoIndustry == null) { throw new IllegalStateException(String.format("No industry found for Id %s", 1L)); } final Region demoRegion = regionDao.get(1L); if (demoRegion == null) { throw new IllegalStateException(String.format("No regions found for Id %s", 2L)); } for (int i = 0; i <= numberOfJobsToCreate; i++) { final Job job = new Job(); job.setBusinessAddress1(loremIpsum.getWords(2)); job.setBusinessAddress2(loremIpsum.getWords(3)); job.setBusinessCity(loremIpsum.getWords(2)); job.setBusinessEmail(loremIpsum.getWords(1) + "@" + loremIpsum.getWords(1) + ".com"); job.setBusinessName(loremIpsum.getWords(2)); job.setBusinessPhone("111-111-1111"); job.setBusinessPhoneExtension("111-111-1111"); job.setBusinessState(loremIpsum.getWords(1)); job.setBusinessZip(loremIpsum.getWords(1)); job.setDescription(loremIpsum.getParagraphs(2)); job.setIndustry(demoIndustry); job.setJobRestrictions(loremIpsum.getWords(30)); job.setJobTitle(loremIpsum.getWords(2)); job.setLatitude(BigDecimal.TEN); job.setLongitude(BigDecimal.TEN); job.setOfferedBy(OfferedBy.RECRUITER); if (i % 2 == 0) { job.setRegion(demoRegion); } else { job.setRegionOther("Some Other Region"); } Calendar cal = Calendar.getInstance(); cal.set(Calendar.DAY_OF_YEAR, random.nextInt(200)); job.setRegistrationDate(cal.getTime()); job.setUpdateDate(cal.getTime()); job.setSalary("100000.50"); job.setStatus(JobStatus.ACTIVE); job.setUser(user); job.setUsesMap(Boolean.TRUE); job.setWebsite("http://www.google.com/"); this.jobDao.save(job); } } /* (non-Javadoc) * @see org.jrecruiter.service.DemoService#restore(java.io.InputStream) */ @Override @Transactional public void restore(final InputStream inputStream) { final Backup backup = backupDao.convertToBackupData(inputStream); this.restore(backup); } /** {@inheritDoc} */ @Override @Transactional public void loadAndRestoreSeedData() { final InputStream is = SystemSetupServiceImpl.class.getResourceAsStream("/org/jrecruiter/core/seeddata/seeddata.xml"); //FIXME verify file existence restore(is); } /** {@inheritDoc} */ @Override @Transactional public void restore(final Backup backup) { for (final Region region : backup.getRegions()) { regionDao.replicate(region); } for (final Industry industry : backup.getIndustries()) { industryDao.replicate(industry); } for (final Role role : backup.getRoles()) { roleDao.replicate(role); } final List<User> usersFromDb = userDao.getAll(); Set<String> userNames = CollectionUtils.getHashSet(); for (User user : usersFromDb) { userNames.add(user.getUsername()); } for (final User userFromBackup : backup.getUsers()) { if (userFromBackup == null) { LOGGER.error("User is null."); } else if (userFromBackup.getUsername() == null) { LOGGER.error("Username is null for user '" + userFromBackup + "'"); } else { if (!userNames.contains(userFromBackup.getUsername())) { LOGGER.info("Saving user '" + userFromBackup.getUsername() + "'"); final User user = new User(); user.setCompany(userFromBackup.getCompany()); user.setEmail(userFromBackup.getEmail()); user.setEnabled(userFromBackup.isEnabled()); user.setFax(userFromBackup.getFax()); user.setFirstName(userFromBackup.getFirstName()); user.setLastLoginDate(userFromBackup.getLastLoginDate()); user.setLastName(userFromBackup.getLastName()); user.setPassword(userFromBackup.getPassword()); user.setPhone(userFromBackup.getPhone()); user.setRegistrationDate(userFromBackup.getRegistrationDate()); user.setUpdateDate(userFromBackup.getUpdateDate()); user.setUserAuthenticationType(userFromBackup.getUserAuthenticationType()); user.setUsername(userFromBackup.getUsername()); if (userFromBackup.getUserToRoles() != null && !userFromBackup.getUserToRoles().isEmpty()) { for (UserToRole userToRole : userFromBackup.getUserToRoles()) { final Role role = roleDao.getRole(userToRole.getRoleName()); if (role == null) { throw new IllegalStateException("No role found for rolename: " + userToRole.getRoleName()); } user.getUserToRoles().add(new UserToRole(null, role, user)); } } user.setVerificationKey(userFromBackup.getVerificationKey()); userFromBackup.getUserToRoles().iterator().next().getRole(); userDao.save(user); userNames.add(userFromBackup.getUsername()); } else { LOGGER.warn("User '" + userFromBackup.getUsername() + "' already exists in the database. Ignoring..."); } } } //restore // backup.setJobCountPerDay(jobCountPerDayDao.getAll()); backup.setIndustries(industryDao.getAllIndustriesOrdered()); backup.setRegions(regionDao.getAllRegionsOrdered()); backup.setRoles(roleDao.getAll()); backup.setUsers(userDao.getAllUsers()); backup.setJobs(jobDao.getAllJobs()); } @Override @Transactional public void createDatabase() { systemDao.createDatabase(); } @Override @Transactional public void updateDatabase() { systemDao.updateDatabase(); } @Override public boolean isDatabaseSetup() { try { final List<SchemaMigration> migrations = schemaMigrationDao.getAll(); // if (migrations.isEmpty()) { // return false; // } else { return true; // } } catch (InvalidDataAccessResourceUsageException e) { LOGGER.warn("Looks like the database has not been set up, yet.", e.getMessage()); return false; } catch (JpaSystemException e) { LOGGER.warn("Looks like the database has not been set up, yet.", e.getCause()); return false; } } @Override public Backup convertToBackupData(InputStream inputStream) { return backupDao.convertToBackupData(inputStream); } @Override @Transactional public void setupDatabase() { LOGGER.info("jRecruiter Database is not setup, yet. Initializing DB..."); this.createDatabase(); LOGGER.info("jRecruiter Database is not setup, yet. Populating Seed Data..."); this.loadAndRestoreSeedData(); } }