/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.jsf.model;
import java.util.*;
import org.jboss.tools.common.model.*;
import org.jboss.tools.common.model.impl.*;
import org.jboss.tools.common.model.loaders.XObjectLoader;
import org.jboss.tools.common.model.util.XModelObjectLoaderUtil;
import org.jboss.tools.jsf.model.impl.NavigationRuleObjectImpl;
import org.jboss.tools.jst.web.model.AbstractWebFileImpl;
import org.jboss.tools.jst.web.model.WebProcessLoader;
public class FileFacesConfigImpl extends AbstractWebFileImpl implements JSFNavigationModel, JSFConstants {
private static final long serialVersionUID = 1146851303785562308L;
protected RegularChildren createChildren() {
return new OrderedByEntityChildren();
}
protected String getProcessEntity() {
return "JSFProcess"; //$NON-NLS-1$
}
protected boolean hasDTD() {
String entity = getModelEntity().getName();
return ENT_FACESCONFIG_10.equals(entity) || ENT_FACESCONFIG_11.equals(entity);
}
public void updateRuleIndices() {
Map<String,Integer> paths = new HashMap<String,Integer>();
List<XModelObject> list = new ArrayList<XModelObject>();
XModelObject[] rs0 = getChildByPath(FOLDER_NAVIGATION_RULES).getChildren();
for (XModelObject o: rs0) list.add(o);
if(getChildByPath(FOLDER_FLOW_DEFINITIONS) != null) {
XModelObject[] rs1 = getChildByPath(FOLDER_FLOW_DEFINITIONS).getChildren();
for (XModelObject o: rs1) {
XModelObject[] rs2 = o.getChildren("JSFNavigationRule22");
for (XModelObject o2: rs2) list.add(o2);
}
}
XModelObject[] rs = list.toArray(new XModelObject[0]);
Map<String,XModelObject> pps = new HashMap<String,XModelObject>();
int[] is = new int[rs.length];
for (int i = 0; i < rs.length; i++) {
String path = rs[i].getAttributeValue(ATT_FROM_VIEW_ID);
Integer v = paths.get(path);
is[i] = (v == null) ? 0 : v.intValue() + 1;
paths.put(path, Integer.valueOf(is[i]));
pps.put(rs[i].getPathPart(), rs[i]);
}
boolean success = true;
int att = 0;
do {
success = true;
for (int i = 0; i < rs.length; i++) {
String d = NavigationRuleObjectImpl.toNavigationRulePathPart(rs[i].getAttributeValue("from-view-id")) + ":" + is[i]; //$NON-NLS-1$ //$NON-NLS-2$
XModelObject c = pps.remove(d);
String v = "" + is[i]; //$NON-NLS-1$
if(c != null) {
if(c != rs[i]) {
success = false;
v += "." + is[i]; //$NON-NLS-1$
} else {
continue;
}
}
rs[i].setAttributeValue("index", v); //$NON-NLS-1$
}
} while(!success && ++att < 5);
}
public int getRuleCount(String fromViewId) {
XModelObject[] rs = getChildByPath(FOLDER_NAVIGATION_RULES).getChildren(); //$NON-NLS-1$
int s = 0;
for (int i = 0; i < rs.length; i++) {
String f = rs[i].getAttributeValue(ATT_FROM_VIEW_ID);
if(fromViewId.equals(f)) ++s;
}
if(getChildByPath(FOLDER_FLOW_DEFINITIONS) != null) {
XModelObject[] rs1 = getChildByPath(FOLDER_FLOW_DEFINITIONS).getChildren();
for (XModelObject o: rs1) {
XModelObject[] rs2 = o.getChildren("JSFNavigationRule22");
for (XModelObject o2: rs2) {
String f = o2.getAttributeValue(ATT_FROM_VIEW_ID);
if(fromViewId.equals(f)) ++s;
}
}
}
return s;
}
public boolean move(int from, int to, boolean firechange) {
XModelObject[] os = children.getObjects();
boolean updateRules = false;
if(from >= 0 && from < os.length && to >= 0 && to < os.length && from != to) {
updateRules = os[from].getModelEntity().getName().startsWith(ENT_NAVIGATION_RULE);
}
boolean b = super.move(from, to, firechange);
if(b && updateRules) updateRuleIndices();
return b;
}
public XModelObject addRule(String fromViewId) {
XModelObject rules = getChildByPath(FOLDER_NAVIGATION_RULES);
String ruleEntity = getNavigationRuleEntity(rules);
XModelObject rule = getModel().createModelObject(ruleEntity, null);
rule.setAttributeValue(ATT_FROM_VIEW_ID, fromViewId);
int i = getRuleCount(fromViewId);
rule.setAttributeValue("index", "" + i); //$NON-NLS-1$ //$NON-NLS-2$
rules.addChild(rule);
return rule;
}
protected void mergeAll(XModelObject f, boolean update) throws XModelException {
FacesProcessImpl process = (FacesProcessImpl)provideWebProcess();
boolean b = (process != null && process.isPrepared);
if(b) process.getHelper().addUpdateLock(this);
merge(f, !update);
if(b) {
process.getHelper().removeUpdateLock(this);
process.getHelper().updateProcess();
}
if(process != null) {
if(!process.isPrepared()/* || update*/ || isForceLoadOn()) {
XObjectLoader loader = XModelObjectLoaderUtil.getObjectLoader(this);
((WebProcessLoader)loader).reloadProcess(this);
}
if(process.isPrepared())
process.autolayout();
}
}
public static String getNavigationRuleEntity(XModelObject folder) {
if(folder == null || !folder.getModelEntity().getName().startsWith(ENT_NAVIGATION_RULES)) return null;
return folder.getModelEntity().getChildren()[0].getName();
}
}