You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@labs.apache.org by jo...@apache.org on 2008/07/27 23:13:03 UTC
svn commit: r680187 [4/6] - in /labs/jaxmas/trunk/JaxMas: ./ .settings/ src/
src/main/ src/main/java/ src/main/java/org/ src/main/java/org/apache/
src/main/java/org/apache/labs/ src/main/java/org/apache/labs/jaxmas/
src/main/java/org/apache/labs/jaxmas...
Added: labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/infomodel/ServiceImpl.java
URL: http://svn.apache.org/viewvc/labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/infomodel/ServiceImpl.java?rev=680187&view=auto
==============================================================================
--- labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/infomodel/ServiceImpl.java (added)
+++ labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/infomodel/ServiceImpl.java Sun Jul 27 14:13:00 2008
@@ -0,0 +1,92 @@
+/**
+ * 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.labs.jaxmas.registry.infomodel;
+
+import java.util.Collection;
+
+import javax.xml.registry.JAXRException;
+import javax.xml.registry.infomodel.Key;
+import javax.xml.registry.infomodel.Organization;
+import javax.xml.registry.infomodel.Service;
+import javax.xml.registry.infomodel.ServiceBinding;
+
+import org.apache.labs.jaxmas.registry.accessor.ROAccessor;
+import org.apache.labs.jaxmas.registry.accessor.ServiceAccessor;
+
+
+
+/**
+ * Implementation of {@link Service}.
+ */
+public class ServiceImpl extends RegistryEntryImpl<Service> implements Service {
+ /**
+ * Creates a new instance with the given registry service and key.
+ */
+ public ServiceImpl(RegistryServiceImpl pRegistryService, Key pKey) {
+ super(pRegistryService, pKey);
+ }
+
+ @Override
+ public void addServiceBinding(ServiceBinding pServiceBinding)
+ throws JAXRException {
+ throw new JAXRException(NLSStrings.OPERATION_NOT_IMPLEMENTED);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void addServiceBindings(Collection pServiceBindings)
+ throws JAXRException {
+ throw new JAXRException(NLSStrings.OPERATION_NOT_IMPLEMENTED);
+ }
+
+ @Override
+ public Organization getProvidingOrganization() throws JAXRException {
+ throw new JAXRException(NLSStrings.OPERATION_NOT_IMPLEMENTED);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public Collection getServiceBindings() throws JAXRException {
+ throw new JAXRException(NLSStrings.OPERATION_NOT_IMPLEMENTED);
+ }
+
+ @Override
+ public void removeServiceBinding(ServiceBinding pServiceBinding)
+ throws JAXRException {
+ throw new JAXRException(NLSStrings.OPERATION_NOT_IMPLEMENTED);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void removeServiceBindings(Collection pServiceBindings)
+ throws JAXRException {
+ throw new JAXRException(NLSStrings.OPERATION_NOT_IMPLEMENTED);
+ }
+
+ @Override
+ public void setProvidingOrganization(Organization pOrganization)
+ throws JAXRException {
+ throw new JAXRException(NLSStrings.OPERATION_NOT_IMPLEMENTED);
+ }
+
+ @Override
+ public ROAccessor<Service> getROLoader() {
+ return ServiceAccessor.getInstance();
+ }
+}
Added: labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/infomodel/SlotImpl.java
URL: http://svn.apache.org/viewvc/labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/infomodel/SlotImpl.java?rev=680187&view=auto
==============================================================================
--- labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/infomodel/SlotImpl.java (added)
+++ labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/infomodel/SlotImpl.java Sun Jul 27 14:13:00 2008
@@ -0,0 +1,65 @@
+/**
+ * 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.labs.jaxmas.registry.infomodel;
+
+import java.util.Collection;
+
+import javax.xml.registry.JAXRException;
+import javax.xml.registry.infomodel.Slot;
+
+
+/**
+ * Default implementation of {@link Slot}.
+ */
+public class SlotImpl implements Slot {
+ private String name;
+ private String slotType;
+ private Collection<?> values;
+
+ @Override
+ public String getName() throws JAXRException {
+ return name;
+ }
+
+ @Override
+ public void setName(String pName) throws JAXRException {
+ name = pName;
+ }
+
+ @Override
+ public String getSlotType() throws JAXRException {
+ return slotType;
+ }
+
+ @Override
+ public void setSlotType(String pSlotType) throws JAXRException {
+ slotType = pSlotType;
+ }
+
+ @Override
+ public Collection<?> getValues() throws JAXRException {
+ return values;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void setValues(Collection pValues) throws JAXRException {
+ values = pValues;
+ }
+}
Added: labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/infomodel/SpecificationLinkImpl.java
URL: http://svn.apache.org/viewvc/labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/infomodel/SpecificationLinkImpl.java?rev=680187&view=auto
==============================================================================
--- labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/infomodel/SpecificationLinkImpl.java (added)
+++ labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/infomodel/SpecificationLinkImpl.java Sun Jul 27 14:13:00 2008
@@ -0,0 +1,89 @@
+/**
+ * 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.labs.jaxmas.registry.infomodel;
+
+import java.util.Collection;
+
+import javax.xml.registry.JAXRException;
+import javax.xml.registry.infomodel.InternationalString;
+import javax.xml.registry.infomodel.Key;
+import javax.xml.registry.infomodel.RegistryObject;
+import javax.xml.registry.infomodel.ServiceBinding;
+import javax.xml.registry.infomodel.SpecificationLink;
+
+import org.apache.labs.jaxmas.registry.accessor.ROAccessor;
+import org.apache.labs.jaxmas.registry.accessor.SpecificationLinkAccessor;
+
+
+/**
+ * Implementtion of {@link SpecificationLink}.
+ */
+public class SpecificationLinkImpl extends RegistryObjectImpl<SpecificationLink> implements SpecificationLink {
+ /**
+ * Creates a new instance with the given registry service and key.
+ */
+ public SpecificationLinkImpl(RegistryServiceImpl pRegistryService, Key pKey) {
+ super(pRegistryService, pKey);
+ }
+
+ @Override
+ public ROAccessor<SpecificationLink> getROLoader() {
+ return SpecificationLinkAccessor.getInstance();
+ }
+
+ @Override
+ public ServiceBinding getServiceBinding() throws JAXRException {
+ throw new JAXRException(NLSStrings.OPERATION_NOT_IMPLEMENTED);
+ }
+
+ @Override
+ public RegistryObject getSpecificationObject() throws JAXRException {
+ throw new JAXRException(NLSStrings.OPERATION_NOT_IMPLEMENTED);
+ }
+
+ @Override
+ public InternationalString getUsageDescription() throws JAXRException {
+ throw new JAXRException(NLSStrings.OPERATION_NOT_IMPLEMENTED);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public Collection getUsageParameters() throws JAXRException {
+ throw new JAXRException(NLSStrings.OPERATION_NOT_IMPLEMENTED);
+ }
+
+ @Override
+ public void setSpecificationObject(RegistryObject pObj)
+ throws JAXRException {
+ throw new JAXRException(NLSStrings.OPERATION_NOT_IMPLEMENTED);
+ }
+
+ @Override
+ public void setUsageDescription(InternationalString pUsageDescription)
+ throws JAXRException {
+ throw new JAXRException(NLSStrings.OPERATION_NOT_IMPLEMENTED);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void setUsageParameters(Collection pUsageParameters)
+ throws JAXRException {
+ throw new JAXRException(NLSStrings.OPERATION_NOT_IMPLEMENTED);
+ }
+}
Added: labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/infomodel/TelephoneNumberImpl.java
URL: http://svn.apache.org/viewvc/labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/infomodel/TelephoneNumberImpl.java?rev=680187&view=auto
==============================================================================
--- labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/infomodel/TelephoneNumberImpl.java (added)
+++ labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/infomodel/TelephoneNumberImpl.java Sun Jul 27 14:13:00 2008
@@ -0,0 +1,90 @@
+/**
+ * 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.labs.jaxmas.registry.infomodel;
+
+import javax.xml.registry.JAXRException;
+import javax.xml.registry.infomodel.TelephoneNumber;
+
+
+/**
+ * Default implementation of {@link TelephoneNumber}.
+ */
+public class TelephoneNumberImpl implements TelephoneNumber {
+ private String areaCode, countryCode, extension, number, type, url;
+
+ @Override
+ public String getAreaCode() throws JAXRException {
+ return areaCode;
+ }
+
+ @Override
+ public String getCountryCode() throws JAXRException {
+ return countryCode;
+ }
+
+ @Override
+ public String getExtension() throws JAXRException {
+ return extension;
+ }
+
+ @Override
+ public String getNumber() throws JAXRException {
+ return number;
+ }
+
+ @Override
+ public String getType() throws JAXRException {
+ return type;
+ }
+
+ @Override
+ public String getUrl() throws JAXRException {
+ return url;
+ }
+
+ @Override
+ public void setAreaCode(String pAreaCode) throws JAXRException {
+ areaCode = pAreaCode;
+ }
+
+ @Override
+ public void setCountryCode(String pCountryCode) throws JAXRException {
+ countryCode = pCountryCode;
+ }
+
+ @Override
+ public void setExtension(String pExtension) throws JAXRException {
+ extension = pExtension;
+ }
+
+ @Override
+ public void setNumber(String pNumber) throws JAXRException {
+ number = pNumber;
+ }
+
+ @Override
+ public void setType(String pType) throws JAXRException {
+ type = pType;
+ }
+
+ @Override
+ public void setUrl(String pUrl) throws JAXRException {
+ url = pUrl;
+ }
+}
Added: labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/infomodel/UserImpl.java
URL: http://svn.apache.org/viewvc/labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/infomodel/UserImpl.java?rev=680187&view=auto
==============================================================================
--- labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/infomodel/UserImpl.java (added)
+++ labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/infomodel/UserImpl.java Sun Jul 27 14:13:00 2008
@@ -0,0 +1,144 @@
+/**
+ * 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.labs.jaxmas.registry.infomodel;
+
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+
+import javax.xml.registry.JAXRException;
+import javax.xml.registry.infomodel.EmailAddress;
+import javax.xml.registry.infomodel.Key;
+import javax.xml.registry.infomodel.Organization;
+import javax.xml.registry.infomodel.PersonName;
+import javax.xml.registry.infomodel.PostalAddress;
+import javax.xml.registry.infomodel.TelephoneNumber;
+import javax.xml.registry.infomodel.User;
+
+import org.apache.labs.jaxmas.registry.accessor.ROAccessor;
+import org.apache.labs.jaxmas.registry.accessor.UserAccessor;
+
+
+/**
+ * Default implementation of {@link User}.
+ */
+public class UserImpl extends RegistryObjectImpl<User> implements User {
+ private URL url;
+ private String type;
+ private Organization organization;
+ private PersonName personName;
+ private Collection<EmailAddress> emailAddresses = new ArrayList<EmailAddress>();
+ private Collection<PostalAddress> postalAddresses = new ArrayList<PostalAddress>();
+ private Collection<TelephoneNumber> telephoneNumbers = new ArrayList<TelephoneNumber>();
+
+ /**
+ * Creates a new instance.
+ */
+ public UserImpl(RegistryServiceImpl pRegistryService, Key pKey) {
+ super(pRegistryService, pKey);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public Collection getEmailAddresses() throws JAXRException {
+ return emailAddresses;
+ }
+
+ @Override
+ public Organization getOrganization() throws JAXRException {
+ return organization;
+ }
+
+ @Override
+ public PersonName getPersonName() throws JAXRException {
+ return personName;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public Collection getPostalAddresses() throws JAXRException {
+ return postalAddresses;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public Collection getTelephoneNumbers(String pPhoneType) throws JAXRException {
+ return telephoneNumbers;
+ }
+
+ @Override
+ public String getType() throws JAXRException {
+ return type;
+ }
+
+ @Override
+ public URL getUrl() throws JAXRException {
+ return url;
+ }
+
+ @SuppressWarnings({"unchecked", "cast"})
+ @Override
+ public void setEmailAddresses(Collection pAddresses) throws JAXRException {
+ if (pAddresses == null) {
+ emailAddresses.clear();
+ } else {
+ emailAddresses = (Collection<EmailAddress>) pAddresses;
+ }
+ }
+
+ @Override
+ public void setPersonName(PersonName pPersonName) throws JAXRException {
+ personName = pPersonName;
+ }
+
+ @SuppressWarnings({"unchecked", "cast"})
+ @Override
+ public void setPostalAddresses(Collection pAddresses) throws JAXRException {
+ if (pAddresses == null) {
+ postalAddresses.clear();
+ } else {
+ postalAddresses = (Collection<PostalAddress>) pAddresses;
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void setTelephoneNumbers(Collection pPhoneNumbers) throws JAXRException {
+ if (pPhoneNumbers == null) {
+ telephoneNumbers.clear();
+ } else {
+ telephoneNumbers = pPhoneNumbers;
+ }
+ }
+
+ @Override
+ public void setType(String pType) throws JAXRException {
+ type = pType;
+ }
+
+ @Override
+ public void setUrl(URL pUrl) throws JAXRException {
+ url = pUrl;
+ }
+
+ @Override
+ public ROAccessor<User> getROLoader() {
+ return UserAccessor.getInstance();
+ }
+}
Added: labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/schema/DbInitializer.java
URL: http://svn.apache.org/viewvc/labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/schema/DbInitializer.java?rev=680187&view=auto
==============================================================================
--- labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/schema/DbInitializer.java (added)
+++ labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/schema/DbInitializer.java Sun Jul 27 14:13:00 2008
@@ -0,0 +1,238 @@
+/**
+ * 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.labs.jaxmas.registry.schema;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.net.URL;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+
+import javax.xml.registry.JAXRException;
+import javax.xml.registry.RegistryService;
+
+import org.apache.labs.jaxmas.registry.infomodel.ConnectionImpl;
+import org.apache.labs.jaxmas.registry.infomodel.RegistryServiceImpl;
+import org.apache.labs.jaxmas.registry.sql.DbDriver;
+import org.apache.labs.jaxmas.registry.util.DefaultLoggerFactory;
+import org.apache.labs.jaxmas.registry.util.Logger;
+import org.apache.labs.jaxmas.registry.util.Strings;
+
+/**
+ * The database initializer is invoked at startup. It checks,
+ * whether the database structure is as expected and updates
+ * it, if required.
+ */
+public class DbInitializer {
+ private static final Logger log = DefaultLoggerFactory.getInstance().newLogger(DbInitializer.class);
+
+ private ConnectionImpl connection;
+
+ /**
+ * Creates a new instance, which uses the given connection to
+ * initialize the database.
+ */
+ public DbInitializer(ConnectionImpl pConnection) {
+ connection = pConnection;
+ }
+
+ /**
+ * Returns the connection.
+ */
+ protected ConnectionImpl getConnection() {
+ return connection;
+ }
+
+ /**
+ * Returns the registry service.
+ */
+ protected RegistryService getRegistryService() throws JAXRException {
+ return connection.getRegistryService();
+ }
+
+ /**
+ * Returns the database driver.
+ */
+ protected DbDriver getDbDriver() throws JAXRException {
+ return ((RegistryServiceImpl) getRegistryService()).getDbDriver();
+ }
+
+ /**
+ * Returns, whether the character sequence contains a string, which
+ * ends with the character ';'. Terminating white space is ignored.
+ */
+ private boolean endsWithSemicolon(CharSequence pCharSequence) {
+ for (int i = pCharSequence.length()-1; i >= 0; i--) {
+ char c = pCharSequence.charAt(i);
+ if (!Character.isWhitespace(c)) {
+ return c == ';';
+ }
+ }
+ return false; // Only white space found
+ }
+
+ private String replaceProperties(String pCommand) throws JAXRException {
+ String command = pCommand;
+ for (;;) {
+ int offset = command.indexOf("${"); //$NON-NLS-1$
+ if (offset == -1) {
+ return command;
+ }
+ int end = command.indexOf('}', offset+2);
+ if (offset == -1) {
+ throw new IllegalStateException("Failed to parse command: " + command); //$NON-NLS-1$
+ }
+ final String property = command.substring(offset+2, end);
+ command = command.substring(0, offset) + getDbDriver().getDbProperty(property) + command.substring(end+1);
+ }
+ }
+
+ /**
+ * Runs a single SQL command.
+ */
+ protected void sql(Connection pConnection, String pCommand) throws SQLException, JAXRException {
+ final String mName = "sql"; //$NON-NLS-1$
+ if (Strings.isTrimmedEmpty(pCommand)) {
+ return;
+ }
+ final String command = replaceProperties(pCommand);
+ final int offset = command.lastIndexOf(';');
+ final String cmd = command.substring(0, offset);
+ log.debug(mName, cmd);
+ PreparedStatement stmt = null;
+ try {
+ stmt = pConnection.prepareStatement(cmd);
+ stmt.executeUpdate();
+ stmt.close();
+ stmt = null;
+ } catch (SQLException e) {
+ // Ignore "Table does not exist" messages in DROP TABLE statements.
+ if (RegistryServiceImpl.getDbDriver(connection.getRegistryService()).isUnknownTableError(e)) {
+ return;
+ }
+ throw e;
+ } finally {
+ if (stmt != null) { try { stmt.close(); } catch (Throwable t) { /* Ignore me */ } }
+ }
+ }
+
+ /**
+ * Updates the database by applying a schema update.
+ */
+ protected void initialize(Connection pConnection, BufferedReader pReader)
+ throws IOException, SQLException, JAXRException {
+ final StringBuilder sb = new StringBuilder();
+ for (;;) {
+ final String s = pReader.readLine();
+ if (s == null) {
+ sql(pConnection, sb.toString());
+ return;
+ }
+ sb.append(s);
+ sb.append('\n');
+ if (endsWithSemicolon(sb)) {
+ sql(pConnection, sb.toString());
+ sb.setLength(0);
+ }
+ }
+ }
+
+ /**
+ * Updates the database by applying a schema update.
+ */
+ protected void initialize(SchemaUpdater pSchemaUpdater, URL pSchemaFile) throws JAXRException {
+ Connection conn = connection.getConnection();
+ InputStream stream = null;
+ Reader reader = null;
+ BufferedReader bReader = null;
+ try {
+ conn.setAutoCommit(false);
+ stream = pSchemaFile.openStream();
+ reader = new InputStreamReader(stream, "UTF-8"); //$NON-NLS-1$
+ bReader = new BufferedReader(reader);
+ if (pSchemaUpdater != null) {
+ pSchemaUpdater.beforeUpdate(conn, connection.getRegistryService());
+ }
+ initialize(conn, bReader);
+ if (pSchemaUpdater != null) {
+ pSchemaUpdater.afterUpdate(conn, connection.getRegistryService());
+ }
+ bReader.close();
+ bReader = null;
+ reader.close();
+ reader = null;
+ stream.close();
+ stream = null;
+ conn.commit();
+ conn = null;
+ } catch (IOException e) {
+ throw new JAXRException(e);
+ } catch (SQLException e) {
+ throw new JAXRException(e);
+ } finally {
+ if (bReader != null) { try { bReader.close(); } catch (Throwable t) { /* Ignore me */ } }
+ if (reader != null) { try { reader.close(); } catch (Throwable t) { /* Ignore me */ } }
+ if (stream != null) { try { stream.close(); } catch (Throwable t) { /* Ignore me */ } }
+ if (conn != null) { try { conn.rollback(); } catch (Throwable t) { /* Ignore me */ } }
+ }
+ }
+
+ private String getSchemaUpdaterClassName(int pNum) {
+ final String className = getClass().getName();
+ int offset = className.lastIndexOf('.');
+ if (offset == -1) {
+ throw new IllegalStateException("Failed to parse package name: " + className); //$NON-NLS-1$
+ }
+ return className.substring(0, offset) + ".SchemaUpdater" + pNum; //$NON-NLS-1$
+ }
+
+ private SchemaUpdater getSchemaUpdater(int pNum) throws JAXRException {
+ final Class<?> cl;
+ try {
+ cl = Class.forName(getSchemaUpdaterClassName(pNum+1));
+ } catch (ClassNotFoundException e) {
+ return null;
+ }
+ try {
+ return (SchemaUpdater) cl.newInstance();
+ } catch (InstantiationException e) {
+ throw new JAXRException(e);
+ } catch (IllegalAccessException e) {
+ throw new JAXRException(e);
+ }
+ }
+
+ /**
+ * Initializes the database schema.
+ */
+ public void initialize() throws JAXRException {
+ int schemaVersion = getDbDriver().getSchemaVersion();
+ for (int i = schemaVersion; ; i++) {
+ final URL url = getClass().getResource("schema-update." + (i+1) + ".sql"); //$NON-NLS-1$ //$NON-NLS-2$
+ if (url == null) {
+ break;
+ }
+ initialize(getSchemaUpdater(i), url);
+ }
+ }
+}
Added: labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/schema/SchemaUpdater.java
URL: http://svn.apache.org/viewvc/labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/schema/SchemaUpdater.java?rev=680187&view=auto
==============================================================================
--- labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/schema/SchemaUpdater.java (added)
+++ labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/schema/SchemaUpdater.java Sun Jul 27 14:13:00 2008
@@ -0,0 +1,49 @@
+/**
+ * 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.labs.jaxmas.registry.schema;
+
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.SQLException;
+
+import javax.xml.registry.JAXRException;
+import javax.xml.registry.RegistryService;
+
+
+/**
+ * Interface of a schema updater. A schema updater is a an object, which
+ * is invoked before and/or after schema updates.
+ */
+public interface SchemaUpdater {
+ /**
+ * Called before a schema update is applied.
+ * @param pConnection The database connection to use for the schema
+ * update. {@link Connection#setAutoCommit(boolean) AutoCommit} has been turned off
+ * for the connection.
+ */
+ void beforeUpdate(Connection pConnection, RegistryService pRegistryService) throws JAXRException, SQLException, IOException;
+
+ /**
+ * Called after a schema update has been applied.
+ * @param pConnection The database connection to use for the schema
+ * update. {@link Connection#setAutoCommit(boolean) AutoCommit} has been turned off
+ * for the connection.
+ */
+ void afterUpdate(Connection pConnection, RegistryService pRegistryService) throws JAXRException, SQLException, IOException;
+}
Added: labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/schema/SchemaUpdater1.java
URL: http://svn.apache.org/viewvc/labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/schema/SchemaUpdater1.java?rev=680187&view=auto
==============================================================================
--- labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/schema/SchemaUpdater1.java (added)
+++ labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/schema/SchemaUpdater1.java Sun Jul 27 14:13:00 2008
@@ -0,0 +1,75 @@
+/**
+ * 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.labs.jaxmas.registry.schema;
+
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+
+import javax.xml.registry.BusinessLifeCycleManager;
+import javax.xml.registry.JAXRException;
+import javax.xml.registry.RegistryService;
+import javax.xml.registry.infomodel.ClassificationScheme;
+import javax.xml.registry.infomodel.InternationalString;
+
+
+/**
+ * This schema updater creates the default classification schemes
+ * and association types.
+ */
+public class SchemaUpdater1 implements SchemaUpdater {
+ @Override
+ public void beforeUpdate(Connection pConnection, RegistryService pRegistryService) throws JAXRException, SQLException, IOException {
+ // Nothing to do, the schema is still to be created.
+ }
+
+ @Override
+ public void afterUpdate(Connection pConnection, RegistryService pRegistryService) throws JAXRException, SQLException, IOException {
+ final List<ClassificationScheme> clSchemes = new ArrayList<ClassificationScheme>();
+ pRegistryService.getBusinessLifeCycleManager().saveClassificationSchemes(clSchemes);
+ }
+
+ /**
+ * Creates an international string with the given value for the default locale and the
+ * US locale.
+ */
+ protected InternationalString createInternationalString(RegistryService pRegistryService,
+ String pValue) throws JAXRException {
+ final BusinessLifeCycleManager blcm = pRegistryService.getBusinessLifeCycleManager();
+ final InternationalString is = blcm.createInternationalString(pValue);
+ is.addLocalizedString(blcm.createLocalizedString(Locale.ENGLISH, pValue));
+ if (!Locale.getDefault().equals(Locale.ENGLISH)) {
+ is.addLocalizedString(blcm.createLocalizedString(Locale.getDefault(), pValue));
+ }
+ return is;
+ }
+
+ /**
+ * Creates a new classification scheme with the given name and description.
+ */
+ protected ClassificationScheme createClassificationScheme(RegistryService pRegistryService,
+ String pName, String pDescription) throws JAXRException {
+ final InternationalString name = createInternationalString(pRegistryService, pName);
+ final InternationalString descr = createInternationalString(pRegistryService, pDescription);
+ return pRegistryService.getBusinessLifeCycleManager().createClassificationScheme(name, descr);
+ }
+}
Added: labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/schema/schema-update.1.sql
URL: http://svn.apache.org/viewvc/labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/schema/schema-update.1.sql?rev=680187&view=auto
==============================================================================
--- labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/schema/schema-update.1.sql (added)
+++ labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/schema/schema-update.1.sql Sun Jul 27 14:13:00 2008
@@ -0,0 +1,237 @@
+--
+-- 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.
+--
+
+DROP TABLE DbInfo;
+CREATE TABLE DbInfo (
+ version INT NOT NULL
+);
+
+
+DROP TABLE RegistryObjects;
+CREATE TABLE RegistryObjects (
+ roKey VARCHAR(32) NOT NULL PRIMARY KEY,
+ roOwner VARCHAR(32),
+ pos INT,
+ roType INT NOT NULL,
+ CONSTRAINT FK_RegistryObjects_Owner FOREIGN KEY (roOwner) REFERENCES RegistryObjects ON DELETE CASCADE
+);
+
+DROP TABLE LocalizedStrings;
+CREATE TABLE LocalizedStrings (
+ roKey VARCHAR(32) NOT NULL,
+ lsType INT NOT NULL,
+ locale VARCHAR(32) NOT NULL,
+ charset VARCHAR(32) NOT NULL,
+ val ${CLOB} NOT NULL,
+ CONSTRAINT FK_LocalizedStrings_RO FOREIGN KEY (roKey) REFERENCES RegistryObjects ON DELETE CASCADE
+);
+CREATE INDEX LocalizedStrings_roKey_locale ON LocalizedStrings (roKey, locale);
+
+DROP TABLE RegistryEntries;
+CREATE TABLE RegistryEntries (
+ roKey VARCHAR(32) NOT NULL PRIMARY KEY,
+ expiration TIMESTAMP,
+ status INT NOT NULL,
+ stability INT NOT NULL,
+ majorVersion INT NOT NULL,
+ minorVersion INT NOT NULL,
+ userVersion VARCHAR(255),
+ CONSTRAINT FK_RegistryEntries_RO FOREIGN KEY (roKey) REFERENCES RegistryObjects ON DELETE CASCADE
+);
+
+DROP TABLE RegistryObjectSlots;
+CREATE TABLE RegistryObjectSlots (
+ id BIGINT NOT NULL PRIMARY KEY,
+ roKey VARCHAR(32) NOT NULL,
+ name ${CLOB} NOT NULL,
+ slotType ${CLOB},
+ CONSTRAINT FK_RegistryObjectSlots_RO FOREIGN KEY (roKey) REFERENCES RegistryObjects ON DELETE CASCADE
+);
+
+DROP TABLE RegistryObjectSlotValues;
+CREATE TABLE RegistryObjectSlotValues (
+ id BIGINT NOT NULL,
+ val ${CLOB} NOT NULL,
+ CONSTRAINT FK_RegistryObjectSlotValues_Slot FOREIGN KEY (id) REFERENCES RegistryObjectSlots ON DELETE CASCADE
+);
+
+DROP TABLE Ids;
+CREATE TABLE Ids (
+ name VARCHAR(32) NOT NULL PRIMARY KEY,
+ nextValue BIGINT NOT NULL
+);
+
+DROP TABLE Concepts;
+CREATE TABLE Concepts (
+ roKey VARCHAR(32) NOT NULL PRIMARY KEY,
+ value ${CLOB},
+ CONSTRAINT FK_Concepts_RO FOREIGN KEY (roKey) REFERENCES RegistryObjects ON DELETE CASCADE
+);
+
+DROP TABLE Associations;
+CREATE TABLE Associations (
+ roKey VARCHAR(32) NOT NULL PRIMARY KEY,
+ roKeyTarget VARCHAR(32) NOT NULL,
+ roKeyType VARCHAR(32) NOT NULL,
+ CONSTRAINT FK_Associations_RO FOREIGN KEY (roKey) REFERENCES RegistryObjects ON DELETE CASCADE,
+ CONSTRAINT FK_Associations_Target FOREIGN KEY (roKeyTarget) REFERENCES RegistryObjects ON DELETE RESTRICT
+);
+
+DROP TABLE Classifications;
+CREATE TABLE Classifications (
+ roKey VARCHAR(32) NOT NULL PRIMARY KEY,
+ roKeyConcept VARCHAR(32) NOT NULL,
+ CONSTRAINT FK_Classifications_RO FOREIGN KEY (roKey) REFERENCES RegistryObjects ON DELETE CASCADE,
+ CONSTRAINT FK_Classifications_Concept FOREIGN KEY (roKeyConcept) REFERENCES RegistryObjects ON DELETE RESTRICT
+);
+
+INSERT INTO Ids (name, nextValue) VALUES ('keys', 8000);
+INSERT INTO Ids (name, nextValue) VALUES ('Slots', 0);
+
+INSERT INTO RegistryObjects (roKey, roOwner, pos, roType) VALUES ('00000000000000000000000000000001', null, 0, 0);
+INSERT INTO RegistryEntries (roKey, expiration, status, stability, majorVersion, minorVersion, userVersion) VALUES ('00000000000000000000000000000001', null, 0, 0, 1, 0, '1.0');
+INSERT INTO LocalizedStrings (roKey, lsType, locale, charset, val) VALUES ('00000000000000000000000000000001', 0, 'en', 'UTF-8', 'ObjectType');
+INSERT INTO LocalizedStrings (roKey, lsType, locale, charset, val) VALUES ('00000000000000000000000000000001', 1, 'en', 'UTF-8', 'The taxonomy of object types. Object types are categories below this taxonomy.');
+
+INSERT INTO RegistryObjects (roKey, roOwner, pos, roType) VALUES ('00000000000000000000000000000002', null, 0, 0);
+INSERT INTO RegistryEntries (roKey, expiration, status, stability, majorVersion, minorVersion, userVersion) VALUES ('00000000000000000000000000000002', null, 0, 0, 1, 0, '1.0');
+INSERT INTO LocalizedStrings (roKey, lsType, locale, charset, val) VALUES ('00000000000000000000000000000002', 0, 'en', 'UTF-8', 'AssociationType');
+INSERT INTO LocalizedStrings (roKey, lsType, locale, charset, val) VALUES ('00000000000000000000000000000002', 1, 'en', 'UTF-8', 'The taxonomy of association types. Association types are categories below this taxonomy.');
+
+INSERT INTO RegistryObjects (roKey, roOwner, pos, roType) VALUES ('00000000000000000000000000000003', '00000000000000000000000000000001', 0, 1);
+INSERT INTO Concepts (roKey, value) VALUES ('00000000000000000000000000000003', 'Association');
+INSERT INTO LocalizedStrings (roKey, lsType, locale, charset, val) VALUES ('00000000000000000000000000000003', 0, 'en', 'UTF-8', 'Association');
+
+INSERT INTO RegistryObjects (roKey, roOwner, pos, roType) VALUES ('00000000000000000000000000000004', '00000000000000000000000000000001', 0, 1);
+INSERT INTO Concepts (roKey, value) VALUES ('00000000000000000000000000000004', 'AuditableEvent');
+INSERT INTO LocalizedStrings (roKey, lsType, locale, charset, val) VALUES ('00000000000000000000000000000004', 0, 'en', 'UTF-8', 'AuditableEvent');
+
+INSERT INTO RegistryObjects (roKey, roOwner, pos, roType) VALUES ('00000000000000000000000000000005', '00000000000000000000000000000001', 0, 1);
+INSERT INTO Concepts (roKey, value) VALUES ('00000000000000000000000000000005', 'Classification');
+INSERT INTO LocalizedStrings (roKey, lsType, locale, charset, val) VALUES ('00000000000000000000000000000005', 0, 'en', 'UTF-8', 'Classification');
+
+INSERT INTO RegistryObjects (roKey, roOwner, pos, roType) VALUES ('00000000000000000000000000000006', '00000000000000000000000000000001', 0, 1);
+INSERT INTO Concepts (roKey, value) VALUES ('00000000000000000000000000000006', 'ExternalIdentifier');
+INSERT INTO LocalizedStrings (roKey, lsType, locale, charset, val) VALUES ('00000000000000000000000000000006', 0, 'en', 'UTF-8', 'ExternalIdentifier');
+
+INSERT INTO RegistryObjects (roKey, roOwner, pos, roType) VALUES ('00000000000000000000000000000007', '00000000000000000000000000000001', 0, 1);
+INSERT INTO Concepts (roKey, value) VALUES ('00000000000000000000000000000007', 'ExternalLink');
+INSERT INTO LocalizedStrings (roKey, lsType, locale, charset, val) VALUES ('00000000000000000000000000000007', 0, 'en', 'UTF-8', 'ExternalLink');
+
+INSERT INTO RegistryObjects (roKey, roOwner, pos, roType) VALUES ('00000000000000000000000000000008', '00000000000000000000000000000001', 0, 1);
+INSERT INTO Concepts (roKey, value) VALUES ('00000000000000000000000000000008', 'Package');
+INSERT INTO LocalizedStrings (roKey, lsType, locale, charset, val) VALUES ('00000000000000000000000000000008', 0, 'en', 'UTF-8', 'Package');
+
+INSERT INTO RegistryObjects (roKey, roOwner, pos, roType) VALUES ('00000000000000000000000000000009', '00000000000000000000000000000001', 0, 1);
+INSERT INTO Concepts (roKey, value) VALUES ('00000000000000000000000000000009', 'RegistryEntry');
+INSERT INTO LocalizedStrings (roKey, lsType, locale, charset, val) VALUES ('00000000000000000000000000000009', 0, 'en', 'UTF-8', 'RegistryEntry');
+
+INSERT INTO RegistryObjects (roKey, roOwner, pos, roType) VALUES ('00000000000000000000000000000010', '00000000000000000000000000000001', 0, 1);
+INSERT INTO Concepts (roKey, value) VALUES ('00000000000000000000000000000010', 'Service');
+INSERT INTO LocalizedStrings (roKey, lsType, locale, charset, val) VALUES ('00000000000000000000000000000010', 0, 'en', 'UTF-8', 'Service');
+
+INSERT INTO RegistryObjects (roKey, roOwner, pos, roType) VALUES ('00000000000000000000000000000011', '00000000000000000000000000000001', 0, 1);
+INSERT INTO Concepts (roKey, value) VALUES ('00000000000000000000000000000011', 'Taxonomy');
+INSERT INTO LocalizedStrings (roKey, lsType, locale, charset, val) VALUES ('00000000000000000000000000000011', 0, 'en', 'UTF-8', 'Taxonomy');
+
+INSERT INTO RegistryObjects (roKey, roOwner, pos, roType) VALUES ('00000000000000000000000000000012', '00000000000000000000000000000001', 0, 1);
+INSERT INTO Concepts (roKey, value) VALUES ('00000000000000000000000000000012', 'User');
+INSERT INTO LocalizedStrings (roKey, lsType, locale, charset, val) VALUES ('00000000000000000000000000000012', 0, 'en', 'UTF-8', 'User');
+
+INSERT INTO RegistryObjects (roKey, roOwner, pos, roType) VALUES ('00000000000000000000000000000013', '00000000000000000000000000000001', 0, 1);
+INSERT INTO Concepts (roKey, value) VALUES ('00000000000000000000000000000013', 'WSDL');
+INSERT INTO LocalizedStrings (roKey, lsType, locale, charset, val) VALUES ('00000000000000000000000000000013', 0, 'en', 'UTF-8', 'WSDL');
+
+INSERT INTO RegistryObjects (roKey, roOwner, pos, roType) VALUES ('00000000000000000000000000000014', '00000000000000000000000000000001', 0, 1);
+INSERT INTO Concepts (roKey, value) VALUES ('00000000000000000000000000000014', 'WSPolicy');
+INSERT INTO LocalizedStrings (roKey, lsType, locale, charset, val) VALUES ('00000000000000000000000000000014', 0, 'en', 'UTF-8', 'WSPolicy');
+
+INSERT INTO RegistryObjects (roKey, roOwner, pos, roType) VALUES ('00000000000000000000000000000015', '00000000000000000000000000000001', 0, 1);
+INSERT INTO Concepts (roKey, value) VALUES ('00000000000000000000000000000015', 'Organization');
+INSERT INTO LocalizedStrings (roKey, lsType, locale, charset, val) VALUES ('00000000000000000000000000000015', 0, 'en', 'UTF-8', 'Organization');
+
+INSERT INTO RegistryObjects (roKey, roOwner, pos, roType) VALUES ('00000000000000000000000000000016', '00000000000000000000000000000001', 0, 1);
+INSERT INTO Concepts (roKey, value) VALUES ('00000000000000000000000000000016', 'Category');
+INSERT INTO LocalizedStrings (roKey, lsType, locale, charset, val) VALUES ('00000000000000000000000000000016', 0, 'en', 'UTF-8', 'Category');
+
+INSERT INTO RegistryObjects (roKey, roOwner, pos, roType) VALUES ('00000000000000000000000000000017', '00000000000000000000000000000002', 0, 1);
+INSERT INTO Concepts (roKey, value) VALUES ('00000000000000000000000000000017', 'BelongsTo');
+INSERT INTO LocalizedStrings (roKey, lsType, locale, charset, val) VALUES ('00000000000000000000000000000017', 0, 'en', 'UTF-8', 'BelongsTo');
+
+INSERT INTO RegistryObjects (roKey, roOwner, pos, roType) VALUES ('00000000000000000000000000000018', '00000000000000000000000000000002', 0, 1);
+INSERT INTO Concepts (roKey, value) VALUES ('00000000000000000000000000000018', 'Contains');
+INSERT INTO LocalizedStrings (roKey, lsType, locale, charset, val) VALUES ('00000000000000000000000000000018', 0, 'en', 'UTF-8', 'Contains');
+
+INSERT INTO RegistryObjects (roKey, roOwner, pos, roType) VALUES ('00000000000000000000000000000019', '00000000000000000000000000000002', 0, 1);
+INSERT INTO Concepts (roKey, value) VALUES ('00000000000000000000000000000019', 'EquivalentTo');
+INSERT INTO LocalizedStrings (roKey, lsType, locale, charset, val) VALUES ('00000000000000000000000000000019', 0, 'en', 'UTF-8', 'EquivalentTo');
+
+INSERT INTO RegistryObjects (roKey, roOwner, pos, roType) VALUES ('00000000000000000000000000000020', '00000000000000000000000000000002', 0, 1);
+INSERT INTO Concepts (roKey, value) VALUES ('00000000000000000000000000000020', 'Extends');
+INSERT INTO LocalizedStrings (roKey, lsType, locale, charset, val) VALUES ('00000000000000000000000000000020', 0, 'en', 'UTF-8', 'Extends');
+
+INSERT INTO RegistryObjects (roKey, roOwner, pos, roType) VALUES ('00000000000000000000000000000021', '00000000000000000000000000000002', 0, 1);
+INSERT INTO Concepts (roKey, value) VALUES ('00000000000000000000000000000021', 'HasChild');
+INSERT INTO LocalizedStrings (roKey, lsType, locale, charset, val) VALUES ('00000000000000000000000000000021', 0, 'en', 'UTF-8', 'HasChild');
+
+INSERT INTO RegistryObjects (roKey, roOwner, pos, roType) VALUES ('00000000000000000000000000000022', '00000000000000000000000000000002', 0, 1);
+INSERT INTO Concepts (roKey, value) VALUES ('00000000000000000000000000000022', 'HasParent');
+INSERT INTO LocalizedStrings (roKey, lsType, locale, charset, val) VALUES ('00000000000000000000000000000022', 0, 'en', 'UTF-8', 'HasParent');
+
+INSERT INTO RegistryObjects (roKey, roOwner, pos, roType) VALUES ('00000000000000000000000000000023', '00000000000000000000000000000002', 0, 1);
+INSERT INTO Concepts (roKey, value) VALUES ('00000000000000000000000000000023', 'Implements');
+INSERT INTO LocalizedStrings (roKey, lsType, locale, charset, val) VALUES ('00000000000000000000000000000023', 0, 'en', 'UTF-8', 'Implements');
+
+INSERT INTO RegistryObjects (roKey, roOwner, pos, roType) VALUES ('00000000000000000000000000000024', '00000000000000000000000000000002', 0, 1);
+INSERT INTO Concepts (roKey, value) VALUES ('00000000000000000000000000000024', 'InstanceOf');
+INSERT INTO LocalizedStrings (roKey, lsType, locale, charset, val) VALUES ('00000000000000000000000000000024', 0, 'en', 'UTF-8', 'InstanceOf');
+
+INSERT INTO RegistryObjects (roKey, roOwner, pos, roType) VALUES ('00000000000000000000000000000025', '00000000000000000000000000000002', 0, 1);
+INSERT INTO Concepts (roKey, value) VALUES ('00000000000000000000000000000025', 'IsCompositionOf');
+INSERT INTO LocalizedStrings (roKey, lsType, locale, charset, val) VALUES ('00000000000000000000000000000025', 0, 'en', 'UTF-8', 'IsCompositionOf');
+
+INSERT INTO RegistryObjects (roKey, roOwner, pos, roType) VALUES ('00000000000000000000000000000026', '00000000000000000000000000000002', 0, 1);
+INSERT INTO Concepts (roKey, value) VALUES ('00000000000000000000000000000026', 'Replaces');
+INSERT INTO LocalizedStrings (roKey, lsType, locale, charset, val) VALUES ('00000000000000000000000000000026', 0, 'en', 'UTF-8', 'Replaces');
+
+INSERT INTO RegistryObjects (roKey, roOwner, pos, roType) VALUES ('00000000000000000000000000000027', '00000000000000000000000000000002', 0, 1);
+INSERT INTO Concepts (roKey, value) VALUES ('00000000000000000000000000000027', 'RelatedTo');
+INSERT INTO LocalizedStrings (roKey, lsType, locale, charset, val) VALUES ('00000000000000000000000000000027', 0, 'en', 'UTF-8', 'RelatedTo');
+
+INSERT INTO RegistryObjects (roKey, roOwner, pos, roType) VALUES ('00000000000000000000000000000028', '00000000000000000000000000000002', 0, 1);
+INSERT INTO Concepts (roKey, value) VALUES ('00000000000000000000000000000028', 'Supersedes');
+INSERT INTO LocalizedStrings (roKey, lsType, locale, charset, val) VALUES ('00000000000000000000000000000028', 0, 'en', 'UTF-8', 'Supersedes');
+
+INSERT INTO RegistryObjects (roKey, roOwner, pos, roType) VALUES ('00000000000000000000000000000029', '00000000000000000000000000000001', 0, 1);
+INSERT INTO Concepts (roKey, value) VALUES ('00000000000000000000000000000029', 'ServiceBinding');
+INSERT INTO LocalizedStrings (roKey, lsType, locale, charset, val) VALUES ('00000000000000000000000000000029', 0, 'en', 'UTF-8', 'ServiceBinding');
+
+INSERT INTO RegistryObjects (roKey, roOwner, pos, roType) VALUES ('00000000000000000000000000000030', '00000000000000000000000000000001', 0, 1);
+INSERT INTO Concepts (roKey, value) VALUES ('00000000000000000000000000000030', 'SpecificationLink');
+INSERT INTO LocalizedStrings (roKey, lsType, locale, charset, val) VALUES ('00000000000000000000000000000030', 0, 'en', 'UTF-8', 'SpecificationLink');
+
+INSERT INTO RegistryObjects (roKey, roOwner, pos, roType) VALUES ('00000000000000000000000000000031', '00000000000000000000000000000001', 0, 1);
+INSERT INTO Concepts (roKey, value) VALUES ('00000000000000000000000000000031', 'RegistryPackage');
+INSERT INTO LocalizedStrings (roKey, lsType, locale, charset, val) VALUES ('00000000000000000000000000000031', 0, 'en', 'UTF-8', 'RegistryPackage');
+
+INSERT INTO RegistryObjects (roKey, roOwner, pos, roType) VALUES ('00000000000000000000000000000032', '00000000000000000000000000000001', 0, 1);
+INSERT INTO Concepts (roKey, value) VALUES ('00000000000000000000000000000032', 'ExtrinsicObject');
+INSERT INTO LocalizedStrings (roKey, lsType, locale, charset, val) VALUES ('00000000000000000000000000000032', 0, 'en', 'UTF-8', 'ExtrinsicObject');
+
+INSERT INTO DbInfo (version) VALUES (1);
Added: labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/AbstractDbDriver.java
URL: http://svn.apache.org/viewvc/labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/AbstractDbDriver.java?rev=680187&view=auto
==============================================================================
--- labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/AbstractDbDriver.java (added)
+++ labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/AbstractDbDriver.java Sun Jul 27 14:13:00 2008
@@ -0,0 +1,460 @@
+/**
+ * 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.labs.jaxmas.registry.sql;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+
+import javax.xml.registry.JAXRException;
+import javax.xml.registry.RegistryService;
+import javax.xml.registry.infomodel.Association;
+import javax.xml.registry.infomodel.Classification;
+import javax.xml.registry.infomodel.Concept;
+import javax.xml.registry.infomodel.InternationalString;
+import javax.xml.registry.infomodel.Key;
+import javax.xml.registry.infomodel.LocalizedString;
+import javax.xml.registry.infomodel.RegistryEntry;
+import javax.xml.registry.infomodel.RegistryObject;
+import javax.xml.registry.infomodel.Slot;
+
+import org.apache.labs.jaxmas.registry.accessor.AssociationAccessor;
+import org.apache.labs.jaxmas.registry.accessor.ClassificationAccessor;
+import org.apache.labs.jaxmas.registry.infomodel.AssociationImpl;
+import org.apache.labs.jaxmas.registry.infomodel.ClassificationImpl;
+import org.apache.labs.jaxmas.registry.infomodel.ConceptImpl;
+import org.apache.labs.jaxmas.registry.infomodel.InternationalStringController;
+import org.apache.labs.jaxmas.registry.infomodel.InternationalStringImpl;
+import org.apache.labs.jaxmas.registry.infomodel.LocalizedStringImpl;
+import org.apache.labs.jaxmas.registry.infomodel.NLSStrings;
+import org.apache.labs.jaxmas.registry.infomodel.OwnedRegistryObject;
+import org.apache.labs.jaxmas.registry.infomodel.ROState;
+import org.apache.labs.jaxmas.registry.infomodel.RegistryEntryImpl;
+import org.apache.labs.jaxmas.registry.infomodel.RegistryObjectImpl;
+import org.apache.labs.jaxmas.registry.infomodel.RegistryServiceImpl;
+import org.apache.labs.jaxmas.registry.infomodel.SlotImpl;
+import org.apache.labs.jaxmas.registry.util.Locales;
+
+
+/**
+ * Default implementation of {@link DbDriver}.
+ */
+public abstract class AbstractDbDriver implements DbDriver {
+ private final RegistryService registryService;
+
+ /**
+ * Creates a new instance with the given registry service.
+ */
+ protected AbstractDbDriver(RegistryService pRegistryService) {
+ registryService = pRegistryService;
+ }
+
+ /**
+ * Returns the drivers registry service.
+ */
+ protected RegistryService getRegistryService() {
+ return registryService;
+ }
+
+ /**
+ * Called to perform the given prepared statement with the given parameters.
+ */
+ protected void run(String pStmt, Object... pParams) throws JAXRException {
+ Sql.run(getRegistryService(), pStmt, pParams);
+ }
+
+ /**
+ * Called to run the given {@link ConnUser}.
+ */
+ protected void run(ConnUser<?> pConnUser) throws JAXRException {
+ pConnUser.run(getRegistryService());
+ }
+
+ @Override
+ public long newId(String pName) throws JAXRException {
+ run("UPDATE ids SET nextValue = nextValue + 1 WHERE name = ?", pName); //$NON-NLS-1$
+ final QueryUser<Long> query = new QueryUser<Long>("SELECT nextValue FROM ids WHERE name = ?", pName){ //$NON-NLS-1$
+ @Override
+ protected void action(ResultSet pResultSet) throws JAXRException, SQLException {
+ boolean hasNext = pResultSet.next();
+ assert(hasNext);
+ final long l = pResultSet.getLong(1);
+ assert(!pResultSet.wasNull());
+ hasNext = pResultSet.next();
+ assert(!hasNext);
+ setResult(new Long(l));
+ if (pResultSet.next()) {
+ throw new JAXRException("Unexpected result row"); //$NON-NLS-1$
+ }
+ }
+ @Override
+ protected void action(Connection pConnection) throws JAXRException, SQLException {
+ super.action(pConnection);
+ }
+ };
+ query.run(getRegistryService());
+ return query.getResult().longValue();
+ }
+
+ @Override
+ public void deleteSlots(RegistryObject pRegistryObject) throws JAXRException {
+ // No need to delete anything, because the slots are deleted by ON DELETE CASCASE.
+ }
+
+ private void saveSlots(final RegistryObject pRegistryObject) throws JAXRException {
+ new ObjStmtUser("DELETE FROM RegistryObjectSlots WHERE roKey=?", pRegistryObject.getKey()){ //$NON-NLS-1$
+ @Override
+ protected void action(PreparedStatement pStatement) throws JAXRException, SQLException {
+ pStatement.executeUpdate();
+ final Collection<?> slots = pRegistryObject.getSlots();
+ if (slots != null && slots.size() > 0) {
+ final String q = "INSERT INTO RegistryObjectSlots (roKey, id, name, slotType) VALUES (?, ?, ?, ?)"; //$NON-NLS-1$
+ final String q2 = "INSERT INTO RegistryObjectSlotValues (id, val) VALUES (?, ?)"; //$NON-NLS-1$
+ PreparedStatement stmt = pStatement.getConnection().prepareStatement(q);
+ PreparedStatement stmt2 = null;
+ try {
+ stmt.setString(1, pRegistryObject.getKey().getId());
+ for (Object o : slots) {
+ final Slot slot = (Slot) o;
+ final long id = newId("Slots"); //$NON-NLS-1$
+ stmt.setLong(2, id);
+ stmt.setString(3, slot.getName());
+ stmt.setString(4, slot.getSlotType());
+ stmt.executeUpdate();
+ for (Object v : slot.getValues()) {
+ if (stmt2 == null) {
+ stmt2 = pStatement.getConnection().prepareStatement(q2);
+ }
+ stmt2.setLong(1, id);
+ stmt2.setString(2, v == null ? null : v.toString());
+ stmt2.executeUpdate();
+ }
+ }
+ if (stmt2 != null) {
+ stmt2.close();
+ stmt2 = null;
+ }
+ stmt.close();
+ stmt = null;
+ } finally {
+ if (stmt2 != null) { try { stmt2.close(); } catch (Throwable t) { /* Ignore me */ } }
+ if (stmt != null) { try { stmt.close(); } catch (Throwable t) { /* Ignore me */ } }
+ }
+ }
+ }
+ }.run(getRegistryService());
+ }
+
+ @SuppressWarnings("unchecked")
+ private static Collection<String> asStringCollection(Collection<?> pCollection) {
+ return (Collection<String>) pCollection;
+ }
+
+ @Override
+ public Map<String, Slot> getSlots(RegistryObject pRegistryObject) throws JAXRException {
+ final Map<Long,Slot> slots = new HashMap<Long,Slot>();
+
+ final String q1 = "SELECT id, name, slotType FROM RegistryObjectSlots WHERE roKey=?"; //$NON-NLS-1$
+ new ObjQueryUser(q1, pRegistryObject.getKey()){
+ @Override
+ protected void action(ResultSet pResultSet) throws JAXRException, SQLException {
+ while (pResultSet.next()) {
+ final Long id = new Long(pResultSet.getLong(1));
+ assert(!pResultSet.wasNull());
+ Slot slot = slots.get(id);
+ if (slot == null) {
+ slot = new SlotImpl();
+ slots.put(id, slot);
+ slot.setName(pResultSet.getString(2));
+ assert(slot.getName() != null);
+ slot.setSlotType(pResultSet.getString(3));
+ slot.setValues(new ArrayList<String>());
+ }
+ }
+ }
+ }.run(getRegistryService());
+
+ final String q2 = "SELECT ros.id, rosv.val FROM RegistryObjectSlots ros JOIN RegistryObjectSlotValues rosv ON ros.id=rosv.id WHERE ros.roKey=?"; //$NON-NLS-1$
+ new ObjQueryUser(q2, pRegistryObject.getKey()) {
+ @Override
+ protected void action(ResultSet pResultSet) throws JAXRException, SQLException {
+ while (pResultSet.next()) {
+ final Long id = new Long(pResultSet.getLong(1));
+ assert(!pResultSet.wasNull());
+ final Slot slot = slots.get(id);
+ assert(slot != null);
+ asStringCollection(slot.getValues()).add(pResultSet.getString(2));
+ }
+ }
+ }.run(getRegistryService());
+
+ final Map<String,Slot> result = new HashMap<String,Slot>();
+ for (Slot slot : slots.values()) {
+ result.put(slot.getName(), slot);
+ }
+ return result;
+ }
+
+ public void deleteInternationalString(Key pKey, InternationalStringImpl.Type pType) throws JAXRException {
+ run("DELETE FROM LocalizedStrings WHERE roKey=? AND lsType=?", pKey, pType); //$NON-NLS-1$
+ }
+
+ public void updateInternationalString(Key pKey, InternationalStringImpl.Type pType, final InternationalString pValue) throws JAXRException {
+ deleteInternationalString(pKey, pType);
+ insertInternationalString(pKey, pType, pValue);
+ }
+
+ public void insertInternationalString(final Key pKey, final InternationalStringImpl.Type pType,
+ final InternationalString pValue) throws JAXRException {
+ if (pValue != null) {
+ new ObjStmtUser("INSERT INTO LocalizedStrings (roKey, lsType, locale, charset, val) VALUES (?, ?, ?, ?, ?)"){ //$NON-NLS-1$
+ @Override
+ protected void action(PreparedStatement pStatement) throws JAXRException, SQLException {
+ pStatement.setString(1, pKey.getId());
+ pStatement.setInt(2, pType.ordinal());
+ for (Object o : pValue.getLocalizedStrings()) {
+ LocalizedString ls = (LocalizedString) o;
+ pStatement.setString(3, ls.getLocale().toString());
+ pStatement.setString(4, ls.getCharsetName());
+ pStatement.setString(5, ls.getValue());
+ pStatement.executeUpdate();
+ }
+ }
+ }.run(getRegistryService());
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ private static final Collection<Classification> asClassificationCollection(Collection<?> pCollection) {
+ return (Collection<Classification>) pCollection;
+ }
+
+ @SuppressWarnings("unchecked")
+ private static final Collection<Association> asAssociationCollection(Collection<?> pCollection) {
+ return (Collection<Association>) pCollection;
+ }
+
+ @Override
+ public void insert(RegistryObject pObject, int pRegistryObjectType)
+ throws JAXRException {
+ final RegistryObjectImpl<?> ro = (RegistryObjectImpl<?>) pObject;
+ assert(ro.getState() == ROState.created);
+ final Key key = pObject.getKey();
+ final Key owner;
+ final Integer pos;
+ if (ro instanceof OwnedRegistryObject) {
+ final OwnedRegistryObject<?> oro = (OwnedRegistryObject<?>) ro;
+ final RegistryObject roOwner = oro.getOwner();
+ owner = roOwner == null ? null : roOwner.getKey();
+ pos = Integer.valueOf(oro.getPosition());
+ } else {
+ owner = null;
+ pos = null;
+ }
+ final String s = "INSERT INTO RegistryObjects (roKey, roType, pos, roOwner) VALUES (?, ?, ?, ?)"; //$NON-NLS-1$
+ run(s, key, Integer.valueOf(pRegistryObjectType), pos, owner);
+
+ final InternationalStringController name = ro.getNameController();
+ name.save();
+ final InternationalStringController description = ro.getDescriptionController();
+ description.save();
+
+ if (pObject instanceof RegistryEntry) {
+ RegistryEntryImpl<?> re = (RegistryEntryImpl<?>) pObject;
+ run("INSERT INTO RegistryEntries (roKey, expiration, status, stability, majorVersion, minorVersion, userVersion) VALUES (?, ?, ?, ?, ?, ?, ?)", //$NON-NLS-1$
+ key, re.getExpiration(), new Integer(re.getStatus()), new Integer(re.getStability()),
+ new Integer(re.getMajorVersion()), new Integer(re.getMinorVersion()),
+ re.getUserVersion());
+ }
+
+ if (pObject instanceof Concept) {
+ final ConceptImpl concept = (ConceptImpl) pObject;
+ final String value = concept.getValue();
+ if (value == null) {
+ throw new JAXRException(RegistryServiceImpl.getNLSStrings(getRegistryService()).format(NLSStrings.CONCEPT_VALUE_MISSING));
+ }
+ run("INSERT INTO Concepts (roKey, value) VALUES (?, ?)", //$NON-NLS-1$
+ concept.getKey(), value);
+ }
+
+ if (pObject instanceof Classification) {
+ final ClassificationImpl cl = (ClassificationImpl) pObject;
+ final Concept concept = cl.getConcept();
+ assert(concept != null);
+ run("INSERT INTO Classifications (roKey, roKeyConcept) VALUES (?, ?)", //$NON-NLS-1$
+ cl.getKey(), concept.getKey());
+ }
+
+ if (pObject instanceof Association) {
+ final AssociationImpl assoc = (AssociationImpl) pObject;
+ final Concept assocType = assoc.getAssociationType();
+ assert(assocType != null);
+ final RegistryObject target = assoc.getTargetObject();
+ assert(target != null);
+ run("INSERT INTO Associations (roKey, roKeyType, roKeyTarget) VALUES (?, ?, ?)", //$NON-NLS-1$
+ assoc.getKey(), assocType.getKey(), target.getKey());
+ }
+
+ for (Classification cl : asClassificationCollection(ro.getClassifications())) {
+ ((ClassificationImpl) cl).getROLoader().save(getRegistryService(), cl);
+ }
+
+ for (Association assoc : asAssociationCollection(ro.getAssociations())) {
+ ((AssociationImpl) assoc).getROLoader().save(getRegistryService(), assoc);
+ }
+ }
+
+ @Override
+ public void update(RegistryObject pObject) throws JAXRException {
+ final RegistryObjectImpl<?> ro = (RegistryObjectImpl<?>) pObject;
+ final String key = pObject.getKey().getId();
+
+ final InternationalStringController name = ro.getNameController();
+ name.save();
+ final InternationalStringController description = ro.getDescriptionController();
+ description.save();
+
+ this.saveSlots(pObject);
+
+ if (pObject instanceof RegistryEntry) {
+ RegistryEntry re = (RegistryEntry) pObject;
+ run("UPDATE RegistryEntries SET expiration=?, status=?, stability=?, majorVersion=?, minorVersion=?, userVersion=? WHERE roKey=?", //$NON-NLS-1$
+ re.getExpiration(), new Integer(re.getStatus()), new Integer(re.getStability()),
+ new Integer(re.getMajorVersion()), new Integer(re.getMinorVersion()),
+ re.getUserVersion(), key);
+ }
+
+ if (pObject instanceof Concept) {
+ final ConceptImpl concept = (ConceptImpl) pObject;
+ switch (concept.getState()) {
+ case created:
+ throw new IllegalStateException("This object must be inserted, not updated."); //$NON-NLS-1$
+ case loaded:
+ final String value = concept.getValue();
+ if (value == null) {
+ throw new JAXRException(RegistryServiceImpl.getNLSStrings(getRegistryService()).format(NLSStrings.CONCEPT_VALUE_MISSING));
+ }
+ run("UPDATE Concepts SET value=? WHERE roKey=?", //$NON-NLS-1$
+ value, concept.getKey());
+ break;
+ case referenced:
+ // Nothing to do
+ break;
+ case deleted:
+ throw new IllegalStateException("A deleted object cannot be updated."); //$NON-NLS-1$
+ }
+ }
+
+ if (pObject instanceof Classification) {
+ final ClassificationImpl cl = (ClassificationImpl) pObject;
+ final Concept concept = cl.getConcept();
+ assert(concept != null);
+ run("UPDATE Classifications SET roKeyConcept=? WHERE roKey=?", //$NON-NLS-1$
+ concept.getKey(), cl.getKey());
+ }
+
+ if (pObject instanceof Association) {
+ final AssociationImpl assoc = (AssociationImpl) pObject;
+ final Concept assocType = assoc.getAssociationType();
+ assert(assocType != null);
+ final RegistryObject target = assoc.getTargetObject();
+ assert(target != null);
+ run("UPDATE Associations SET roKeyType=?, roKeyTarget=? WHERE roKey=?", //$NON-NLS-1$
+ assocType.getKey(), target.getKey(), assoc.getKey());
+ }
+
+ final Collection<Key> loadedClassificationKeys = ro.getLoadedClassificationKeys();
+ if (loadedClassificationKeys != null) {
+ final Set<Key> currentClassificationKeys = new HashSet<Key>();
+ for (Classification cl : asClassificationCollection(ro.getClassifications())) {
+ ClassificationAccessor.getInstance().save(getRegistryService(), cl);
+ currentClassificationKeys.add(cl.getKey());
+ loadedClassificationKeys.remove(cl.getKey());
+ }
+ ro.setLoadedClassificationKeys(currentClassificationKeys);
+ for (Key k : loadedClassificationKeys) {
+ deleteRegistryObject(k);
+ }
+ }
+
+ final Collection<Key> loadedAssociationKeys = ro.getLoadedAssociationKeys();
+ if (loadedAssociationKeys != null) {
+ final Set<Key> currentAssociationKeys = new HashSet<Key>();
+ for (Association assoc : asAssociationCollection(ro.getAssociations())) {
+ AssociationAccessor.getInstance().save(getRegistryService(), assoc);
+ currentAssociationKeys.add(assoc.getKey());
+ loadedAssociationKeys.remove(assoc.getKey());
+ }
+ ro.setLoadedAssociationKeys(currentAssociationKeys);
+ for (Key k : loadedAssociationKeys) {
+ deleteRegistryObject(k);
+ }
+ }
+ }
+
+ @Override
+ public InternationalString loadInternationalString(Key pKey, InternationalStringImpl.Type pType) throws JAXRException {
+ final InternationalString is = new InternationalStringImpl();
+ new ObjQueryUser("SELECT locale, charset, val FROM LocalizedStrings WHERE roKey=? AND lsType=?", pKey, pType) { //$NON-NLS-1$
+ @Override
+ protected void action(ResultSet pResultSet) throws JAXRException, SQLException {
+ while (pResultSet.next()) {
+ final Locale locale = Locales.getLocale(pResultSet.getString(1));
+ final String charset = pResultSet.getString(2);
+ final String val = pResultSet.getString(3);
+ final LocalizedStringImpl ls = new LocalizedStringImpl();
+ ls.setLocale(locale);
+ ls.setCharsetName(charset);
+ ls.setValue(val);
+ is.addLocalizedString(ls);
+ }
+ }
+ }.run(getRegistryService());
+ return is;
+ }
+
+ @Override
+ public void deleteRegistryObject(Key pKey) throws JAXRException {
+ Sql.run(getRegistryService(), "DELETE FROM RegistryObjects WHERE roKey=?", pKey); //$NON-NLS-1$
+ }
+
+ @Override
+ public int getSchemaVersion() throws JAXRException {
+ final String s = "SELECT version FROM DbInfo"; //$NON-NLS-1$
+ try {
+ return Sql.intQuery(getRegistryService(), s);
+ } catch (JAXRException e) {
+ Throwable t = e.getCause();
+ if (t != null && t instanceof SQLException) {
+ if (isUnknownTableError((SQLException) t)) {
+ return 0;
+ }
+ }
+ throw e;
+ }
+ }
+}
Added: labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/AssociationSourcePredicate.java
URL: http://svn.apache.org/viewvc/labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/AssociationSourcePredicate.java?rev=680187&view=auto
==============================================================================
--- labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/AssociationSourcePredicate.java (added)
+++ labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/AssociationSourcePredicate.java Sun Jul 27 14:13:00 2008
@@ -0,0 +1,43 @@
+/**
+ * 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.labs.jaxmas.registry.sql;
+
+import javax.xml.registry.infomodel.Key;
+
+
+/**
+ * A predicate for searching associations by source.
+ */
+public class AssociationSourcePredicate extends OwnerPredicate {
+ /**
+ * Creates a new instance, which searches for associations with
+ * the given source id.
+ */
+ public AssociationSourcePredicate(Key pKey) {
+ super(pKey);
+ }
+
+ /**
+ * Creates a new instance, which searches for associations with
+ * the given source id.
+ */
+ public AssociationSourcePredicate(String pKey) {
+ super(pKey);
+ }
+}
Added: labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/AssociationTargetPredicate.java
URL: http://svn.apache.org/viewvc/labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/AssociationTargetPredicate.java?rev=680187&view=auto
==============================================================================
--- labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/AssociationTargetPredicate.java (added)
+++ labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/AssociationTargetPredicate.java Sun Jul 27 14:13:00 2008
@@ -0,0 +1,55 @@
+/**
+ * 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.labs.jaxmas.registry.sql;
+
+import java.sql.SQLException;
+import java.util.List;
+
+import javax.xml.registry.JAXRException;
+import javax.xml.registry.infomodel.Key;
+
+
+/**
+ * A predicate for searching associations by target.
+ */
+public class AssociationTargetPredicate implements Predicate {
+ private final Object key;
+
+ /**
+ * Creates a new instance with the target key.
+ */
+ public AssociationTargetPredicate(Key pKey) {
+ assert(pKey != null);
+ key = pKey;
+ }
+
+ /**
+ * Creates a new instance with the target key.
+ */
+ public AssociationTargetPredicate(String pKey) {
+ assert(pKey != null);
+ key = pKey;
+ }
+
+ @Override
+ public void add(StringBuilder pBuffer, List<Object> pParameters) throws SQLException, JAXRException {
+ pBuffer.append("assoc.roKeyTarget=?"); //$NON-NLS-1$
+ pParameters.add(key);
+ }
+}
Added: labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/AssociationTypePredicate.java
URL: http://svn.apache.org/viewvc/labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/AssociationTypePredicate.java?rev=680187&view=auto
==============================================================================
--- labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/AssociationTypePredicate.java (added)
+++ labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/AssociationTypePredicate.java Sun Jul 27 14:13:00 2008
@@ -0,0 +1,63 @@
+/**
+ * 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.labs.jaxmas.registry.sql;
+
+import java.sql.SQLException;
+import java.util.Collection;
+import java.util.List;
+
+import javax.xml.registry.JAXRException;
+
+
+/**
+ * A predicate for searching associations by target.
+ */
+public class AssociationTypePredicate implements Predicate {
+ private final Collection<?> keys;
+
+ /**
+ * Creates a new instance with the target key.
+ */
+ public AssociationTypePredicate(Collection<?> pKeys) {
+ assert(pKeys != null);
+ keys = pKeys;
+ }
+
+ @Override
+ public void add(StringBuilder pBuffer, List<Object> pParameters) throws SQLException, JAXRException {
+ if (keys.size() == 1) {
+ final Object o = keys.iterator().next();
+ pBuffer.append("assoc.roKeyType=?"); //$NON-NLS-1$
+ pParameters.add(o);
+ } else {
+ pBuffer.append("("); //$NON-NLS-1$
+ boolean first = true;
+ for (Object o : keys) {
+ if (first) {
+ first = false;
+ } else {
+ pBuffer.append(" OR "); //$NON-NLS-1$
+ }
+ pBuffer.append("assoc.roKeyType=?"); //$NON-NLS-1$
+ pParameters.add(o);
+ }
+ pBuffer.append(")"); //$NON-NLS-1$
+ }
+ }
+}
Added: labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/ConnUser.java
URL: http://svn.apache.org/viewvc/labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/ConnUser.java?rev=680187&view=auto
==============================================================================
--- labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/ConnUser.java (added)
+++ labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/ConnUser.java Sun Jul 27 14:13:00 2008
@@ -0,0 +1,116 @@
+/**
+ * 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.labs.jaxmas.registry.sql;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+import javax.xml.registry.JAXRException;
+import javax.xml.registry.RegistryService;
+
+import org.apache.labs.jaxmas.registry.infomodel.RegistryServiceImpl;
+import org.apache.labs.jaxmas.registry.util.DefaultLoggerFactory;
+import org.apache.labs.jaxmas.registry.util.Logger;
+
+/**
+ * Abstract base class of an object, which performs an operation
+ * by using a database connection.
+ */
+public abstract class ConnUser<O extends Object> {
+ private static final Logger log = DefaultLoggerFactory.getInstance().newLogger(ConnUser.class);
+
+ private O result;
+
+ /**
+ * Sets the result object.
+ */
+ protected void setResult(O pResult) {
+ result = pResult;
+ }
+
+ /**
+ * Returns the result object.
+ */
+ public O getResult() {
+ return result;
+ }
+
+ /**
+ * This method must be implemented to perform the actual operation.
+ * It is called from within {@link #run(Connection)}.
+ */
+ protected abstract void action(Connection pConnection) throws JAXRException, SQLException;
+
+ /**
+ * Called to perform the database connection.
+ */
+ public void run(RegistryService pRegistryService) throws JAXRException {
+ run(((RegistryServiceImpl) pRegistryService).getConnection().getConnection());
+ }
+
+ /**
+ * Logs, that the connection user is entering the method with the given name.
+ */
+ protected void logEntering(Logger pLog, String pName) {
+ pLog.entering(pName);
+ }
+
+ /**
+ * Logs, that the connection user is leaving the method with the given name.
+ */
+ protected void logExiting(Logger pLog, String pName) {
+ pLog.exiting(pName);
+ }
+
+ /**
+ * Logs, that the connection user is leaving the method with the given name.
+ * The given result is returned.
+ */
+ protected void logExiting(Logger pLog, String pName, String pMsg) {
+ pLog.exiting(pName, pMsg);
+ }
+
+ /**
+ * Returns the result with the given index as a Long.
+ */
+ protected Long getLong(ResultSet pResultSet, int pIndex) throws SQLException {
+ long l = pResultSet.getLong(pIndex);
+ return pResultSet.wasNull() ? null : new Long(l);
+ }
+
+ /**
+ * Called to perform the database connection.
+ */
+ public void run(Connection pConnection) throws JAXRException {
+ final String mName = "run"; //$NON-NLS-1$
+ logEntering(log, mName);
+ try {
+ action(pConnection);
+ } catch (SQLException e) {
+ throw new JAXRException(e);
+ }
+ final Object o = getResult();
+ if (o == null) {
+ logExiting(log, mName);
+ } else {
+ logExiting(log, mName, String.valueOf(o));
+ }
+ }
+}
Added: labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/DbDriver.java
URL: http://svn.apache.org/viewvc/labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/DbDriver.java?rev=680187&view=auto
==============================================================================
--- labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/DbDriver.java (added)
+++ labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/DbDriver.java Sun Jul 27 14:13:00 2008
@@ -0,0 +1,108 @@
+/**
+ * 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.labs.jaxmas.registry.sql;
+
+import java.sql.SQLException;
+import java.util.Map;
+
+import javax.xml.registry.JAXRException;
+import javax.xml.registry.infomodel.InternationalString;
+import javax.xml.registry.infomodel.Key;
+import javax.xml.registry.infomodel.RegistryObject;
+import javax.xml.registry.infomodel.Slot;
+
+import org.apache.labs.jaxmas.registry.infomodel.InternationalStringImpl;
+
+
+/**
+ * Database drivers are used to hide database specific details.
+ * The intention is to support different databases by using different
+ * drivers.
+ */
+public interface DbDriver {
+ /**
+ * Creates a new id.
+ */
+ long newId(String pName) throws JAXRException;
+
+ /**
+ * Reads a registry objects slots.
+ */
+ Map<String, Slot> getSlots(RegistryObject pRegistryObject) throws JAXRException;
+
+ /**
+ * Returns the current schema version.
+ */
+ int getSchemaVersion() throws JAXRException;
+
+ /**
+ * Inserts the given object into the registry.
+ */
+ void insert(RegistryObject pObject, int pRegistryObjectType) throws JAXRException;
+
+ /**
+ * Updates the given object in the registry.
+ */
+ void update(RegistryObject pObject) throws JAXRException;
+
+ /**
+ * Loads the given {@link InternationalString} from the registry.
+ */
+ InternationalString loadInternationalString(Key pKey, InternationalStringImpl.Type pType) throws JAXRException;
+
+ /**
+ * Inserts the given {@link InternationalString} into the registry.
+ */
+ void insertInternationalString(Key pKey, InternationalStringImpl.Type pType, InternationalString pString) throws JAXRException;
+
+ /**
+ * Deletes the given {@link InternationalString} from the registry.
+ */
+ void deleteInternationalString(Key pKey, InternationalStringImpl.Type pType) throws JAXRException;
+
+ /**
+ * Updates the given {@link InternationalString} in the registry.
+ */
+ void updateInternationalString(Key pKey, InternationalStringImpl.Type pType, InternationalString pString) throws JAXRException;
+
+ /**
+ * Removes the given {@link RegistryObject} from the registry.
+ */
+ void deleteRegistryObject(Key pKey) throws JAXRException;
+
+ /**
+ * Removes the given registry objects {@link Slot slots} from the registry.
+ */
+ void deleteSlots(RegistryObject pRegistryObject) throws JAXRException;
+
+ /**
+ * Called to shutdown the registry. This is mainly useful for unit tests.
+ */
+ void shutdown() throws JAXRException;
+
+ /**
+ * Returns, whether a DROP TABLE command failed, because the table does not exist.
+ */
+ boolean isUnknownTableError(SQLException pE);
+
+ /**
+ * Returns a database property, for example the database specific CLOB type.
+ */
+ String getDbProperty(String pProperty);
+}
Added: labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/DerbyDbDriver.java
URL: http://svn.apache.org/viewvc/labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/DerbyDbDriver.java?rev=680187&view=auto
==============================================================================
--- labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/DerbyDbDriver.java (added)
+++ labs/jaxmas/trunk/JaxMas/src/main/java/org/apache/labs/jaxmas/registry/sql/DerbyDbDriver.java Sun Jul 27 14:13:00 2008
@@ -0,0 +1,72 @@
+/**
+ * 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.labs.jaxmas.registry.sql;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+
+import javax.xml.registry.JAXRException;
+import javax.xml.registry.RegistryService;
+
+import org.apache.labs.jaxmas.registry.infomodel.ConnectionImpl;
+import org.apache.labs.jaxmas.registry.infomodel.RegistryServiceImpl;
+
+
+/**
+ * Implementation of {@link DbDriver} for Apache Derby.
+ */
+public class DerbyDbDriver extends AbstractDbDriver {
+ /**
+ * Creates a new instance.
+ */
+ public DerbyDbDriver(RegistryService pRegistryService) {
+ super(pRegistryService);
+ }
+
+ @Override
+ public void shutdown() throws JAXRException {
+ try {
+ final RegistryServiceImpl rs = (RegistryServiceImpl) getRegistryService();
+ if (rs != null) {
+ final ConnectionImpl connImpl = rs.getConnection();
+ if (connImpl != null) {
+ final Connection conn = connImpl.getConnection();
+ if (conn != null) {
+ conn.close();
+ }
+ }
+ }
+ } catch (SQLException e) {
+ throw new JAXRException(e);
+ }
+ }
+
+ @Override
+ public boolean isUnknownTableError(SQLException pException) {
+ return "42Y55".equals(pException.getSQLState()); //$NON-NLS-1$
+ }
+
+ @Override
+ public String getDbProperty(String pProperty) {
+ if ("CLOB".equals(pProperty)) { //$NON-NLS-1$
+ return pProperty;
+ }
+ throw new IllegalArgumentException("Unknown property name: " + pProperty); //$NON-NLS-1$
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@labs.apache.org
For additional commands, e-mail: commits-help@labs.apache.org