Package jease.cms.domain

Source Code of jease.cms.domain.Factory

/*
    Copyright (C) 2011 maik.jablonski@jease.org

    This program 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.

    This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.
*/
package jease.cms.domain;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import jease.cmf.domain.Node;
import jease.cmf.domain.NodeException;
import jease.cms.domain.property.Property;

/**
* A Factory allows to define prototype content-objects which are used to
* augment existing contents with additional properties.
*/
public class Factory extends Content {

  private String sequence;
 
  public Factory() {
  }

  public String getSequence() {
    return sequence;
  }

  public void setSequence(String sequence) {
    this.sequence = sequence;
  }

  public boolean isContainer() {
    return true;
  }

  public boolean isPage() {
    return false;
  }

  /**
   * Returns an array of properties for given content synchronized with
   * properties from appropriate prototype defined as child within factory.
   */
  public Property[] getProperties(Content content) {
    for (Content prototype : getChildren(Content.class)) {
      if (prototype.getClass().equals(content.getClass())) {
        return sync(prototype.getProperties(), content.getProperties());
      }
    }
    return content.getProperties();
  }

  private Property[] sync(Property[] prototypes, Property[] clones) {
    Map<Integer, Property> clonesBySerial = new HashMap();
    List<Property> clonesWithoutSerial = new ArrayList();
    if (clones != null) {
      for (Property clone : clones) {
        if (clone.getSerial() != 0) {
          clonesBySerial.put(clone.getSerial(), clone);
        } else {
          clonesWithoutSerial.add(clone);
        }
      }
    }
    List<Property> newClones = new ArrayList();
    for (Property prototype : prototypes) {
      Property clone = clonesBySerial.get(prototype.getSerial());
      if (clone != null) {
        prototype.cloneTo(clone);
        newClones.add(clone);
      } else {
        newClones.add(prototype.copy());
      }
    }
    newClones.addAll(clonesWithoutSerial);
    return newClones.toArray(new Property[] {});
  }

  public Factory copy(boolean recursive) {
    return (Factory) super.copy(recursive);
  }

  protected void validateDuplicate(Node potentialChild,
      String potentialChildId) throws NodeException {
    super.validateDuplicate(potentialChild, potentialChildId);
    for (Node child : getChildren()) {
      if (child != potentialChild
          && child.getClass().equals(potentialChild.getClass())) {
        throw new NodeException.IllegalDuplicate();
      }
    }
  }
}
TOP

Related Classes of jease.cms.domain.Factory

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.