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}