edu.harvard.med.iccbl.screensaver.service.screens.IccblScreenFacilityIdInitializer.java Source code

Java tutorial

Introduction

Here is the source code for edu.harvard.med.iccbl.screensaver.service.screens.IccblScreenFacilityIdInitializer.java

Source

// $HeadURL$
// $Id$
//
// Copyright  2010 by the President and Fellows of Harvard College.
// 
// Screensaver is an open-source project developed by the ICCB-L and NSRB labs
// at Harvard Medical School. This software is distributed under the terms of
// the GNU General Public License.

package edu.harvard.med.iccbl.screensaver.service.screens;

import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.google.common.base.Function;
import com.google.common.base.Functions;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
import com.google.common.collect.Ordering;
import org.apache.log4j.Logger;

import edu.harvard.med.screensaver.db.GenericEntityDAO;
import edu.harvard.med.screensaver.db.ScreenDAO;
import edu.harvard.med.screensaver.model.screens.Screen;
import edu.harvard.med.screensaver.service.screens.ScreenFacilityIdInitializer;

public class IccblScreenFacilityIdInitializer implements ScreenFacilityIdInitializer {
    private static final Logger log = Logger.getLogger(IccblScreenFacilityIdInitializer.class);

    private static Pattern numericPrefix = Pattern.compile("^([?0-9]+).*");
    private static final Function<String, Integer> NonStrictStringToInteger = new Function<String, Integer>() {
        @Override
        public Integer apply(String s) {
            try {
                Matcher m = numericPrefix.matcher(s);
                if (m.matches()) {
                    return Integer.valueOf(m.group(1));
                }
            } catch (NumberFormatException e) {
            }
            return null;
        }
    };

    private static final Predicate<Screen> ScreenWithFacilityId = new Predicate<Screen>() {
        @Override
        public boolean apply(Screen screen) {
            return !screen.isStudyOnly();
        }
    };

    private GenericEntityDAO _dao;
    private ScreenDAO _screenDao;

    public IccblScreenFacilityIdInitializer(GenericEntityDAO dao, ScreenDAO screenDao) {
        _dao = dao;
        _screenDao = screenDao;
    }

    @Override
    public boolean initializeFacilityId(Screen screen) {
        if (screen.getFacilityId() != null) {
            return false;
        }

        if (updateIdentifierForRelatedScreen(screen)) {
            return true;
        }
        return updateIdentifierForPrimaryScreen(screen);
    }

    private boolean updateIdentifierForRelatedScreen(Screen screen) {
        if (screen.getProjectId() == null) {
            return false;
        }
        List<Screen> relatedScreens = _screenDao.findRelatedScreens(screen);
        List<Screen> projectScreens = _dao.findEntitiesByProperty(Screen.class, "projectId", screen.getProjectId(),
                true);
        projectScreens.remove(screen);
        if (projectScreens.size() > 0) {
            screen.setFacilityId(NonStrictStringToInteger.apply(relatedScreens.get(0).getFacilityId()) + "-"
                    + projectScreens.size());
            return true;
        }
        return false;
    }

    public boolean updateIdentifierForPrimaryScreen(Screen screen) {
        List<Screen> screens = _dao.findAllEntitiesOfType(Screen.class, true);
        Iterable<Integer> primaryScreenNumericFacilityIds = Iterables
                .filter(Iterables.transform(Iterables.filter(screens, ScreenWithFacilityId),
                        Functions.compose(NonStrictStringToInteger, Screen.ToFacilityId)), Predicates.notNull());

        int nextId = 1;
        if (primaryScreenNumericFacilityIds.iterator().hasNext()) {
            Integer maxNumericFacilityId = Ordering.natural().max(primaryScreenNumericFacilityIds);
            nextId += maxNumericFacilityId;
        }
        String nextPrimaryScreenFacilityIdentifier = Integer.toString(nextId);
        screen.setFacilityId(nextPrimaryScreenFacilityIdentifier);
        log.info("set new primary screen facility ID to " + nextPrimaryScreenFacilityIdentifier);
        return true;
    }
}