code: protected List<CmsProperty> readPropertiesFromManifest(Element parentElement, List<String> ignoredPropertyKeys) {
  
          // all imported Cms property objects are collected in map first forfaster access
          Map<String, CmsProperty> properties = new HashMap<String, CmsProperty>();
          CmsProperty property = null;
          List<Node> propertyElements = parentElement.selectNodes(
              "./" + A_CmsImport.N_PROPERTIES + "/" + A_CmsImport.N_PROPERTY);
          Element propertyElement = null;
          String key = null, value = null;
          Attribute attrib = null;
  
          // iterate over all property elements
          for (int i = 0, n = propertyElements.size(); i < n; i++) {
              propertyElement = (Element)propertyElements.get(i);
              key = getChildElementTextValue(propertyElement, A_CmsImport.N_NAME);
  
              if ((key == null) || ignoredPropertyKeys.contains(key)) {
                  // continue if the current property (key) should be ignored or is null
                  continue;
              }
  
              // all Cms properties are collected in a map keyed by their property keys
              property = properties.get(key);
              if (property == null) {
                  property = new CmsProperty();
                  property.setName(key);
                  property.setAutoCreatePropertyDefinition(true);
                  properties.put(key, property);
              }
  
              value = getChildElementTextValue(propertyElement, A_CmsImport.N_VALUE);
              if (value == null) {
                  value = "";
              }
  
              attrib = propertyElement.attribute(A_CmsImport.N_PROPERTY_ATTRIB_TYPE);
              if ((attrib != null) && attrib.getValue().equals(A_CmsImport.N_PROPERTY_ATTRIB_TYPE_SHARED)) {
                  // it is a shared/resource property value
                  property.setResourceValue(value);
              } else {
                  // it is an individual/structure value
                  property.setStructureValue(value);
              }
          }
  
          return new ArrayList<CmsProperty>(properties.values());
      }
docs: Reads all properties below a specified parent element from the <code>manifest.xml</code>.<p>
  
  @param parentElement the current file node
  @param ignoredPropertyKeys a list of properties to be ignored
  
  @return a list with all properties