private Status getProperties(Class<?> busInterface) throws AnnotationBusException { for (Method method : busInterface.getMethods()) { if (method.getAnnotation(BusProperty.class) != null) { String name = getName(method); Property property = properties.get(name); BusAnnotations propertyAnnotations = method.getAnnotation(BusAnnotations.class); TreeMap<String, String> annotations = new TreeMap<String, String>(); if (propertyAnnotations != null) { for (BusAnnotation propertyAnnotation : propertyAnnotations.value()) { annotations.put(propertyAnnotation.name(), propertyAnnotation.value()); } } if (property == null) { property = new Property(name, getPropertySig(method), annotations); } else if (!property.signature.equals(getPropertySig(method))) { return Status.BAD_ANNOTATION; } if (method.getName().startsWith("get")) { property.get = method; } else if (method.getName().startsWith("set") && (method.getGenericReturnType().equals(void.class))) { property.set = method; } else { return Status.BAD_ANNOTATION; } properties.put(name, property); } } return Status.OK; }
/** * Create the native interface description for the busInterface. * * @param busAttachment the connection the interface is on * @param busInterface the interface */ public Status create(BusAttachment busAttachment, Class<?> busInterface) throws AnnotationBusException { Status status = getProperties(busInterface); if (status != Status.OK) { return status; } status = getMembers(busInterface); if (status != Status.OK) { return status; } int securePolicy = AJ_IFC_SECURITY_INHERIT; Secure secureAnnotation = busInterface.getAnnotation(Secure.class); if (secureAnnotation != null) { if (secureAnnotation.value().equals("required")) { securePolicy = AJ_IFC_SECURITY_REQUIRED; } else if (secureAnnotation.value().equals("off")) { securePolicy = AJ_IFC_SECURITY_OFF; } else { /* * In C++ if an interface provides an unknown security annotation * it automatically defaults to the inherit for security. For * that reason the Java code will do the same. */ securePolicy = AJ_IFC_SECURITY_INHERIT; } } else { securePolicy = AJ_IFC_SECURITY_INHERIT; } status = create( busAttachment, getName(busInterface), securePolicy, properties.size(), members.size()); if (status != Status.OK) { return status; } status = addProperties(busInterface); if (status != Status.OK) { return status; } status = addMembers(busInterface); if (status != Status.OK) { return status; } // now we need to add the DBus annotations for the interface; // this must be done *before* calling create BusAnnotations busAnnotations = busInterface.getAnnotation(BusAnnotations.class); if (busAnnotations != null) { for (BusAnnotation annotation : busAnnotations.value()) { addAnnotation(annotation.name(), annotation.value()); } } configureDescriptions(busAttachment, busInterface); activate(); return Status.OK; }
private Status addMembers(Class<?> busInterface) throws AnnotationBusException { for (Method member : members) { int type = INVALID; int annotation = 0; String accessPerm = null; BusMethod m = member.getAnnotation(BusMethod.class); BusSignal s = member.getAnnotation(BusSignal.class); AccessPermission ap = member.getAnnotation(AccessPermission.class); if (m != null) { type = METHOD_CALL; annotation = m.annotation(); } else if (s != null) { type = SIGNAL; annotation = s.annotation(); } if (type != INVALID) { if (ap != null) { accessPerm = ap.value(); } String memberName = getName(member); Status status = addMember( type, memberName, getInputSig(member), getOutSig(member), annotation, accessPerm); if (status != Status.OK) { return status; } // pull out the DBus annotations BusAnnotations dbusAnnotations = member.getAnnotation(BusAnnotations.class); if (dbusAnnotations != null) { for (BusAnnotation busAnnotation : dbusAnnotations.value()) { addMemberAnnotation(memberName, busAnnotation.name(), busAnnotation.value()); } } } } return Status.OK; }