Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
/*****************************************************************
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.cayenne.modeler;
import java.awt.Component;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.EventListener;
import java.util.EventObject;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
import java.util.prefs.Preferences;
import javax.swing.event.EventListenerList;
import org.apache.cayenne.CayenneRuntimeException;
import org.apache.cayenne.configuration.ConfigurationNode;
import org.apache.cayenne.configuration.DataChannelDescriptor;
import org.apache.cayenne.configuration.DataNodeDescriptor;
import org.apache.cayenne.configuration.event.DataMapEvent;
import org.apache.cayenne.configuration.event.DataMapListener;
import org.apache.cayenne.configuration.event.DataNodeEvent;
import org.apache.cayenne.configuration.event.DataNodeListener;
import org.apache.cayenne.configuration.event.DomainEvent;
import org.apache.cayenne.configuration.event.DomainListener;
import org.apache.cayenne.configuration.event.ProcedureEvent;
import org.apache.cayenne.configuration.event.ProcedureListener;
import org.apache.cayenne.configuration.event.ProcedureParameterEvent;
import org.apache.cayenne.configuration.event.ProcedureParameterListener;
import org.apache.cayenne.configuration.event.QueryEvent;
import org.apache.cayenne.configuration.event.QueryListener;
import org.apache.cayenne.map.DataMap;
import org.apache.cayenne.map.DbAttribute;
import org.apache.cayenne.map.DbEntity;
import org.apache.cayenne.map.DbRelationship;
import org.apache.cayenne.map.Embeddable;
import org.apache.cayenne.map.EmbeddableAttribute;
import org.apache.cayenne.map.EntityResolver;
import org.apache.cayenne.map.ObjAttribute;
import org.apache.cayenne.map.ObjEntity;
import org.apache.cayenne.map.ObjRelationship;
import org.apache.cayenne.map.Procedure;
import org.apache.cayenne.map.ProcedureParameter;
import org.apache.cayenne.map.event.AttributeEvent;
import org.apache.cayenne.map.event.DbAttributeListener;
import org.apache.cayenne.map.event.DbEntityListener;
import org.apache.cayenne.map.event.DbRelationshipListener;
import org.apache.cayenne.map.event.EmbeddableAttributeEvent;
import org.apache.cayenne.map.event.EmbeddableAttributeListener;
import org.apache.cayenne.map.event.EmbeddableEvent;
import org.apache.cayenne.map.event.EmbeddableListener;
import org.apache.cayenne.map.event.EntityEvent;
import org.apache.cayenne.map.event.MapEvent;
import org.apache.cayenne.map.event.ObjAttributeListener;
import org.apache.cayenne.map.event.ObjEntityListener;
import org.apache.cayenne.map.event.ObjRelationshipListener;
import org.apache.cayenne.map.event.RelationshipEvent;
import org.apache.cayenne.modeler.action.NavigateBackwardAction;
import org.apache.cayenne.modeler.action.NavigateForwardAction;
import org.apache.cayenne.modeler.action.RevertAction;
import org.apache.cayenne.modeler.action.SaveAction;
import org.apache.cayenne.modeler.editor.CallbackType;
import org.apache.cayenne.modeler.event.AttributeDisplayEvent;
import org.apache.cayenne.modeler.event.CallbackMethodEvent;
import org.apache.cayenne.modeler.event.CallbackMethodListener;
import org.apache.cayenne.modeler.event.DataMapDisplayEvent;
import org.apache.cayenne.modeler.event.DataMapDisplayListener;
import org.apache.cayenne.modeler.event.DataNodeDisplayEvent;
import org.apache.cayenne.modeler.event.DataNodeDisplayListener;
import org.apache.cayenne.modeler.event.DbAttributeDisplayListener;
import org.apache.cayenne.modeler.event.DbEntityDisplayListener;
import org.apache.cayenne.modeler.event.DbRelationshipDisplayListener;
import org.apache.cayenne.modeler.event.DisplayEvent;
import org.apache.cayenne.modeler.event.DomainDisplayEvent;
import org.apache.cayenne.modeler.event.DomainDisplayListener;
import org.apache.cayenne.modeler.event.EmbeddableAttributeDisplayEvent;
import org.apache.cayenne.modeler.event.EmbeddableAttributeDisplayListener;
import org.apache.cayenne.modeler.event.EmbeddableDisplayEvent;
import org.apache.cayenne.modeler.event.EmbeddableDisplayListener;
import org.apache.cayenne.modeler.event.EntityDisplayEvent;
import org.apache.cayenne.modeler.event.EntityListenerEvent;
import org.apache.cayenne.modeler.event.EntityListenerListener;
import org.apache.cayenne.modeler.event.MultipleObjectsDisplayEvent;
import org.apache.cayenne.modeler.event.MultipleObjectsDisplayListener;
import org.apache.cayenne.modeler.event.ObjAttributeDisplayListener;
import org.apache.cayenne.modeler.event.ObjEntityDisplayListener;
import org.apache.cayenne.modeler.event.ObjRelationshipDisplayListener;
import org.apache.cayenne.modeler.event.ProcedureDisplayEvent;
import org.apache.cayenne.modeler.event.ProcedureDisplayListener;
import org.apache.cayenne.modeler.event.ProcedureParameterDisplayEvent;
import org.apache.cayenne.modeler.event.ProcedureParameterDisplayListener;
import org.apache.cayenne.modeler.event.QueryDisplayEvent;
import org.apache.cayenne.modeler.event.QueryDisplayListener;
import org.apache.cayenne.modeler.event.RelationshipDisplayEvent;
import org.apache.cayenne.modeler.pref.DataMapDefaults;
import org.apache.cayenne.modeler.pref.DataNodeDefaults;
import org.apache.cayenne.modeler.util.CayenneController;
import org.apache.cayenne.modeler.util.CircularArray;
import org.apache.cayenne.modeler.util.Comparators;
import org.apache.cayenne.project.ConfigurationNodeParentGetter;
import org.apache.cayenne.project.Project;
import org.apache.cayenne.query.Query;
import org.apache.cayenne.util.IDUtil;
/**
* A controller that works with the project tree, tracking selection and dispatching
* project events.
*/
public class ProjectController extends CayenneController {
/*
* A snapshot of the current state of the project controller. This was added so that
* we could support history of recent objects.
*/
public class ControllerState {
private boolean isRefiring;
private DisplayEvent event;
private DataChannelDescriptor domain;
private DataNodeDescriptor node;
private DataMap map;
private ObjEntity objEntity;
private DbEntity dbEntity;
private Embeddable embeddable;
private EmbeddableAttribute[] embAttrs;
private ObjAttribute[] objAttrs;
private DbAttribute[] dbAttrs;
private ObjRelationship[] objRels;
private DbRelationship[] dbRels;
private Procedure procedure;
private ProcedureParameter[] procedureParameters;
private Query query;
/**
* Paths of multiple selection
*/
private Object[] paths;
/**
* currently selecte entity listener class
*/
private String listenerClass;
/**
* currently selected callback type
*/
private CallbackType callbackType;
/**
* currently selected callback methods
*/
private String[] callbackMethods;
public ControllerState() {
domain = null;
node = null;
map = null;
objEntity = null;
dbEntity = null;
embeddable = null;
procedure = null;
// life is much easier if these guys are never null
embAttrs = new EmbeddableAttribute[0];
dbAttrs = new DbAttribute[0];
dbRels = new DbRelationship[0];
procedureParameters = new ProcedureParameter[0];
objAttrs = new ObjAttribute[0];
objRels = new ObjRelationship[0];
callbackMethods = new String[0];
query = null;
event = null;
paths = null;
isRefiring = false;
}
/*
* Used to determine if the val ControllerState is equivalent, which means if the
* event is refired again, will it end up in the same place on the screen. This
* get's a bit messy at the end, because of inheritance heirarchy issues.
*/
public boolean isEquivalent(ControllerState val) {
if (val == null)
return false;
if (event instanceof EntityDisplayEvent
&& val.event instanceof EntityDisplayEvent) {
if (((EntityDisplayEvent) val.event).getEntity() instanceof ObjEntity) {
return objEntity == val.objEntity;
}
else {
return dbEntity == val.dbEntity;
}
}
else if (event instanceof ProcedureDisplayEvent
&& val.event instanceof ProcedureDisplayEvent) {
return procedure == val.procedure;
}
else if (event instanceof QueryDisplayEvent
&& val.event instanceof QueryDisplayEvent) {
return query == val.query;
}
else if (event instanceof EmbeddableDisplayEvent
&& val.event instanceof EmbeddableDisplayEvent) {
return embeddable == val.embeddable;
}
else if (event.getClass() == DataMapDisplayEvent.class
&& event.getClass() == val.event.getClass()) {
return map == val.map;
}
else if (event.getClass() == DataNodeDisplayEvent.class
&& event.getClass() == val.event.getClass()) {
return node == val.node;
}
else if (event.getClass() == DomainDisplayEvent.class
&& event.getClass() == val.event.getClass()) {
return domain == val.domain;
}
return false;
}
}
protected EventListenerList listenerList;
protected boolean dirty;
protected Project project;
protected Preferences projectControllerPreferences;
protected ControllerState currentState;
protected CircularArray controllerStateHistory;
protected int maxHistorySize = 20;
private EntityResolver entityResolver;
/**
* Project files watcher. When project file is changed, user will be asked to confirm
* loading the changes
*/
ProjectWatchdog watchdog;
public ProjectController(CayenneModelerController parent) {
super(parent);
this.listenerList = new EventListenerList();
controllerStateHistory = new CircularArray(maxHistorySize);
currentState = new ControllerState();
}
@Override
public Component getView() {
return parent.getView();
}
public Project getProject() {
return project;
}
public EntityResolver getEntityResolver() {
return entityResolver;
}
public void setProject(Project currentProject) {
if (this.project != currentProject) {
this.project = currentProject;
this.projectControllerPreferences = null;
if (project == null) {
this.entityResolver = null;
if (watchdog != null) {
watchdog.interrupt();
watchdog = null;
}
}
else {
if (watchdog == null) {
watchdog = new ProjectWatchdog(this);
watchdog.start();
}
watchdog.reconfigure();
entityResolver = new EntityResolver(
((DataChannelDescriptor) currentProject.getRootNode())
.getDataMaps());
updateEntityResolver();
// addDomainListener(((ModelerProjectConfiguration) project
// .getConfiguration()).getGraphRegistry());
}
}
}
public void updateEntityResolver() {
Collection dataMaps = ((DataChannelDescriptor) project.getRootNode())
.getDataMaps();
entityResolver.setDataMaps(dataMaps);
for (DataMap dataMap : dataMaps) {
dataMap.setNamespace(entityResolver);
}
}
public Preferences getPreferenceForProject() {
if (getProject() == null) {
throw new CayenneRuntimeException("No Project selected");
}
if (projectControllerPreferences == null) {
updateProjectControllerPreferences();
}
return projectControllerPreferences;
}
/**
* Returns top preferences for the current project, throwing an exception if no
* project is selected.
*/
public Preferences getPreferenceForDataDomain() {
DataChannelDescriptor dataDomain = (DataChannelDescriptor) getProject()
.getRootNode();
if (dataDomain == null) {
throw new CayenneRuntimeException("No DataDomain selected");
}
return getPreferenceForProject().node(dataDomain.getName());
}
/**
* Returns preferences object for the current DataMap. If no preferences exist for the
* current DataMap, a new Preferences object is created. If no DataMap is currently
* selected, an exception is thrown. An optional nameSuffix allows to address more
* than one defaults instance for a single DataMap.
*/
public DataMapDefaults getDataMapPreferences(String nameSuffix) {
DataMap map = getCurrentDataMap();
if (map == null) {
throw new CayenneRuntimeException("No DataMap selected");
}
Preferences pref;
if (nameSuffix == null || nameSuffix.length() == 0) {
pref = getPreferenceForDataDomain().node("DataMap").node(map.getName());
}
else {
pref = getPreferenceForDataDomain().node("DataMap").node(map.getName()).node(
nameSuffix);
}
return (DataMapDefaults) application
.getCayenneProjectPreferences()
.getProjectDetailObject(DataMapDefaults.class, pref);
}
/**
* Returns preferences object for the current DataMap, throwing an exception if no
* DataMap is selected.
*/
public DataNodeDefaults getDataNodePreferences() {
DataNodeDescriptor node = getCurrentDataNode();
if (node == null) {
throw new CayenneRuntimeException("No DataNode selected");
}
return (DataNodeDefaults) application
.getCayenneProjectPreferences()
.getProjectDetailObject(
DataNodeDefaults.class,
getPreferenceForDataDomain()
.node("DataNode")
.node(node.getName()));
}
public void projectOpened() {
CayenneModelerFrame frame = (CayenneModelerFrame) getView();
addDataNodeDisplayListener(frame);
addDataMapDisplayListener(frame);
addObjEntityDisplayListener(frame);
addDbEntityDisplayListener(frame);
addQueryDisplayListener(frame);
addProcedureDisplayListener(frame);
addMultipleObjectsDisplayListener(frame);
addEmbeddableDisplayListener(frame);
}
public void reset() {
clearState();
setDirty(false);
listenerList = new EventListenerList();
controllerStateHistory.clear();
}
/*
* Allow the user to change the default history size. TODO When a user changes their
* preferences it should call this method. I don't know how the preferences work, so I
* will leave this to someone else to do. Garry
*/
public void setHistorySize(int newSize) {
controllerStateHistory.resize(newSize);
}
public boolean isDirty() {
return dirty;
}
/** Resets all current models to null. */
private void clearState() {
// don't clear if we are refiring events for history navigation
if (currentState.isRefiring)
return;
currentState = new ControllerState();
}
private void saveState(DisplayEvent e) {
if (!controllerStateHistory.contains(currentState)) {
currentState.event = e;
controllerStateHistory.add(currentState);
}
}
private void removeFromHistory(EventObject e) {
synchronized (controllerStateHistory) {
int count = controllerStateHistory.size();
List