use of org.apache.cayenne.map.DataMap in project cayenne by apache.
the class CompatibilityDataChannelDescriptorLoader method load.
@Override
public ConfigurationTree<DataChannelDescriptor> load(Resource configurationResource) throws ConfigurationException {
if (configurationResource == null) {
throw new NullPointerException("Null configurationResource");
}
if (!(upgradeServiceProvider.get() instanceof CompatibilityUpgradeService)) {
throw new ConfigurationException("CompatibilityUpgradeService expected");
}
CompatibilityUpgradeService upgradeService = (CompatibilityUpgradeService) upgradeServiceProvider.get();
UpgradeMetaData metaData = upgradeService.getUpgradeType(configurationResource);
if (metaData.getUpgradeType() == UpgradeType.UPGRADE_NOT_NEEDED) {
return super.load(configurationResource);
}
if (metaData.getUpgradeType() == UpgradeType.DOWNGRADE_NEEDED) {
throw new ConfigurationException("Unable to load configuration from %s: " + "It was created using a newer version of the Modeler", configurationResource.getURL());
}
if (metaData.getUpgradeType() == UpgradeType.INTERMEDIATE_UPGRADE_NEEDED) {
throw new ConfigurationException("Unable to load configuration from %s: " + "Open the project in the older Modeler to do an intermediate upgrade.", configurationResource.getURL());
}
URL configurationURL = configurationResource.getURL();
upgradeService.upgradeProject(configurationResource);
Document projectDocument = documentProvider.getDocument(configurationURL);
if (projectDocument == null) {
throw new ConfigurationException("Unable to upgrade " + configurationURL);
}
logger.info("Loading XML configuration resource from " + configurationURL);
final DataChannelDescriptor descriptor = new DataChannelDescriptor();
descriptor.setConfigurationSource(configurationResource);
descriptor.setName(nameMapper.configurationNodeName(DataChannelDescriptor.class, configurationResource));
try {
DOMSource source = new DOMSource(projectDocument);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
TransformerFactory transFactory = TransformerFactory.newInstance();
transFactory.newTransformer().transform(source, new StreamResult(baos));
InputSource isource = new InputSource(source.getSystemId());
isource.setByteStream(new ByteArrayInputStream(baos.toByteArray()));
XMLReader parser = Util.createXmlReader();
LoaderContext loaderContext = new LoaderContext(parser, handlerFactory);
loaderContext.addDataMapListener(new DataMapLoaderListener() {
@Override
public void onDataMapLoaded(DataMap dataMap) {
descriptor.getDataMaps().add(dataMap);
}
});
DataChannelHandler rootHandler = new DataChannelHandler(this, descriptor, loaderContext);
parser.setContentHandler(rootHandler);
parser.setErrorHandler(rootHandler);
parser.parse(isource);
} catch (Exception e) {
throw new ConfigurationException("Error loading configuration from %s", e, configurationURL);
}
// Finally upgrade model, if needed
upgradeService.upgradeModel(configurationResource, descriptor);
return new ConfigurationTree<>(descriptor, null);
}
use of org.apache.cayenne.map.DataMap in project cayenne by apache.
the class CompatibilityDataMapLoader method load.
@Override
public DataMap load(Resource configurationResource) throws CayenneRuntimeException {
Document document = documentProvider.getDocument(configurationResource.getURL());
// no document yet in provider, maybe DataMap is directly loaded
if (document == null) {
if (!(upgradeServiceProvider.get() instanceof CompatibilityUpgradeService)) {
throw new ConfigurationException("CompatibilityUpgradeService expected");
}
// try to upgrade datamap directly
CompatibilityUpgradeService upgradeService = (CompatibilityUpgradeService) upgradeServiceProvider.get();
upgradeService.upgradeDataMap(configurationResource);
document = documentProvider.getDocument(configurationResource.getURL());
// still no document, try to load it without upgrade, though it likely will fail
if (document == null) {
return super.load(configurationResource);
}
}
final DataMap[] maps = new DataMap[1];
try {
DOMSource source = new DOMSource(document);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
TransformerFactory transFactory = TransformerFactory.newInstance();
transFactory.newTransformer().transform(source, new StreamResult(baos));
InputSource isource = new InputSource(source.getSystemId());
isource.setByteStream(new ByteArrayInputStream(baos.toByteArray()));
XMLReader parser = Util.createXmlReader();
LoaderContext loaderContext = new LoaderContext(parser, handlerFactory);
loaderContext.addDataMapListener(dataMap -> maps[0] = dataMap);
RootDataMapHandler rootHandler = new RootDataMapHandler(loaderContext);
parser.setContentHandler(rootHandler);
parser.setErrorHandler(rootHandler);
parser.parse(isource);
} catch (Exception e) {
throw new CayenneRuntimeException("Error loading configuration from %s", e, configurationResource.getURL());
}
if (maps[0] == null) {
throw new CayenneRuntimeException("Unable to load data map from %s", configurationResource.getURL());
}
DataMap map = maps[0];
if (map.getName() == null) {
// set name based on location if no name provided by map itself
map.setName(mapNameFromLocation(configurationResource.getURL().getFile()));
}
return map;
}
use of org.apache.cayenne.map.DataMap in project cayenne by apache.
the class CompatibilityDataChannelDescriptorLoaderIT method testLoad.
@Test
public void testLoad() throws Exception {
Injector injector = getInjector();
DataChannelDescriptorLoader loader = injector.getInstance(DataChannelDescriptorLoader.class);
assertTrue(loader instanceof CompatibilityDataChannelDescriptorLoader);
URL resourceUrl = getClass().getResource("../../project/compatibility/cayenne-project-v6.xml");
Resource resource = new URLResource(resourceUrl);
ConfigurationTree<DataChannelDescriptor> configurationTree = loader.load(resource);
assertNotNull(configurationTree.getRootNode());
assertTrue(configurationTree.getLoadFailures().isEmpty());
assertEquals(1, configurationTree.getRootNode().getDataMaps().size());
DataMap dataMap = configurationTree.getRootNode().getDataMaps().iterator().next();
assertEquals(1, dataMap.getDbEntities().size());
assertEquals(1, dataMap.getObjEntities().size());
assertNotNull(dataMap.getObjEntity("Artist"));
assertNotNull(dataMap.getDbEntity("Artist"));
assertEquals(2, dataMap.getDbEntity("Artist").getAttributes().size());
}
use of org.apache.cayenne.map.DataMap in project cayenne by apache.
the class DataDomain method removeDataMap.
/**
* Removes named DataMap from this DataDomain and any underlying DataNodes
* that include it.
*
* @since 3.1
*/
public void removeDataMap(String mapName) {
DataMap map = getDataMap(mapName);
if (map == null) {
return;
}
// remove from data nodes
for (DataNode node : nodes.values()) {
node.removeDataMap(mapName);
}
nodesByDataMapName.remove(mapName);
// remove from EntityResolver
getEntityResolver().removeDataMap(map);
refreshEntitySorter();
}
use of org.apache.cayenne.map.DataMap in project cayenne by apache.
the class DataDomain method lookupDataNode.
/**
* Returns a DataNode that should handle queries for all entities in a
* DataMap.
*
* @since 1.1
*/
public DataNode lookupDataNode(DataMap map) {
DataNode node = nodesByDataMapName.get(map.getName());
if (node == null) {
// linked...
for (DataNode n : getDataNodes()) {
for (DataMap m : n.getDataMaps()) {
if (m == map) {
nodesByDataMapName.put(map.getName(), n);
node = n;
break;
}
}
if (node != null) {
break;
}
}
if (node == null) {
if (defaultNode != null) {
nodesByDataMapName.put(map.getName(), defaultNode);
node = defaultNode;
} else {
throw new CayenneRuntimeException("No DataNode configured for DataMap '%s'" + " and no default DataNode set", map.getName());
}
}
}
return node;
}
Aggregations