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 org.joda.time.LocalDate;
025
026import org.apache.isis.applib.AbstractService;
027import org.apache.isis.applib.annotation.ActionSemantics;
028import org.apache.isis.applib.annotation.ActionSemantics.Of;
029import org.apache.isis.applib.annotation.MemberOrder;
030import org.apache.isis.applib.annotation.Named;
031import org.apache.isis.applib.annotation.Optional;
032import org.apache.isis.applib.query.QueryDefault;
033import org.apache.isis.applib.services.settings.ApplicationSetting;
034import org.apache.isis.applib.services.settings.ApplicationSettingsService;
035import org.apache.isis.applib.services.settings.ApplicationSettingsServiceRW;
036import org.apache.isis.applib.services.settings.SettingAbstract;
037import org.apache.isis.applib.services.settings.SettingType;
038
039/**
040 * An implementation of {@link ApplicationSettingsService} that persists settings
041 * as entities into a JDO-backed database.
042 */
043@Named("Application Settings")
044public class ApplicationSettingsServiceJdo extends AbstractService implements ApplicationSettingsServiceRW {
045
046    @ActionSemantics(Of.SAFE)
047    @Override
048    public ApplicationSetting find(@Named("Key") String key) {
049        return firstMatch(
050                new QueryDefault<ApplicationSettingJdo>(ApplicationSettingJdo.class, 
051                        "findByKey", 
052                        "key", key));
053    }
054
055    // //////////////////////////////////////
056
057    @ActionSemantics(Of.SAFE)
058    @MemberOrder(sequence="1")
059    @SuppressWarnings({ "rawtypes", "unchecked" })
060    public List<ApplicationSetting> listAll() {
061        return (List)allMatches(
062                new QueryDefault<ApplicationSettingJdo>(ApplicationSettingJdo.class, 
063                        "findAll"));
064    }
065
066    // //////////////////////////////////////
067
068    @MemberOrder(sequence="10")
069    @Override
070    public ApplicationSetting newString(
071            @Named("Key") String key, 
072            @Named("Description") @Optional String description, 
073            @Named("Value") String value) {
074        return newSetting(key, description, SettingType.STRING, value);
075    }
076    @MemberOrder(sequence="11")
077    @Override
078    public ApplicationSettingJdo newInt(
079            @Named("Key") String key, 
080            @Named("Description") @Optional String description, 
081            @Named("Value") Integer value) {
082        return newSetting(key, description, SettingType.INT, value.toString());
083    }
084    @MemberOrder(sequence="12")
085    @Override
086    public ApplicationSettingJdo newLong(
087            @Named("Key") String key, 
088            @Named("Description") @Optional String description, 
089            @Named("Value") Long value) {
090        return newSetting(key, description, SettingType.LONG, value.toString());
091    }
092    @MemberOrder(sequence="13")
093    @Override
094    public ApplicationSettingJdo newLocalDate(
095            @Named("Key") String key, 
096            @Named("Description") @Optional String description, 
097            @Named("Value") LocalDate value) {
098        return newSetting(key, description, SettingType.LOCAL_DATE, value.toString(SettingAbstract.DATE_FORMATTER));
099    }
100    @MemberOrder(sequence="14")
101    @Override
102    public ApplicationSettingJdo newBoolean(
103            @Named("Key") String key, 
104            @Named("Description") @Optional String description, 
105            @Named("Value") @Optional Boolean value) {
106        return newSetting(key, description, SettingType.BOOLEAN, new Boolean(value != null && value).toString());
107    }
108
109    private ApplicationSettingJdo newSetting(
110            String key, String description, SettingType settingType, final String valueRaw) {
111        final ApplicationSettingJdo setting = newTransientInstance(ApplicationSettingJdo.class);
112        setting.setKey(key);
113        setting.setDescription(description);
114        setting.setValueRaw(valueRaw);
115        setting.setType(settingType);
116        persist(setting);
117        return setting;
118    }
119
120}