/*
* Copyright 2012, CMM, University of Queensland.
*
* This file is part of Eccles.
*
* Eccles is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Eccles is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Eccles. If not, see <http://www.gnu.org/licenses/>.
*/
package au.edu.uq.cmm.eccles;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.TypedQuery;
import au.edu.uq.cmm.aclslib.config.ACLSProxyConfiguration;
import au.edu.uq.cmm.aclslib.config.ConfigurationException;
import au.edu.uq.cmm.aclslib.config.FacilityConfig;
import au.edu.uq.cmm.aclslib.config.FacilityMapper;
public class EcclesFacilityMapper implements FacilityMapper {
private EntityManagerFactory emf;
private String dummyFacilityName;
private String dummyFacilityHostId;
private EcclesFacility dummyFacility;
public EcclesFacilityMapper(
ACLSProxyConfiguration config, EntityManagerFactory emf) {
super();
this.emf = emf;
dummyFacilityName = config.getDummyFacilityName();
dummyFacilityHostId = config.getDummyFacilityHostId();
dummyFacility = new EcclesFacility();
dummyFacility.setFacilityName(dummyFacilityName);
dummyFacility.setLocalHostId(dummyFacilityHostId);
}
@Override
public FacilityConfig lookup(String localHostId, String facilityName,
InetAddress clientAddr) throws ConfigurationException {
EntityManager em = emf.createEntityManager();
TypedQuery<EcclesFacility> query;
EcclesFacility res;
try {
if (localHostId != null) {
if (localHostId.equals(dummyFacilityHostId)) {
return dummyFacility;
}
query = em.createQuery(
"from EcclesFacility f where f.localHostId = :localHostId",
EcclesFacility.class);
query.setParameter("localHostId", localHostId);
res = getFirst(query, "hostId", localHostId);
if (res != null) {
return res;
}
}
if (facilityName != null) {
if (facilityName.equals(dummyFacilityName)) {
return dummyFacility;
}
query = em.createQuery(
"from EcclesFacility f where f.facilityName = :facilityName",
EcclesFacility.class);
query.setParameter("facilityName", facilityName);
res = getFirst(query, "facilityName", facilityName);
if (res != null) {
return res;
}
}
if (clientAddr != null) {
String ipAddress = clientAddr.getHostAddress();
String fqdn = clientAddr.getCanonicalHostName();
String[] hostNameParts = clientAddr.getCanonicalHostName().split("\\.");
query = em.createQuery(
"from EcclesFacility f where f.address = :ipAddress or " +
"f.address = :fqdn or f.address = :hostName",
EcclesFacility.class);
query.setParameter("ipAddress", ipAddress);
query.setParameter("fqdn", fqdn);
query.setParameter("hostName", hostNameParts[hostNameParts.length - 1]);
res = getFirst(query, "ipAddress/hostname", ipAddress + "/" + fqdn);
if (res != null) {
return res;
}
}
return null;
} finally {
em.close();
}
}
private EcclesFacility getFirst(TypedQuery<EcclesFacility> query, String key, String keyValue)
throws ConfigurationException {
List<EcclesFacility> list = query.getResultList();
if (list.size() == 0) {
return null;
} else if (list.size() == 1) {
return list.get(0);
} else {
throw new ConfigurationException(
"Multiple facilities have " + key + " equal to " + keyValue);
}
}
@Override
public Collection<FacilityConfig> allFacilities() {
EntityManager em = emf.createEntityManager();
try {
TypedQuery<EcclesFacility> query = em.createQuery(
"from EcclesFacility", EcclesFacility.class);
return new ArrayList<FacilityConfig>(query.getResultList());
} finally {
em.close();
}
}
}