/* * Copyright (c) 2010-2013 Evolveum * * Licensed 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 com.evolveum.midpoint.schema; import java.util.Collection; import java.util.List; import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; import com.evolveum.midpoint.xml.ns._public.common.common_3.CapabilitiesType; import com.evolveum.midpoint.xml.ns._public.common.common_3.CapabilityCollectionType; import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.*; import org.jetbrains.annotations.NotNull; import org.w3c.dom.Element; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.JAXBUtil; import com.evolveum.midpoint.util.exception.SchemaException; /** * @author semancik * */ public class CapabilityUtil { @SuppressWarnings({ "unchecked", "rawtypes" }) public static <T extends CapabilityType> T getCapability(Collection<Object> capabilities, Class<T> capabilityClass) { if (capabilities == null) { return null; } for (Object cap : capabilities) { if (cap instanceof JAXBElement) { JAXBElement element = (JAXBElement) cap; if (capabilityClass.isAssignableFrom(element.getDeclaredType())) { return (T) element.getValue(); } } else if (capabilityClass.isAssignableFrom(cap.getClass())) { return (T) cap; } } return null; } public static boolean isCapabilityEnabled(Object capability) throws SchemaException { if (capability == null) { return false; } if (capability instanceof JAXBElement<?>) { capability = ((JAXBElement<?>)capability).getValue(); } if (capability instanceof CapabilityType) { return CapabilityUtil.isCapabilityEnabled((CapabilityType)capability); } else if (capability instanceof Element) { return CapabilityUtil.isCapabilityEnabled((Element)capability); } else { throw new IllegalArgumentException("Unexpected capability type "+capability.getClass()); } } private static boolean isCapabilityEnabled(Element capability) throws SchemaException { if (capability == null) { return false; } ObjectFactory capabilitiesObjectFactory = new ObjectFactory(); QName enabledElementName = capabilitiesObjectFactory.createEnabled(true).getName(); Element enabledElement = DOMUtil.getChildElement(capability, enabledElementName); if (enabledElement == null) { return true; } Boolean enabled = XmlTypeConverter.convertValueElementAsScalar(enabledElement, Boolean.class); if (enabled == null) { return true; } return enabled; } public static <T extends CapabilityType> boolean isCapabilityEnabled(T capability) { if (capability == null) { return false; } if (capability.isEnabled() == null) { return true; } return capability.isEnabled(); } public static boolean containsCapabilityWithSameElementName(List<Object> capabilities, Object capability) { if (capabilities == null) { return false; } QName capabilityElementName = JAXBUtil.getElementQName(capability); for (Object cap: capabilities) { QName capElementName = JAXBUtil.getElementQName(cap); if (capabilityElementName.equals(capElementName)) { return true; } } return false; } public static String getCapabilityDisplayName(Object capability) { // TODO: look for schema annotation String className; if (capability instanceof JAXBElement) { className = ((JAXBElement) capability).getDeclaredType().getSimpleName(); } else { className = capability.getClass().getSimpleName(); } if (className.endsWith("CapabilityType")) { return className.substring(0, className.length() - "CapabilityType".length()); } return className; } public static boolean isPasswordReturnedByDefault(CredentialsCapabilityType capability) { if (capability == null) { return false; } PasswordCapabilityType password = capability.getPassword(); if (password == null) { return false; } if (password.isReturnedByDefault() == null) { return true; } return password.isReturnedByDefault(); } public static boolean isActivationStatusReturnedByDefault(ActivationCapabilityType capability) { if (capability == null) { return false; } ActivationStatusCapabilityType statusCap = getEffectiveActivationStatus(capability); if (statusCap == null) { return false; } if (statusCap.isReturnedByDefault() == null) { return true; } return statusCap.isReturnedByDefault(); } public static boolean isActivationLockoutStatusReturnedByDefault(ActivationCapabilityType capability) { if (capability == null) { return false; } ActivationLockoutStatusCapabilityType statusCap = capability.getLockoutStatus(); if (statusCap == null) { return false; } if (statusCap.isReturnedByDefault() == null) { return true; } return statusCap.isReturnedByDefault(); } public static boolean isActivationValidFromReturnedByDefault(ActivationCapabilityType capability) { if (capability == null) { return false; } ActivationValidityCapabilityType valCap = capability.getValidFrom(); if (valCap == null) { return false; } if (valCap.isReturnedByDefault() == null) { return true; } return valCap.isReturnedByDefault(); } public static boolean isActivationValidToReturnedByDefault(ActivationCapabilityType capability) { if (capability == null) { return false; } ActivationValidityCapabilityType valCap = capability.getValidTo(); if (valCap == null) { return false; } if (valCap.isReturnedByDefault() == null) { return true; } return valCap.isReturnedByDefault(); } @SuppressWarnings("unchecked") public static CapabilityType asCapabilityType(Object capabilityObject) { return capabilityObject instanceof CapabilityType ? (CapabilityType) capabilityObject : ((JAXBElement<? extends CapabilityType>) capabilityObject).getValue(); } public static void fillDefaults(@NotNull CapabilityType capability) { if (capability.isEnabled() == null) { capability.setEnabled(true); } if (capability instanceof ActivationCapabilityType) { ActivationCapabilityType act = ((ActivationCapabilityType) capability); if (act.getStatus() == null) { ActivationStatusCapabilityType st = new ActivationStatusCapabilityType(); act.setStatus(st); st.setEnabled(false); // TODO check if all midPoint code honors this flag! st.setReturnedByDefault(false); st.setIgnoreAttribute(true); } else { ActivationStatusCapabilityType st = act.getStatus(); st.setEnabled(def(st.isEnabled(), true)); st.setReturnedByDefault(def(st.isReturnedByDefault(), true)); st.setIgnoreAttribute(def(st.isIgnoreAttribute(), true)); } if (act.getLockoutStatus() == null) { ActivationLockoutStatusCapabilityType st = new ActivationLockoutStatusCapabilityType(); act.setLockoutStatus(st); st.setEnabled(false); st.setReturnedByDefault(false); st.setIgnoreAttribute(true); } else { ActivationLockoutStatusCapabilityType st = act.getLockoutStatus(); st.setEnabled(def(st.isEnabled(), true)); st.setReturnedByDefault(def(st.isReturnedByDefault(), true)); st.setIgnoreAttribute(def(st.isIgnoreAttribute(), true)); } if (act.getValidFrom() == null) { ActivationValidityCapabilityType vf = new ActivationValidityCapabilityType(); act.setValidFrom(vf); vf.setEnabled(false); vf.setReturnedByDefault(false); } else { ActivationValidityCapabilityType vf = act.getValidFrom(); vf.setEnabled(def(vf.isEnabled(), true)); vf.setReturnedByDefault(def(vf.isReturnedByDefault(), true)); } if (act.getValidTo() == null) { ActivationValidityCapabilityType vt = new ActivationValidityCapabilityType(); act.setValidTo(vt); vt.setEnabled(false); vt.setReturnedByDefault(false); } else { ActivationValidityCapabilityType vt = act.getValidTo(); vt.setEnabled(def(vt.isEnabled(), true)); vt.setReturnedByDefault(def(vt.isReturnedByDefault(), true)); } } else if (capability instanceof CredentialsCapabilityType) { CredentialsCapabilityType cred = ((CredentialsCapabilityType) capability); if (cred.getPassword() == null) { PasswordCapabilityType pc = new PasswordCapabilityType(); cred.setPassword(pc); pc.setEnabled(false); pc.setReturnedByDefault(false); } else { PasswordCapabilityType pc = cred.getPassword(); pc.setEnabled(def(pc.isEnabled(), true)); pc.setReturnedByDefault(def(pc.isReturnedByDefault(), true)); } } } private static Boolean def(Boolean originalValue, boolean defaultValue) { return originalValue != null ? originalValue : defaultValue; } public static <T extends CapabilityType> T getEffectiveCapability(CapabilitiesType capabilitiesType, Class<T> capabilityClass) { if (capabilitiesType == null) { return null; } if (capabilitiesType.getConfigured() != null) { T configuredCapability = CapabilityUtil.getCapability(capabilitiesType.getConfigured().getAny(), capabilityClass); if (configuredCapability != null) { return configuredCapability; } // No configured capability entry, fallback to native capability } if (capabilitiesType.getNative() != null) { T nativeCapability = CapabilityUtil.getCapability(capabilitiesType.getNative().getAny(), capabilityClass); if (nativeCapability != null) { return nativeCapability; } } return null; } public static ActivationStatusCapabilityType getEffectiveActivationStatus(ActivationCapabilityType act) { if (act != null && act.getStatus() != null && !Boolean.FALSE.equals(act.getStatus().isEnabled())) { return act.getStatus(); } else { return null; } } public static ActivationValidityCapabilityType getEffectiveActivationValidFrom(ActivationCapabilityType act) { if (act != null && act.getValidFrom() != null && !Boolean.FALSE.equals(act.getValidFrom().isEnabled())) { return act.getValidFrom(); } else { return null; } } public static ActivationValidityCapabilityType getEffectiveActivationValidTo(ActivationCapabilityType act) { if (act != null && act.getValidTo() != null && !Boolean.FALSE.equals(act.getValidTo().isEnabled())) { return act.getValidTo(); } else { return null; } } public static ActivationLockoutStatusCapabilityType getEffectiveActivationLockoutStatus(ActivationCapabilityType act) { if (act != null && act.getLockoutStatus() != null && !Boolean.FALSE.equals(act.getLockoutStatus().isEnabled())) { return act.getLockoutStatus(); } else { return null; } } public static <T extends CapabilityType> boolean hasNativeCapability(CapabilitiesType capabilities, Class<T> capabilityClass) { if (capabilities == null) { return false; } CapabilityCollectionType nativeCaps = capabilities.getNative(); if (nativeCaps == null) { return false; } return getCapability(nativeCaps.getAny(), capabilityClass) != null; } }