/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.isis.applib.services.homepage;
import org.apache.isis.applib.AbstractService;
import org.apache.isis.applib.ViewModel;
import org.apache.isis.applib.annotation.Action;
import org.apache.isis.applib.annotation.HomePage;
import org.apache.isis.applib.annotation.SemanticsOf;
import org.apache.isis.applib.annotation.Where;
/**
* Convenience domain service to create a view model (eg a dashboard) to be rendered automatically
* on the home page of the application.
*
* <p>
* For example, subclass as follows:
*
* <pre>
* public class MyAppDashboardService extends AbstractHomePageDashboardService<MyAppDashboard> {
* public MyAppDashboardService() { super(MyAppDashboard.class); }
* }
* </pre>
*
* <p>
* then register in <tt>isis.properties</tt> in the usual way.
*
* <p>
* However, if your application requires more flexibility (for example, returning different view models
* for different users), then do <i>not</i> subclass from this service; instead write your own service
* with a no-arg action with the {@link HomePage} annotation.
*/
public abstract class AbstractHomePageDashboardService<T extends ViewModel> extends AbstractService {
/**
* The default value to use for the {@link #id}.
*/
private static final String ID_DEFAULT = "dashboard";
private final Class<T> viewModel;
/**
* Both the id of this service, and also the memento of the view model.
*/
private final String id;
// //////////////////////////////////////
public AbstractHomePageDashboardService(final Class<T> viewModel) {
this(viewModel, ID_DEFAULT);
}
/**
* @param viewModel - view model to instantiate and return.
* @param id- both the id of this service, and also the memento of the view model.
*/
public AbstractHomePageDashboardService(final Class<T> viewModel, final String id) {
this.viewModel = viewModel;
this.id = id;
}
@Override
public String getId() {
return id;
}
public String iconName() {
return id;
}
// //////////////////////////////////////
@Action(
semantics = SemanticsOf.SAFE,
hidden = Where.EVERYWHERE
)
@HomePage
public T lookup() {
return newViewModelInstance(viewModel, id);
}
}