001/* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, 013 * software distributed under the License is distributed on an 014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 015 * KIND, either express or implied. See the License for the 016 * specific language governing permissions and limitations 017 * under the License. 018 */ 019 020package org.apache.isis.objectstore.jdo.applib.service.settings; 021 022import java.util.List; 023 024import com.google.common.base.Function; 025import com.google.common.collect.Iterables; 026import com.google.common.collect.Lists; 027import com.google.common.collect.Sets; 028 029import org.joda.time.LocalDate; 030 031import org.apache.isis.applib.AbstractService; 032import org.apache.isis.applib.annotation.MemberOrder; 033import org.apache.isis.applib.annotation.Named; 034import org.apache.isis.applib.annotation.Optional; 035import org.apache.isis.applib.query.QueryDefault; 036import org.apache.isis.applib.services.settings.SettingAbstract; 037import org.apache.isis.applib.services.settings.SettingType; 038import org.apache.isis.applib.services.settings.UserSetting; 039import org.apache.isis.applib.services.settings.UserSettingsService; 040import org.apache.isis.applib.services.settings.UserSettingsServiceRW; 041 042/** 043 * An implementation of {@link UserSettingsService} that persists settings 044 * as entities into a JDO-backed database. 045 */ 046@Named("User Settings") 047public class UserSettingsServiceJdo extends AbstractService implements UserSettingsServiceRW { 048 049 @Override 050 public UserSetting find( 051 @Named("User") String user, 052 @Named("Key") String key) { 053 return firstMatch( 054 new QueryDefault<UserSettingJdo>(UserSettingJdo.class, 055 "findByUserAndKey", 056 "user",user, 057 "key", key)); 058 } 059 060 061 // ////////////////////////////////////// 062 063 @SuppressWarnings({ "unchecked", "rawtypes" }) 064 public List<UserSetting> listAllFor(String user) { 065 return (List)allMatches( 066 new QueryDefault<UserSettingJdo>(UserSettingJdo.class, 067 "findByUser", 068 "user", user)); 069 } 070 public List<String> choices0ListAllFor() { 071 return existingUsers(); 072 } 073 074 private List<String> existingUsers() { 075 final List<UserSetting> listAll = listAll(); 076 return Lists.newArrayList(Sets.newTreeSet(Iterables.transform(listAll, GET_USER))); 077 } 078 079 private final static Function<UserSetting, String> GET_USER = new Function<UserSetting, String>() { 080 public String apply(UserSetting input) { 081 return input.getUser(); 082 } 083 }; 084 085 // ////////////////////////////////////// 086 087 @SuppressWarnings({ "unchecked", "rawtypes" }) 088 public List<UserSetting> listAll() { 089 return (List)allMatches( 090 new QueryDefault<UserSettingJdo>(UserSettingJdo.class, 091 "findAll")); 092 } 093 094 095 // ////////////////////////////////////// 096 097 @MemberOrder(sequence="10") 098 public UserSettingJdo newString( 099 @Named("User") String user, 100 @Named("Key") String key, 101 @Named("Description") @Optional String description, 102 @Named("Value") String value) { 103 return newSetting(user, key, description, SettingType.STRING, value); 104 } 105 public String default0NewString() { 106 return getContainer().getUser().getName(); 107 } 108 109 @MemberOrder(sequence="11") 110 public UserSettingJdo newInt( 111 @Named("User") String user, 112 @Named("Key") String key, 113 @Named("Description") @Optional String description, 114 @Named("Value") Integer value) { 115 return newSetting(user, key, description, SettingType.INT, value.toString()); 116 } 117 public String default0NewInt() { 118 return getContainer().getUser().getName(); 119 } 120 121 @MemberOrder(sequence="12") 122 public UserSettingJdo newLong( 123 @Named("User") String user, 124 @Named("Key") String key, 125 @Named("Description") @Optional String description, 126 @Named("Value") Long value) { 127 return newSetting(user, key, description, SettingType.LONG, value.toString()); 128 } 129 public String default0NewLong() { 130 return getContainer().getUser().getName(); 131 } 132 133 @MemberOrder(sequence="13") 134 public UserSettingJdo newLocalDate( 135 @Named("User") String user, 136 @Named("Key") String key, 137 @Named("Description") @Optional String description, 138 @Named("Value") LocalDate value) { 139 return newSetting(user, key, description, SettingType.LOCAL_DATE, value.toString(SettingAbstract.DATE_FORMATTER)); 140 } 141 public String default0NewLocalDate() { 142 return getContainer().getUser().getName(); 143 } 144 145 @MemberOrder(sequence="14") 146 public UserSettingJdo newBoolean( 147 @Named("User") String user, 148 @Named("Key") String key, 149 @Named("Description") @Optional String description, 150 @Named("Value") @Optional Boolean value) { 151 return newSetting(user, key, description, SettingType.BOOLEAN, new Boolean(value != null && value).toString()); 152 } 153 public String default0NewBoolean() { 154 return getContainer().getUser().getName(); 155 } 156 157 private UserSettingJdo newSetting( 158 String user, String key, String description, SettingType settingType, final String valueRaw) { 159 final UserSettingJdo setting = newTransientInstance(UserSettingJdo.class); 160 setting.setUser(user); 161 setting.setKey(key); 162 setting.setType(settingType); 163 setting.setDescription(description); 164 setting.setValueRaw(valueRaw); 165 persist(setting); 166 return setting; 167 } 168 169 170}