/* * Copyright 2009-2012 by KNURT Systeme (http://www.knurt.de) * * Licensed under the Creative Commons License Attribution-NonCommercial-ShareAlike 3.0 Unported; * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://creativecommons.org/licenses/by-nc-sa/3.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 de.knurt.fam.template.model; import java.util.ArrayList; import java.util.List; import java.util.Properties; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import de.knurt.fam.connector.FamSystemUpdateNotifier; import de.knurt.fam.core.aspects.logging.FamLog; import de.knurt.fam.core.aspects.security.auth.FamAuth; import de.knurt.fam.core.model.config.Facility; import de.knurt.fam.core.model.config.FacilityBookable; import de.knurt.fam.core.model.persist.User; import de.knurt.fam.core.model.persist.booking.Booking; import de.knurt.fam.core.persistence.dao.FamDaoProxy; import de.knurt.fam.core.persistence.dao.config.FacilityConfigDao; import de.knurt.fam.core.persistence.dao.config.RoleConfigDao; import de.knurt.fam.core.util.JSONFactory; import de.knurt.fam.core.view.html.FacilityOverviewHtml; import de.knurt.fam.core.view.text.FamText; import de.knurt.fam.news.NewsItem; import de.knurt.fam.plugin.DefaultPluginResolver; import de.knurt.fam.template.util.QuicksandHtml; import de.knurt.fam.template.util.TemplateHtml; /** * produce the model for specific pages * * @see TemplateContentProperties#getTemplateModel(TemplateResource) * @author Daniel Oltmanns * @since 1.3.0 (10/15/2010) */ public class TemplateModelFactory { private TemplateResource templateResource; public TemplateModelFactory(TemplateResource templateResource) { this.templateResource = templateResource; } /** * generate the model by delegating to view dependend controller * * @return properties for the view in {@link #templateResource} */ public Properties getProperties() { Properties result = new Properties(); result.put("invalid_session", this.templateResource.isInvalidSession()); if (this.templateResource.hasAuthUser()) { List<NewsItem> newsItems = this.getNewsItems(); result.put("newsitems", newsItems); result.put("newsitems_last_update", this.templateResource.getSession().getNewsItemsLastUpdate()); result.put("newsitems_count", newsItems.size()); } if (templateResource.getName().equals("users")) { result.put("users", FamDaoProxy.userDao().getAll()); result.put("facilities", FacilityConfigDao.getInstance().getAll()); result.put("roles", RoleConfigDao.getInstance().getAll()); try { result.put("jsonvar", String.format("var Facilities = %s", JSONFactory.me().getFacilities(FacilityConfigDao.getInstance().getAll()))); } catch (JSONException e) { FamLog.exception(e, 201011131321l); result.put("jsonvar", String.format("var Facilities = null")); } } else if (templateResource.getName().equals("plugins")) { result.put("plugins", DefaultPluginResolver.me().getPlugins()); } else if (templateResource.getName().equals("corehome")) { result.putAll(new CoreHomeModelFactory().getProperties(templateResource)); } else if (templateResource.getName().equals("adminhome")) { result.put("system", FamSystemUpdateNotifier.currentVersion()); result.put("jui_tabs", QuicksandHtml.getJuiTabs(templateResource)); result.put("quicksand_clickitems", QuicksandHtml.getClickItems(templateResource)); } else if (templateResource.getName().equals("systembookings")) { List<Booking> bookings = new ArrayList<Booking>(); User user = templateResource.getAuthUser(); if (user != null) { // prepare candidates List<Booking> candidates; if (user.isAdmin()) { candidates = FamDaoProxy.bookingDao().getAll(); } else { if (FamDaoProxy.facilityDao().hasResponsibilityForAFacility(user)) { List<Facility> facilities = FamDaoProxy.facilityDao().getBookableFacilitiesUserIsResponsibleFor(user); candidates = FamDaoProxy.bookingDao().getAll(facilities); } else { candidates = new ArrayList<Booking>(); } } for (Booking candidate : candidates) { if (!candidate.isCanceled() && !candidate.sessionAlreadyMade() && !candidate.getFacility().isUnknown()) { bookings.add(candidate); } } } result.put("bookings", bookings); } else if (templateResource.getName().equals("systemlistofusermails")) { result.put("mails", FamDaoProxy.userDao().getAllUserMails()); } else if (templateResource.getName().equals("systemlistofrolesandrights")) { result.put("roles", RoleConfigDao.getInstance().getAll()); result.put("availablerights", this.getAvailableRights()); } else if (templateResource.getName().equals("contactdetails")) { result.putAll(new ContactDetailsModelFactory().getProperties(templateResource)); } else if (templateResource.getName().equals("singletermsofuseadminview")) { result.putAll(new SingleTermsOfUseAdminViewModelFactory().getProperties(templateResource)); } else if (templateResource.getName().equals("agreementen") || templateResource.getName().equals("agreementde")) { result.putAll(new AgreementModelFactory().getProperties(templateResource)); } else if (templateResource.getName().equals("editsoa")) { result.putAll(new EditSoaModelFactory().getProperties(templateResource)); } else if (templateResource.getName().equals("logbookmakepost")) { result.putAll(new LogbookMakePostModelFactory().getProperties(templateResource)); } else if (templateResource.getName().equals("logbook")) { result.putAll(new LogbookModelFactory().getProperties(templateResource)); } else if (templateResource.getName().equals("lettergenerator")) { result.putAll(new LettergeneratorModelFactory().getProperties(templateResource)); } else if (templateResource.getName().equals("jobsmanager")) { result.putAll(new JobsManagerModelFactory().getProperties(templateResource)); } else if (templateResource.getName().equals("editfeedback")) { result.putAll(new RequestedBookingModelFactory().getProperties(templateResource)); } else if (templateResource.getName().equals("viewfeedback")) { result.putAll(new RequestedBookingModelFactory().getProperties(templateResource)); } else if (templateResource.getName().equals("systemlistofconfiguredfacilities")) { result.put("facilities", FacilityConfigDao.getInstance().getAll()); } else if (templateResource.getName().equals("book2") || templateResource.getName().equals("book")) { result.putAll(new Book2ModelFactory().getProperties(templateResource)); } else if (templateResource.getName().equals("news")) { } else if (templateResource.getName().equals("bookfacilitiesdone")) { result.putAll(new BookFacilitiesDoneModelFactory().getProperties(templateResource)); } else if (templateResource.getName().equals("statistics")) { result.putAll(new StatisticsModelFactory().getProperties(templateResource)); } else if (templateResource.getName().equals("tutorial")) { result.putAll(new TutorialModelFactory().getProperties(templateResource)); } else if (templateResource.getName().equals("viewrequest")) { result.putAll(new RequestedBookingModelFactory().getProperties(templateResource)); } else if (templateResource.getName().equals("editrequest")) { result.putAll(new RequestedBookingModelFactory().getProperties(templateResource)); } else if (templateResource.getName().equals("transferbooking")) { result.putAll(new TransferBookingModelFactory().getProperties(templateResource)); } else if (templateResource.getName().equals("viewsystemconfiguration")) { result.putAll(new ViewSystemConfigurationModelFactory().getProperties(templateResource)); } else if (templateResource.getName().equals("filemanager")) { result.putAll(new FileManagerModelFactory().getProperties(templateResource)); } else if (templateResource.getName().equals("systemmodifyapplications")) { result.putAll(new SystemModifyApplicationsModelFactory().getProperties(templateResource)); } else if (templateResource.getName().equals("facilityemergency")) { result.putAll(new FacilityEmergencyModelFactory().getProperties(templateResource)); } else if (templateResource.getName().equals("eventsofday")) { result.putAll(new EventsOfDayModelFactory().getProperties(templateResource)); } else if (templateResource.getName().equals("editfacilityavailability")) { result.putAll(new EditFacilityAvailabilityModelFactory().getProperties(templateResource)); } else if (templateResource.getName().equals("termsofuse")) { result.putAll(new TermsOfUseModelFactory().getProperties(templateResource)); } else if (templateResource.getName().equals("configjobsurvey")) { result.putAll(new ConfigJobSurveyModelFactory().getProperties(templateResource)); } else if (templateResource.getName().equals("systemfacilityavailabilityoverview")) { Facility root = FacilityConfigDao.getInstance().getRootFacility(); String baseUrl = TemplateHtml.href("systemfacilityavailability"); result.put("facilitieslist", FacilityOverviewHtml.getTree(root, baseUrl, getFacilitiesUserCanBook(this.templateResource.getAuthUser()))); result.put("jsonfacilities", getJSONFacilities(root.getKey())); result.put("jsonvar", String.format("var FacilityOverviewTreeUrlBase = '%s'", baseUrl)); } else if (templateResource.getName().equals("systemfacilityavailability")) { // TODO #22 if there is only one facility show it directly result.putAll(new FacilityAvailabilityModelFactory().getProperties(templateResource)); } else if (templateResource.getName().equals("mybookings")) { result.put("bookings", templateResource.getAuthUser().getBookings()); result.put("current_sessions", FamDaoProxy.bookingDao().getCurrentSessions(templateResource.getAuthUser())); } if (templateResource.getWritingResultProperties() != null) { result.putAll(templateResource.getWritingResultProperties()); } result.put("templateResource", templateResource); return result; } private List<NewsItem> getNewsItems() { List<NewsItem> result = null; if (this.templateResource.hasAuthUser()) { try { result = new NewsModelFactory().getNewsItems(templateResource); } catch (Exception e) { // ↖ avoid news blocking the system FamLog.exception(e, 201107200854l); result = NewsModelFactory.getErrorNewsItem(); } } else { result = new ArrayList<NewsItem>(0); } return result; } protected static JSONObject getJSONFacilities(String facilityKey) { List<Facility> facilities = new ArrayList<Facility>(1); facilities.add(FacilityConfigDao.facility(facilityKey)); return getJSONFacilities(facilities); } protected static JSONObject getJSONFacilities(List<Facility> facilities) { JSONObject result = new JSONObject(); JSONArray keys = new JSONArray(); for (Facility facility : facilities) { keys.put(facility.getKey()); } try { result.put("keys", keys); } catch (JSONException e) { FamLog.exception("error creating json", e, 201010160922l); } return result; } protected static List<Facility> getFacilitiesUserCanBook(User user) { // create facilities to link List<FacilityBookable> candidates = FacilityConfigDao.getInstance().getBookableFacilities(); List<Facility> result = new ArrayList<Facility>(); for (FacilityBookable bd : candidates) { if (user.hasRight(FamAuth.BOOKING, bd)) { result.add(bd); } } return result; } private List<String> getAvailableRights() { List<String> result = new ArrayList<String>(); int i = 0; while (FamText.getInstance().messageExists("right." + i)) { result.add(i + ": " + FamText.message("right." + i)); i++; } return result; } }